-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
712 lines (677 loc) · 83 KB
/
Copy pathindex.html
File metadata and controls
712 lines (677 loc) · 83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>MaskOps — PII masking at Rust speed</title>
<meta name="description" content="A native Polars plugin that masks PII at Rust speed. Air-gapped, GDPR Art. 4(5) compliant, LATAM + EU coverage. 340× faster than Presidio."/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="https://fcarvajalbrown.github.io/MaskOps/"/>
<meta property="og:title" content="MaskOps — PII masking at Rust speed"/>
<meta property="og:description" content="Native Polars plugin for high-speed PII masking. Air-gapped, GDPR compliant, LATAM + EU coverage."/>
<meta property="og:image" content="https://fcarvajalbrown.github.io/MaskOps/assets/icon.png"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="MaskOps — PII masking at Rust speed"/>
<meta name="twitter:description" content="Native Polars plugin for high-speed PII masking. Air-gapped, GDPR compliant, LATAM + EU coverage."/>
<meta name="twitter:image" content="https://fcarvajalbrown.github.io/MaskOps/assets/icon.png"/>
<link rel="icon" type="image/svg+xml" href="assets/icon.svg"/>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "MaskOps",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Windows, Linux, macOS",
"description": "Native Polars plugin for high-speed PII masking and detection, powered by Rust. GDPR-compliant asterisk masking and FF3-1 format-preserving encryption for EU and Latin American PII.",
"url": "https://fcarvajalbrown.github.io/MaskOps/",
"downloadUrl": "https://pypi.org/project/maskops/",
"codeRepository": "https://github.com/fcarvajalbrown/MaskOps",
"programmingLanguage": ["Python", "Rust"],
"license": "https://www.mozilla.org/en-US/MPL/2.0/",
"keywords": "polars, pii, data masking, gdpr, fpe, rust, arrow, privacy"
}
</script>
<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=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
<style>
:root {
--ink: #0C1A2E;
--forest: #0F2318;
--surface: #111F35;
--border: #1E3550;
--cipher: #3DDB81;
--cipher-dim: #2BA562;
--white: #FFFFFF;
--mist: #D4E3F0;
--muted: #6B88A3;
--code-bg: #080F1C;
--ff-display: 'Space Grotesk', system-ui, sans-serif;
--ff-body: 'Inter', system-ui, sans-serif;
--ff-mono: 'JetBrains Mono', 'Cascadia Code', monospace;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body { background: var(--ink); color: var(--mist); font-family: var(--ff-body); font-size: 17px; line-height: 1.65; -webkit-font-smoothing: antialiased; }
a { color: var(--cipher); text-decoration: none; }
a:hover { text-decoration: underline; }
img, svg { display: block; }
.container { max-width: 1100px; margin: 0 auto; padding: 0 24px; }
/* Nav */
nav { position: sticky; top: 0; z-index: 100; background: rgba(12,26,46,0.92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); }
.nav-inner { display: flex; align-items: center; justify-content: space-between; height: 64px; gap: 12px; }
.nav-logo { display: flex; align-items: center; gap: 12px; font-family: var(--ff-display); font-weight: 700; font-size: 20px; color: var(--white); text-decoration: none; }
.nav-logo:hover { text-decoration: none; }
.nav-logo span { color: var(--cipher); }
.nav-right { display: flex; align-items: center; gap: 10px; }
.btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 18px; border-radius: 8px; font-family: var(--ff-display); font-weight: 600; font-size: 14px; cursor: pointer; transition: background 0.15s, color 0.15s; border: none; }
.btn-ghost { background: transparent; color: var(--mist); border: 1px solid var(--border); }
.btn-ghost:hover { background: var(--surface); color: var(--white); text-decoration: none; }
.btn-primary { background: var(--cipher); color: var(--ink); }
.btn-primary:hover { background: var(--cipher-dim); text-decoration: none; }
/* Lang switcher */
.lang-switch { display: flex; background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; padding: 3px; gap: 2px; }
.lang-btn { background: transparent; border: none; padding: 4px 9px; border-radius: 5px; font-family: var(--ff-display); font-size: 11px; font-weight: 700; color: var(--muted); cursor: pointer; transition: all 0.15s; letter-spacing: 0.04em; }
.lang-btn:hover { color: var(--white); }
.lang-btn.active { background: var(--cipher); color: var(--ink); }
/* Hero */
.hero { padding: 96px 0 72px; text-align: center; }
.hero-badge { display: inline-flex; align-items: center; gap: 8px; padding: 6px 14px; border-radius: 99px; border: 1px solid rgba(61,219,129,0.3); background: rgba(61,219,129,0.07); font-size: 13px; font-weight: 500; color: var(--cipher); margin-bottom: 28px; font-family: var(--ff-display); }
.hero-badge::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--cipher); }
h1 { font-family: var(--ff-display); font-size: clamp(40px,6vw,72px); font-weight: 700; color: var(--white); line-height: 1.1; letter-spacing: -0.03em; max-width: 820px; margin: 0 auto 20px; }
h1 em { font-style: normal; color: var(--cipher); }
.hero-sub { font-size: clamp(16px,2vw,20px); color: var(--muted); max-width: 580px; margin: 0 auto 40px; line-height: 1.6; }
.hero-actions { display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap; margin-bottom: 64px; }
.install-pill { display: inline-flex; align-items: center; gap: 10px; background: var(--code-bg); border: 1px solid var(--border); border-radius: 10px; padding: 10px 20px; font-family: var(--ff-mono); font-size: 15px; color: var(--cipher); cursor: pointer; transition: border-color 0.15s; user-select: none; }
.install-pill:hover { border-color: var(--cipher); }
.copy-icon { color: var(--muted); font-size: 12px; font-family: var(--ff-body); }
.copy-icon.copied { color: var(--cipher); }
.terminal { max-width: 720px; margin: 0 auto; background: var(--code-bg); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; text-align: left; }
.terminal-bar { display: flex; align-items: center; gap: 7px; padding: 12px 16px; background: rgba(255,255,255,0.03); border-bottom: 1px solid var(--border); }
.dot { width: 12px; height: 12px; border-radius: 50%; }
.dot-r { background: #FF5F57; } .dot-y { background: #FEBC2E; } .dot-g { background: #28C840; }
.terminal-body { padding: 20px 24px; font-family: var(--ff-mono); font-size: 14px; line-height: 1.8; }
.t-kw { color: #79B8FF; } .t-fn { color: #B392F0; } .t-str { color: #9ECBFF; } .t-cm { color: var(--muted); } .t-out { color: var(--cipher); }
/* Stats */
.stats { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); background: var(--surface); }
.stats-inner { display: grid; grid-template-columns: repeat(4,1fr); text-align: center; }
.stat-item { padding: 28px 16px; border-right: 1px solid var(--border); }
.stat-item:last-child { border-right: none; }
.stat-value { font-family: var(--ff-display); font-size: 32px; font-weight: 700; color: var(--cipher); line-height: 1.1; }
.stat-label { font-size: 13px; color: var(--muted); margin-top: 4px; font-weight: 500; }
/* Sections */
section { padding: 88px 0; }
section.alt { background: var(--surface); }
.section-label { font-family: var(--ff-display); font-size: 12px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--cipher); margin-bottom: 12px; }
h2 { font-family: var(--ff-display); font-size: clamp(28px,4vw,44px); font-weight: 700; color: var(--white); line-height: 1.15; letter-spacing: -0.025em; margin-bottom: 16px; }
.section-desc { font-size: 18px; color: var(--muted); max-width: 540px; margin-bottom: 56px; }
/* Features */
.features-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 20px; }
.feature-card { background: var(--forest); border: 1px solid var(--border); border-radius: 14px; padding: 32px; transition: border-color 0.2s; }
.feature-card:hover { border-color: rgba(61,219,129,0.4); }
.feature-icon { width: 44px; height: 44px; background: rgba(61,219,129,0.1); border-radius: 10px; display: flex; align-items: center; justify-content: center; margin-bottom: 20px; font-size: 22px; }
h3 { font-family: var(--ff-display); font-size: 18px; font-weight: 600; color: var(--white); margin-bottom: 10px; }
.feature-card p { font-size: 15px; color: var(--muted); line-height: 1.6; }
/* Code section */
.code-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: start; }
.code-copy { padding-top: 8px; }
.code-copy ul { list-style: none; margin-top: 24px; }
.code-copy li { display: flex; align-items: flex-start; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 15px; color: var(--muted); }
.code-copy li:last-child { border-bottom: none; }
.code-copy li::before { content: '→'; color: var(--cipher); font-weight: 600; flex-shrink: 0; margin-top: 1px; }
.code-block { background: var(--code-bg); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; }
.code-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 18px; border-bottom: 1px solid var(--border); background: rgba(255,255,255,0.02); font-family: var(--ff-mono); font-size: 12px; color: var(--muted); }
pre { padding: 24px; font-family: var(--ff-mono); font-size: 13.5px; line-height: 1.85; overflow-x: auto; color: var(--mist); }
.k { color: #79B8FF; } .fn { color: #B392F0; } .s { color: #9ECBFF; } .c { color: #4B6070; } .n { color: #3DDB81; }
.fpe-callout { background: rgba(61,219,129,0.06); border: 1px solid rgba(61,219,129,0.2); border-radius: 14px; padding: 32px 36px; margin-top: 32px; }
.fpe-callout h3 { font-size: 20px; margin-bottom: 10px; }
.fpe-callout p { color: var(--muted); font-size: 15px; max-width: 680px; }
.art { color: var(--cipher); font-weight: 600; }
/* Compliance */
.compliance-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 48px; }
.compliance-card { background: var(--forest); border: 1px solid var(--border); border-radius: 14px; padding: 32px; }
.compliance-card h3 { font-size: 16px; margin-bottom: 16px; display: flex; align-items: center; gap: 10px; }
.tag { display: inline-block; padding: 2px 9px; border-radius: 5px; font-size: 11px; font-weight: 600; font-family: var(--ff-display); background: rgba(61,219,129,0.12); color: var(--cipher); letter-spacing: 0.05em; }
.compliance-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid rgba(30,53,80,0.6); font-size: 14px; }
.compliance-row:last-child { border-bottom: none; }
.compliance-row .flag { font-size: 18px; }
.compliance-row .law { color: var(--muted); font-size: 12px; }
.compliance-row .status { margin-left: auto; }
.done { color: var(--cipher); font-size: 13px; font-weight: 600; }
/* Pricing */
.pricing-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 20px; margin-top: 52px; align-items: start; }
.pricing-card { background: var(--forest); border: 1px solid var(--border); border-radius: 16px; padding: 32px; position: relative; transition: border-color 0.2s; }
.pricing-card:hover { border-color: rgba(61,219,129,0.35); }
.pricing-card.featured { border-color: var(--cipher); background: linear-gradient(160deg,rgba(61,219,129,0.07) 0%,var(--forest) 60%); }
.pricing-badge { position: absolute; top: -13px; left: 50%; transform: translateX(-50%); background: var(--cipher); color: var(--ink); font-family: var(--ff-display); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; padding: 4px 14px; border-radius: 99px; white-space: nowrap; }
.pricing-tier { font-family: var(--ff-display); font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 12px; }
.pricing-price { display: flex; align-items: baseline; gap: 4px; margin-bottom: 6px; }
.pricing-currency { font-family: var(--ff-display); font-size: 18px; font-weight: 600; color: var(--muted); margin-top: 4px; }
.pricing-amount { font-family: var(--ff-display); font-size: 52px; font-weight: 700; color: var(--white); line-height: 1; letter-spacing: -0.03em; }
.pricing-period { font-size: 14px; color: var(--muted); margin-bottom: 8px; }
.pricing-when { font-size: 13px; color: var(--cipher); font-style: italic; margin-bottom: 24px; padding-bottom: 24px; border-bottom: 1px solid var(--border); }
.pricing-features { list-style: none; }
.pricing-features li { display: flex; align-items: flex-start; gap: 10px; padding: 7px 0; font-size: 14px; color: var(--mist); line-height: 1.5; }
.pricing-features li::before { content: '✓'; color: var(--cipher); font-weight: 700; flex-shrink: 0; margin-top: 1px; }
.pricing-features li.dim { color: var(--muted); }
.pricing-features li.dim::before { color: var(--border); }
.pricing-cta { display: block; margin-top: 28px; text-align: center; padding: 11px 20px; border-radius: 9px; font-family: var(--ff-display); font-weight: 600; font-size: 14px; border: 1px solid var(--border); color: var(--mist); transition: all 0.15s; }
.pricing-cta:hover { background: var(--surface); color: var(--white); text-decoration: none; }
.pricing-card.featured .pricing-cta { background: var(--cipher); color: var(--ink); border-color: var(--cipher); }
.pricing-card.featured .pricing-cta:hover { background: var(--cipher-dim); border-color: var(--cipher-dim); }
.pricing-pilot { margin-top: 28px; background: rgba(61,219,129,0.05); border: 1px solid rgba(61,219,129,0.15); border-radius: 12px; padding: 20px 28px; display: flex; align-items: center; gap: 20px; }
.pricing-pilot-label { font-family: var(--ff-display); font-weight: 700; font-size: 13px; color: var(--cipher); text-transform: uppercase; letter-spacing: 0.08em; white-space: nowrap; }
.pricing-pilot p { font-size: 14px; color: var(--muted); line-height: 1.55; }
.pricing-pilot p strong { color: var(--mist); font-weight: 500; }
/* Install */
.install-block { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; align-items: start; }
.step-list { list-style: none; counter-reset: steps; }
.step-list li { display: flex; gap: 16px; padding: 18px 0; border-bottom: 1px solid var(--border); }
.step-list li:last-child { border-bottom: none; }
.step-num { flex-shrink: 0; width: 28px; height: 28px; border-radius: 50%; background: rgba(61,219,129,0.12); border: 1px solid rgba(61,219,129,0.3); color: var(--cipher); font-family: var(--ff-display); font-weight: 700; font-size: 13px; display: flex; align-items: center; justify-content: center; margin-top: 2px; }
.step-content strong { display: block; color: var(--white); font-family: var(--ff-display); font-weight: 600; margin-bottom: 2px; }
.step-content code { font-family: var(--ff-mono); font-size: 13px; color: var(--cipher); background: var(--code-bg); padding: 1px 6px; border-radius: 4px; }
/* Contact */
.contact-cards { display: flex; justify-content: center; gap: 20px; flex-wrap: wrap; }
.contact-card { display: flex; flex-direction: column; align-items: center; gap: 8px; background: var(--forest); border: 1px solid var(--border); border-radius: 16px; padding: 32px 48px; transition: border-color 0.2s; color: inherit; text-decoration: none; min-width: 240px; }
.contact-card:hover { border-color: var(--cipher); text-decoration: none; }
.contact-icon { font-size: 28px; }
.contact-type { font-family: var(--ff-display); font-size: 12px; font-weight: 600; color: var(--muted); letter-spacing: 0.1em; text-transform: uppercase; }
.contact-value { font-family: var(--ff-mono); font-size: 16px; color: var(--cipher); font-weight: 500; }
/* Footer */
footer { border-top: 1px solid var(--border); padding: 40px 0; text-align: center; }
.footer-logo { display: flex; align-items: center; justify-content: center; gap: 10px; font-family: var(--ff-display); font-weight: 700; font-size: 18px; color: var(--white); margin-bottom: 16px; }
.footer-logo span { color: var(--cipher); }
.footer-links { display: flex; align-items: center; justify-content: center; gap: 24px; font-size: 14px; color: var(--muted); margin-bottom: 20px; flex-wrap: wrap; }
.footer-links a { color: var(--muted); }
.footer-links a:hover { color: var(--cipher); text-decoration: none; }
.footer-copy { font-size: 13px; color: var(--muted); opacity: 0.6; }
/* Responsive */
@media (max-width: 800px) {
.features-grid, .code-layout, .compliance-grid, .pricing-grid, .install-block { grid-template-columns: 1fr; }
.stats-inner { grid-template-columns: repeat(2,1fr); }
.stat-item:nth-child(2) { border-right: none; }
.stat-item:nth-child(3) { border-right: 1px solid var(--border); border-top: 1px solid var(--border); }
.stat-item:nth-child(4) { border-top: 1px solid var(--border); border-right: none; }
.pricing-pilot { flex-direction: column; }
.nav-right { gap: 6px; }
.lang-btn { padding: 4px 7px; }
}
</style>
</head>
<body>
<nav>
<div class="container">
<div class="nav-inner">
<a href="#" class="nav-logo">
<img src="assets/icon.svg" width="36" height="36" alt="MaskOps icon"/>
Mask<span>Ops</span>
</a>
<div class="nav-right">
<div class="lang-switch">
<button class="lang-btn" onclick="setLang('en')">EN</button>
<button class="lang-btn active" onclick="setLang('es')">ES</button>
<button class="lang-btn" onclick="setLang('pt-BR')">PT</button>
<button class="lang-btn" onclick="setLang('de')">DE</button>
<button class="lang-btn" onclick="setLang('fr')">FR</button>
</div>
<a href="https://github.com/fcarvajalbrown/MaskOps" class="btn btn-ghost" target="_blank" rel="noopener">
<svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
GitHub
</a>
<a href="https://pypi.org/project/maskops/" class="btn btn-primary" target="_blank" rel="noopener">PyPI →</a>
</div>
</div>
</div>
</nav>
<!-- Hero -->
<section class="hero">
<div class="container">
<div class="hero-badge" data-i18n="hero.badge">Open-source · MPL-2.0 · v2.0.0</div>
<h1 data-i18n-html="hero.h1">PII masking at <em>Rust speed</em>.<br/>Air-gapped. GDPR-ready.</h1>
<p class="hero-sub" data-i18n="hero.sub">A native Polars plugin that masks sensitive data inside your pipeline — zero rows leave your infrastructure, zero Python overhead per row.</p>
<div class="hero-actions">
<button class="install-pill" onclick="copyInstall(this)">
<span>$ pip install maskops</span>
<span class="copy-icon" id="copy-label" data-i18n="hero.copy">copy</span>
</button>
<a href="https://github.com/fcarvajalbrown/MaskOps" class="btn btn-ghost" target="_blank" rel="noopener" data-i18n="hero.github_btn">View on GitHub →</a>
</div>
<div class="terminal">
<div class="terminal-bar">
<div class="dot dot-r"></div><div class="dot dot-y"></div><div class="dot dot-g"></div>
</div>
<div class="terminal-body">
<div><span class="t-kw">import</span> polars <span class="t-kw">as</span> pl</div>
<div><span class="t-kw">import</span> <span class="t-fn">maskops</span></div>
<div> </div>
<div><span class="t-cm"># load 1 million customer records</span></div>
<div>df = pl.<span class="t-fn">read_csv</span>(<span class="t-str">"customers.csv"</span>)</div>
<div> </div>
<div><span class="t-cm"># mask PII — stays in your pipeline, zero network calls</span></div>
<div>masked = df.<span class="t-fn">with_columns</span>(</div>
<div> maskops.<span class="t-fn">mask_pii</span>(<span class="t-str">"rut"</span>),</div>
<div> maskops.<span class="t-fn">mask_pii</span>(<span class="t-str">"email"</span>),</div>
<div> maskops.<span class="t-fn">mask_pii</span>(<span class="t-str">"credit_card"</span>),</div>
<div>)</div>
<div> </div>
<div><span class="t-cm"># 12.345.678-9 → **.***.***.***-*</span></div>
<div><span class="t-cm"># user@acme.com → u***@a***.com</span></div>
<div><span class="t-cm"># 4532 0151 ... → **** **** **** ****</span></div>
<div> </div>
<div><span class="t-out">✓ 1,000,000 rows masked in 2.9s</span></div>
</div>
</div>
</div>
</section>
<!-- Stats -->
<div class="stats">
<div class="container">
<div class="stats-inner">
<div class="stat-item"><div class="stat-value">340×</div><div class="stat-label" data-i18n="stats.faster">faster than Presidio</div></div>
<div class="stat-item"><div class="stat-value">1.7s</div><div class="stat-label" data-i18n="stats.speed">for 1 million rows</div></div>
<div class="stat-item"><div class="stat-value">100%</div><div class="stat-label" data-i18n="stats.air">air-gapped</div></div>
<div class="stat-item"><div class="stat-value">GDPR</div><div class="stat-label" data-i18n="stats.gdpr">Art. 4(5) compliant</div></div>
</div>
<p data-i18n-html="stats.note" style="text-align:center;margin:18px auto 0;max-width:700px;font-size:12px;color:var(--muted);line-height:1.5">Like-for-like structured-PII masking (email, phone, IP, IBAN, card) vs Presidio on 1M rows. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Methodology & full numbers →</a></p>
</div>
</div>
<!-- Features -->
<section>
<div class="container">
<div class="section-label" data-i18n="feat.label">Why MaskOps</div>
<h2 data-i18n-html="feat.h2">Everything your data pipeline needs.<br/>Nothing it doesn't.</h2>
<p class="section-desc" data-i18n="feat.desc">Built for engineers who can't afford cloud vendors in their data path — or simply don't want them there.</p>
<div class="features-grid">
<div class="feature-card"><div class="feature-icon">🔒</div><h3 data-i18n="feat.1.title">Air-Gapped by Design</h3><p data-i18n="feat.1.desc">No network calls, ever. Runs offline, in CI, behind firewalls, inside VPCs. Your data never touches an external server — by architecture, not by policy.</p></div>
<div class="feature-card"><div class="feature-icon">🔑</div><h3 data-i18n="feat.2.title">Format-Preserving Encryption</h3><p data-i18n="feat.2.desc">FPE mode (FF3-1 AES-256) produces reversible pseudonymization under GDPR Art. 4(5). Same format, different value, decryptable only with your key — which MaskOps never sees.</p></div>
<div class="feature-card"><div class="feature-icon">🌎</div><h3 data-i18n="feat.3.title">LATAM + EU Coverage</h3><p data-i18n="feat.3.desc">RUT (Chile), CPF (Brazil), CURP (Mexico), IBAN, VAT, EU national IDs, email, phone, IP, credit cards. Built for the regulatory landscape of today's data-driven business.</p></div>
<div class="feature-card"><div class="feature-icon">⚡</div><h3 data-i18n="feat.4.title">Native Polars Plugin</h3><p data-i18n="feat.4.desc">Compiles to a native .so that Polars loads as an expression plugin. Zero Python overhead per row. Parallelism via Rayon, automatic.</p></div>
<div class="feature-card"><div class="feature-icon">🔍</div><h3 data-i18n="feat.5.title">Detection + Masking</h3><p data-i18n="feat.5.desc">contains_pii tells you if a column has PII before you mask it. Useful for audits, schema validation, and compliance checks in existing pipelines.</p></div>
<div class="feature-card"><div class="feature-icon">📋</div><h3 data-i18n="feat.6.title">Audit-Ready</h3><p data-i18n="feat.6.desc">Each pattern declares its regulation, compliance category, and validation logic. Suitable for CMF NCG 311, ISO 27001, and SOC 2 auditor documentation.</p></div>
</div>
</div>
</section>
<!-- Code / FPE -->
<section class="alt">
<div class="container">
<div class="code-layout">
<div class="code-copy">
<div class="section-label" data-i18n="code.label">FPE Mode</div>
<h2 data-i18n="code.h2">Reversible pseudonymization. Your key, your data.</h2>
<ul>
<li data-i18n="code.li1">The FPE key never leaves your infrastructure — MaskOps never sees it</li>
<li data-i18n="code.li2">Masked values keep the original format: a RUT stays a valid-looking RUT</li>
<li data-i18n="code.li3">Produce a real record in 10 seconds for a regulator audit</li>
<li data-i18n="code.li4">GDPR Art. 4(5) compliant pseudonymization — lighter regulatory burden than raw PII</li>
</ul>
</div>
<div>
<div class="code-block">
<div class="code-header"><span>fpe_example.py</span><span>Python</span></div>
<pre><span class="k">import</span> polars <span class="k">as</span> pl
<span class="k">import</span> <span class="fn">maskops</span>
<span class="c"># 32-byte key + 7-byte tweak — stays with you</span>
key = pl.<span class="fn">lit</span>(bytes.<span class="fn">fromhex</span>(<span class="s">"a1b2c3..."</span>))
tweak = pl.<span class="fn">lit</span>(<span class="s">b"season1"</span>)
df = pl.<span class="fn">read_parquet</span>(<span class="s">"transactions.parquet"</span>)
<span class="c"># pseudonymize — format preserved, reversible</span>
masked = df.<span class="fn">with_columns</span>(
maskops.<span class="fn">mask_pii_fpe</span>(<span class="s">"rut"</span>, key, tweak),
maskops.<span class="fn">mask_pii_fpe</span>(<span class="s">"phone"</span>, key, tweak),
)
<span class="c"># 12.345.678-9 → 87.162.043-5 (reversible)</span>
<span class="c"># +56 9 8765 4321 → +56 9 2341 8907</span>
</pre>
</div>
</div>
</div>
<div class="fpe-callout">
<h3 data-i18n="fpe.title">What GDPR Art. 4(5) actually means for your team</h3>
<p data-i18n-html="fpe.desc">Pseudonymized data — where re-identification requires a separately-held key — still falls under GDPR, but with <span class="art">significantly reduced risk and lighter compliance burden</span>. Under Art. 32, pseudonymization is an explicitly recommended security measure. MaskOps FPE mode is a direct technical implementation of that requirement. The key stays with you. The regulator is satisfied. Your analytics team keeps working.</p>
<p data-i18n-html="fpe.note" style="margin-top:18px;padding-top:18px;border-top:1px solid rgba(61,219,129,0.2);font-size:13px;color:var(--muted)">On the cryptography: FF3-1 is proposed for deprecation in NIST's draft SP 800-38G Rev.1. We document the status, our mitigations, and the FF1 migration path openly — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">read the security note →</a></p>
</div>
</div>
</section>
<!-- Compliance -->
<section>
<div class="container">
<div class="section-label" data-i18n="comp.label">Regulatory Coverage</div>
<h2 data-i18n="comp.h2">Built for the laws your clients actually face.</h2>
<p class="section-desc" data-i18n="comp.desc">PII identifiers matched to the regulation that makes them sensitive.</p>
<div class="compliance-grid">
<div class="compliance-card">
<h3>🇪🇺 European Union <span class="tag">GDPR</span></h3>
<div class="compliance-row"><span>IBAN — bank identifiers</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>VAT numbers</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>NIN (UK), Personalausweis (DE)</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>NIR (FR), Codice Fiscale (IT)</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>PESEL (PL), BSN (NL), personnummer (SE)</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>Email, phone, IP address</span><span class="status done">✓</span></div>
<div class="compliance-row"><span>Credit cards</span><span class="status done">✓</span></div>
</div>
<div class="compliance-card">
<h3>🌎 Latin America</h3>
<div class="compliance-row"><span class="flag">🇨🇱</span><span>RUT (Chile) <span class="law">Ley 19.628 / 21.719</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇧🇷</span><span>CPF (Brazil) <span class="law">LGPD</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇲🇽</span><span>CURP (Mexico) <span class="law">LFPDPPP</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇦🇷</span><span>DNI (Argentina) <span class="law">Ley 25.326</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇨🇴</span><span>CC / NIT (Colombia) <span class="law">Ley 1581</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇪🇨</span><span>Cédula (Ecuador) <span class="law">LOPDP</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇵🇪</span><span>DNI (Peru) <span class="law">Ley 29733</span></span><span class="status done">✓</span></div>
<div class="compliance-row"><span class="flag">🇺🇾</span><span>Cédula (Uruguay) <span class="law">Ley 18.331</span></span><span class="status done">✓</span></div>
</div>
</div>
</div>
</section>
<!-- Pricing -->
<section class="alt">
<div class="container">
<div class="section-label" data-i18n="price.label">Retainer Plans</div>
<h2 data-i18n="price.h2">Simple, transparent pricing.</h2>
<p class="section-desc" data-i18n="price.desc">Start with a paid pilot on your own data, with the fee credited in full when you convert. No procurement committees, no annual lock-in.</p>
<p data-i18n="price.anchor" style="text-align:center;max-width:680px;margin:-24px auto 0;font-size:14px;color:var(--cipher);font-style:italic">One Ley 21.719 fine can reach about USD 1.5M. One Brazilian finance-sector breach averages R$8.9M. A retainer is a rounding error against either.</p>
<p data-i18n="price.oss" style="text-align:center;max-width:720px;margin:20px auto 0;font-size:13px;color:var(--muted);line-height:1.6">MaskOps itself is 100% open source under MPL-2.0 — every pattern, the CLI, and the policy engine. Paid plans are support and compliance services, not a different or closed version of the software.</p>
<div class="pricing-grid">
<div class="pricing-card">
<div class="pricing-tier" data-i18n="price.launch.tier">Launch</div>
<div class="pricing-price"><span class="pricing-currency">USD</span><span class="pricing-amount">200</span></div>
<div class="pricing-period">/ month</div>
<div class="pricing-when" data-i18n-html="price.launch.when">First 10 clients · <strong style="color:var(--cipher)">rate locked forever</strong></div>
<ul class="pricing-features">
<li data-i18n="price.f.license">Commercial support for the full open-source engine</li>
<li data-i18n="price.f.updates">Pattern updates within 2 weeks of law changes</li>
<li data-i18n="price.f.monitoring">Monthly regulatory monitoring email</li>
<li data-i18n="price.f.support">Priority support — 24h response</li>
<li data-i18n="price.f.upgrades">Version upgrade compatibility</li>
<li class="dim" data-i18n="price.f.auditor">Auditor-ready documentation (CMF, SOC 2, ISO 27001)</li>
<li class="dim" data-i18n="price.f.privacy">Privacy policy alignment review</li>
<li class="dim" data-i18n="price.f.gdpr_layer">GDPR layer for multinational data</li>
</ul>
<a href="#contact" class="pricing-cta" data-i18n="price.cta">Get in touch →</a>
<p style="margin-top:14px;font-size:12px;color:var(--muted);text-align:center;line-height:1.5">
<span data-i18n="price.launch.note1">Available to the first 10 clients only.</span><br/>
<span data-i18n="price.launch.note2">Your rate never increases — ever.</span>
</p>
</div>
<div class="pricing-card featured">
<div class="pricing-badge" data-i18n="price.standard.badge">Most popular</div>
<div class="pricing-tier" data-i18n="price.standard.tier">Standard</div>
<div class="pricing-price"><span class="pricing-currency">USD</span><span class="pricing-amount">400</span></div>
<div class="pricing-period">/ month</div>
<div class="pricing-when" data-i18n="price.standard.when">New clients after the first 10</div>
<ul class="pricing-features">
<li data-i18n="price.f.license">Commercial support for the full open-source engine</li>
<li data-i18n="price.f.updates">Pattern updates within 2 weeks of law changes</li>
<li data-i18n="price.f.monitoring">Monthly regulatory monitoring email</li>
<li data-i18n="price.f.support">Priority support — 24h response</li>
<li data-i18n="price.f.upgrades">Version upgrade compatibility</li>
<li data-i18n="price.f.auditor">Auditor-ready documentation (CMF, SOC 2, ISO 27001)</li>
<li data-i18n="price.f.privacy">Privacy policy alignment review</li>
<li class="dim" data-i18n="price.f.gdpr_layer">GDPR layer for multinational data</li>
</ul>
<a href="#contact" class="pricing-cta" data-i18n="price.cta">Get in touch →</a>
</div>
<div class="pricing-card">
<div class="pricing-tier" data-i18n="price.dual.tier">Dual-Jurisdiction</div>
<div class="pricing-price"><span class="pricing-currency">USD</span><span class="pricing-amount">700</span></div>
<div class="pricing-period">/ month</div>
<div class="pricing-when" data-i18n="price.dual.when">Multinationals & GDPR subsidiaries</div>
<ul class="pricing-features">
<li data-i18n="price.f.everything">Everything in Standard</li>
<li data-i18n="price.f.gdpr_eu">GDPR layer — EU pattern set configured (IBAN, VAT, EU national IDs)</li>
<li data-i18n="price.f.cross">Cross-jurisdiction compliance mapping (Chile + EU)</li>
<li data-i18n="price.f.doc_dual">Auditor documentation for EU DPA & Chilean CPDP</li>
<li data-i18n="price.f.privacy_dual">Privacy policy alignment for dual-jurisdiction processing</li>
<li data-i18n="price.f.dedicated">Dedicated support for auditor & legal team questions</li>
</ul>
<a href="#contact" class="pricing-cta" data-i18n="price.cta">Get in touch →</a>
</div>
</div>
<div class="pricing-pilot" style="border-color:rgba(61,219,129,0.3)">
<div class="pricing-pilot-label" data-i18n="price.ent.label">Enterprise support</div>
<p data-i18n-html="price.ent.text"><strong>Request pricing.</strong> Hands-on help deploying MaskOps air-gapped and on-prem, guaranteed-response support, compliance reporting, and dedicated integration support for fintechs embedding it into their pipelines. Priced to your deployment and anchored to the exposure it removes, not a per-seat number.</p>
<a href="#contact" class="pricing-cta" data-i18n="price.ent.cta" style="white-space:nowrap;align-self:center;margin-top:0">Request pricing →</a>
</div>
<div class="pricing-pilot">
<div class="pricing-pilot-label" data-i18n="price.pilot.label">Paid pilot</div>
<p data-i18n-html="price.pilot.text"><strong>Start on your own data, not a demo.</strong> A fixed 60 to 90 day paid pilot: MaskOps integrated into one Polars pipeline, masking rules configured for your PII, and one success test agreed up front (mask 1M rows in under 3 seconds, pass an auditor manifest review). The fee is credited in full when you convert, and refunded if the test fails. Your only risk is time.</p>
</div>
</div>
</section>
<!-- Install -->
<section>
<div class="container">
<div class="section-label" data-i18n="install.label">Get Started</div>
<h2 data-i18n="install.h2">Up and running in 60 seconds.</h2>
<div class="install-block">
<ol class="step-list">
<li><div class="step-num">1</div><div class="step-content"><strong data-i18n="install.s1.title">Install from PyPI</strong><span data-i18n="install.s1.desc">Requires Python 3.9+, Polars 0.46+</span><br/><code>pip install maskops</code></div></li>
<li><div class="step-num">2</div><div class="step-content"><strong data-i18n="install.s2.title">Import and mask</strong><span data-i18n="install.s2.desc">No configuration needed for asterisk masking</span><br/><code>import maskops</code></div></li>
<li><div class="step-num">3</div><div class="step-content"><strong data-i18n="install.s3.title">For FPE mode</strong><span data-i18n="install.s3.desc">Generate a 32-byte key and 7-byte tweak — store them separately from your data</span></div></li>
<li><div class="step-num">4</div><div class="step-content"><strong data-i18n="install.s4.title">Enterprise / compliance retainer</strong><span data-i18n-html="install.s4.desc">Need CMF NCG 311, ISO 27001, or GDPR auditor docs? <a href="#contact">Reach out directly.</a></span></div></li>
</ol>
<div class="code-block">
<div class="code-header"><span>quick_start.py</span><span>Python</span></div>
<pre><span class="k">import</span> polars <span class="k">as</span> pl
<span class="k">import</span> <span class="fn">maskops</span>
df = pl.<span class="fn">DataFrame</span>({
<span class="s">"rut"</span>: [<span class="s">"12.345.678-9"</span>, <span class="s">"9.876.543-2"</span>],
<span class="s">"email"</span>: [<span class="s">"user@company.cl"</span>, <span class="s">"admin@corp.io"</span>],
<span class="s">"phone"</span>: [<span class="s">"+56987654321"</span>, <span class="s">"+5621234567"</span>],
})
masked = df.<span class="fn">with_columns</span>(
maskops.<span class="fn">mask_pii</span>(<span class="s">"rut"</span>),
maskops.<span class="fn">mask_pii</span>(<span class="s">"email"</span>),
maskops.<span class="fn">mask_pii</span>(<span class="s">"phone"</span>),
)
</pre>
</div>
</div>
</div>
</section>
<!-- Contact -->
<section class="alt" id="contact">
<div class="container" style="text-align:center">
<div class="section-label" data-i18n="contact.label">Contact</div>
<h2 data-i18n="contact.h2">Let's talk.</h2>
<p class="section-desc" style="margin:0 auto 48px" data-i18n="contact.sub">Book a 15-minute call to discuss a pilot. No procurement process, no deck.</p>
<div class="contact-cards">
<a href="https://wa.me/56932364993" class="contact-card" target="_blank" rel="noopener">
<div class="contact-icon">📱</div>
<div class="contact-type" data-i18n="contact.phone">WhatsApp / Phone</div>
<div class="contact-value">+56 9 323 64 993</div>
</a>
<a href="mailto:fcarvajalbrown@gmail.com" class="contact-card">
<div class="contact-icon">✉️</div>
<div class="contact-type" data-i18n="contact.email">Email</div>
<div class="contact-value">fcarvajalbrown@gmail.com</div>
</a>
</div>
</div>
</section>
<!-- Footer -->
<footer>
<div class="container">
<div class="footer-logo"><img src="assets/icon.svg" width="28" height="28" alt=""/>Mask<span>Ops</span></div>
<div class="footer-links">
<a href="https://github.com/fcarvajalbrown/MaskOps" target="_blank" rel="noopener">GitHub</a>
<a href="https://pypi.org/project/maskops/" target="_blank" rel="noopener">PyPI</a>
<a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/CHANGELOG.md" target="_blank" rel="noopener" data-i18n="footer.changelog">Changelog</a>
<a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/ROADMAP.md" target="_blank" rel="noopener" data-i18n="footer.roadmap">Roadmap</a>
<a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/SECURITY.md" target="_blank" rel="noopener" data-i18n="footer.security">Security</a>
<a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/LICENSE" target="_blank" rel="noopener">MPL-2.0</a>
</div>
<p class="footer-copy" data-i18n="footer.copy">© 2026 Felipe Carvajal Brown · MaskOps is open-source under Mozilla Public License 2.0</p>
</div>
</footer>
<script>
const T = {
en: {
'hero.badge':'Open-source · MPL-2.0 · v2.0.0','hero.h1':'PII masking at <em>Rust speed</em>.<br/>Air-gapped. GDPR-ready.','hero.sub':'A native Polars plugin that masks sensitive data inside your pipeline — zero rows leave your infrastructure, zero Python overhead per row.','hero.copy':'copy','hero.copied':'copied!','hero.github_btn':'View on GitHub →',
'stats.faster':'faster than Presidio','stats.speed':'for 1 million rows','stats.air':'air-gapped','stats.gdpr':'Art. 4(5) compliant','stats.note':'Like-for-like structured-PII masking (email, phone, IP, IBAN, card) vs Presidio on 1M rows. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Methodology & full numbers →</a>',
'feat.label':'Why MaskOps','feat.h2':'Everything your data pipeline needs.<br/>Nothing it doesn\'t.','feat.desc':'Built for engineers who can\'t afford cloud vendors in their data path — or simply don\'t want them there.',
'feat.1.title':'Air-Gapped by Design','feat.1.desc':'No network calls, ever. Runs offline, in CI, behind firewalls, inside VPCs. Your data never touches an external server — by architecture, not by policy.',
'feat.2.title':'Format-Preserving Encryption','feat.2.desc':'FPE mode (FF3-1 AES-256) produces reversible pseudonymization under GDPR Art. 4(5). Same format, different value, decryptable only with your key — which MaskOps never sees.',
'feat.3.title':'LATAM + EU Coverage','feat.3.desc':'RUT (Chile), CPF (Brazil), CURP (Mexico), IBAN, VAT, EU national IDs, email, phone, IP, credit cards. Built for the regulatory landscape of today\'s data-driven business.',
'feat.4.title':'Native Polars Plugin','feat.4.desc':'Compiles to a native .so that Polars loads as an expression plugin. Zero Python overhead per row. Parallelism via Rayon, automatic.',
'feat.5.title':'Detection + Masking','feat.5.desc':'contains_pii tells you if a column has PII before you mask it. Useful for audits, schema validation, and compliance checks in existing pipelines.',
'feat.6.title':'Audit-Ready','feat.6.desc':'Each pattern declares its regulation, compliance category, and validation logic. Suitable for CMF NCG 311, ISO 27001, and SOC 2 auditor documentation.',
'code.label':'FPE Mode','code.h2':'Reversible pseudonymization. Your key, your data.',
'code.li1':'The FPE key never leaves your infrastructure — MaskOps never sees it','code.li2':'Masked values keep the original format: a RUT stays a valid-looking RUT','code.li3':'Produce a real record in 10 seconds for a regulator audit','code.li4':'GDPR Art. 4(5) compliant pseudonymization — lighter regulatory burden than raw PII',
'fpe.title':'What GDPR Art. 4(5) actually means for your team','fpe.desc':'Pseudonymized data — where re-identification requires a separately-held key — still falls under GDPR, but with <span class="art">significantly reduced risk and lighter compliance burden</span>. Under Art. 32, pseudonymization is an explicitly recommended security measure. MaskOps FPE mode is a direct technical implementation of that requirement. The key stays with you. The regulator is satisfied. Your analytics team keeps working.',
'fpe.note':'On the cryptography: FF3-1 is proposed for deprecation in NIST\'s draft SP 800-38G Rev.1. We document the status, our mitigations, and the FF1 migration path openly — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">read the security note →</a>',
'comp.label':'Regulatory Coverage','comp.h2':'Built for the laws your clients actually face.','comp.desc':'PII identifiers matched to the regulation that makes them sensitive.',
'price.label':'Retainer Plans','price.h2':'Simple, transparent pricing.','price.desc':'Start with a paid pilot on your own data, with the fee credited in full when you convert. No procurement committees, no annual lock-in.','price.anchor':'One Ley 21.719 fine can reach about USD 1.5M. One Brazilian finance-sector breach averages R$8.9M. A retainer is a rounding error against either.','price.oss':'MaskOps itself is 100% open source under MPL-2.0 — every pattern, the CLI, and the policy engine. Paid plans are support and compliance services, not a different or closed version of the software.',
'price.launch.tier':'Launch','price.launch.when':'First 10 clients · <strong style="color:var(--cipher)">rate locked forever</strong>','price.launch.note1':'Available to the first 10 clients only.','price.launch.note2':'Your rate never increases — ever.',
'price.standard.tier':'Standard','price.standard.badge':'Most popular','price.standard.when':'New clients after the first 10',
'price.dual.tier':'Dual-Jurisdiction','price.dual.when':'Multinationals & GDPR subsidiaries',
'price.f.license':'Commercial support for the full open-source engine','price.f.updates':'Pattern updates within 2 weeks of law changes','price.f.monitoring':'Monthly regulatory monitoring email','price.f.support':'Priority support — 24h response','price.f.upgrades':'Version upgrade compatibility','price.f.auditor':'Auditor-ready documentation (CMF, SOC 2, ISO 27001)','price.f.privacy':'Privacy policy alignment review','price.f.gdpr_layer':'GDPR layer for multinational data','price.f.everything':'Everything in Standard','price.f.gdpr_eu':'GDPR layer — EU pattern set configured (IBAN, VAT, EU national IDs)','price.f.cross':'Cross-jurisdiction compliance mapping (Chile + EU)','price.f.doc_dual':'Auditor documentation for EU DPA & Chilean CPDP','price.f.privacy_dual':'Privacy policy alignment for dual-jurisdiction processing','price.f.dedicated':'Dedicated support for auditor & legal team questions',
'price.cta':'Get in touch →','price.ent.label':'Enterprise support','price.ent.text':'<strong>Request pricing.</strong> Hands-on help deploying MaskOps air-gapped and on-prem, guaranteed-response support, compliance reporting, and dedicated integration support for fintechs embedding it into their pipelines. Priced to your deployment and anchored to the exposure it removes, not a per-seat number.','price.ent.cta':'Request pricing →','price.pilot.label':'Paid pilot','price.pilot.text':'<strong>Start on your own data, not a demo.</strong> A fixed 60 to 90 day paid pilot: MaskOps integrated into one Polars pipeline, masking rules configured for your PII, and one success test agreed up front (mask 1M rows in under 3 seconds, pass an auditor manifest review). The fee is credited in full when you convert, and refunded if the test fails. Your only risk is time.',
'install.label':'Get Started','install.h2':'Up and running in 60 seconds.',
'install.s1.title':'Install from PyPI','install.s1.desc':'Requires Python 3.9+, Polars 0.46+','install.s2.title':'Import and mask','install.s2.desc':'No configuration needed for asterisk masking','install.s3.title':'For FPE mode','install.s3.desc':'Generate a 32-byte key and 7-byte tweak — store them separately from your data','install.s4.title':'Enterprise / compliance retainer','install.s4.desc':'Need CMF NCG 311, ISO 27001, or GDPR auditor docs? <a href="#contact">Reach out directly.</a>',
'contact.label':'Contact','contact.h2':'Let\'s talk.','contact.sub':'Book a 15-minute call to discuss a pilot. No procurement process, no deck.','contact.phone':'WhatsApp / Phone','contact.email':'Email',
'footer.changelog':'Changelog','footer.roadmap':'Roadmap','footer.security':'Security','footer.copy':'© 2026 Felipe Carvajal Brown · MaskOps is open-source under Mozilla Public License 2.0'
},
es: {
'hero.badge':'Open-source · MPL-2.0 · v2.0.0','hero.h1':'Enmascaramiento de PII a <em>velocidad Rust</em>.<br/>Aislado. Listo para GDPR.','hero.sub':'Un plugin nativo de Polars que enmascara datos sensibles dentro de tu pipeline — ninguna fila sale de tu infraestructura, sin overhead de Python por fila.','hero.copy':'copiar','hero.copied':'¡copiado!','hero.github_btn':'Ver en GitHub →',
'stats.faster':'más rápido que Presidio','stats.speed':'por 1 millón de filas','stats.air':'aislado de red','stats.gdpr':'Art. 4(5) conforme','stats.note':'Enmascaramiento equivalente de PII estructurada (email, telefono, IP, IBAN, tarjeta) frente a Presidio sobre 1M de filas. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Metodologia y cifras completas →</a>',
'feat.label':'Por qué MaskOps','feat.h2':'Todo lo que tu pipeline necesita.<br/>Nada más.','feat.desc':'Diseñado para ingenieros que no pueden permitirse proveedores en la nube en su flujo de datos — o simplemente no los quieren.',
'feat.1.title':'Aislado por Diseño','feat.1.desc':'Sin llamadas de red, nunca. Funciona offline, en CI, detrás de firewalls, dentro de VPCs. Tus datos nunca tocan un servidor externo — por arquitectura, no por política.',
'feat.2.title':'Cifrado que Preserva el Formato','feat.2.desc':'El modo FPE (FF3-1 AES-256) produce pseudonimización reversible bajo GDPR Art. 4(5). Mismo formato, valor diferente, descifrable solo con tu clave — que MaskOps nunca ve.',
'feat.3.title':'Cobertura LATAM + UE','feat.3.desc':'RUT (Chile), CPF (Brasil), CURP (México), IBAN, NIF, IDs nacionales de la UE, email, teléfono, IP, tarjetas de crédito.',
'feat.4.title':'Plugin Nativo de Polars','feat.4.desc':'Compila a un .so nativo que Polars carga como plugin de expresión. Sin overhead de Python por fila. Paralelismo vía Rayon, automático.',
'feat.5.title':'Detección + Enmascaramiento','feat.5.desc':'contains_pii te dice si una columna tiene PII antes de enmascararla. Útil para auditorías, validación de esquemas y verificaciones de cumplimiento.',
'feat.6.title':'Listo para Auditorías','feat.6.desc':'Cada patrón declara su regulación, categoría de cumplimiento y lógica de validación. Apto para CMF NCG 311, ISO 27001 y documentación de auditores SOC 2.',
'code.label':'Modo FPE','code.h2':'Pseudonimización reversible. Tu clave, tus datos.',
'code.li1':'La clave FPE nunca sale de tu infraestructura — MaskOps nunca la ve','code.li2':'Los valores enmascarados mantienen el formato original: un RUT sigue siendo un RUT válido','code.li3':'Produce un registro real en 10 segundos para una auditoría regulatoria','code.li4':'Pseudonimización conforme GDPR Art. 4(5) — menor carga regulatoria que PII en bruto',
'fpe.title':'Qué significa GDPR Art. 4(5) para tu equipo','fpe.desc':'Los datos pseudonimizados — donde la reidentificación requiere una clave almacenada por separado — siguen bajo el GDPR, pero con <span class="art">riesgo significativamente menor y menor carga de cumplimiento</span>. Bajo el Art. 32, la pseudonimización es una medida de seguridad explícitamente recomendada. El modo FPE de MaskOps es una implementación técnica directa de ese requisito. La clave se queda contigo. El regulador queda satisfecho. Tu equipo de análisis sigue trabajando.',
'fpe.note':'Sobre la criptografía: FF3-1 está propuesto para descontinuación en el borrador NIST SP 800-38G Rev.1. Documentamos abiertamente el estado, nuestras mitigaciones y la ruta de migración a FF1 — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">leer la nota de seguridad →</a>',
'comp.label':'Cobertura Regulatoria','comp.h2':'Diseñado para las leyes que tus clientes realmente enfrentan.','comp.desc':'Identificadores de PII vinculados a la regulación que los hace sensibles.',
'price.label':'Planes de Retención','price.h2':'Precios simples y transparentes.','price.desc':'Comienza con un piloto pagado sobre tus propios datos, con la tarifa acreditada por completo al convertir. Sin comités de adquisición, sin bloqueo anual.','price.anchor':'Una multa de la Ley 21.719 puede llegar a unos USD 1,5M. Una filtración en el sector financiero brasileño promedia R$8,9M. Un retainer es un detalle menor frente a cualquiera de las dos.','price.oss':'MaskOps es 100% open source bajo MPL-2.0 — cada patrón, la CLI y el motor de políticas. Los planes pagados son servicios de soporte y cumplimiento, no una versión distinta ni cerrada del software.',
'price.launch.tier':'Lanzamiento','price.launch.when':'Primeros 10 clientes · <strong style="color:var(--cipher)">tarifa fijada para siempre</strong>','price.launch.note1':'Disponible solo para los primeros 10 clientes.','price.launch.note2':'Tu tarifa nunca aumenta — jamás.',
'price.standard.tier':'Estándar','price.standard.badge':'Más popular','price.standard.when':'Nuevos clientes después de los primeros 10',
'price.dual.tier':'Doble Jurisdicción','price.dual.when':'Multinacionales y subsidiarias GDPR',
'price.f.license':'Soporte comercial del motor open-source completo','price.f.updates':'Actualizaciones de patrones en 2 semanas ante cambios legales','price.f.monitoring':'Email mensual de monitoreo regulatorio','price.f.support':'Soporte prioritario — respuesta en 24h','price.f.upgrades':'Compatibilidad con actualizaciones de versión','price.f.auditor':'Documentación lista para auditores (CMF, SOC 2, ISO 27001)','price.f.privacy':'Revisión de alineación de políticas de privacidad','price.f.gdpr_layer':'Capa GDPR para datos multinacionales','price.f.everything':'Todo lo del plan Estándar','price.f.gdpr_eu':'Capa GDPR — conjunto de patrones UE configurado (IBAN, NIF, IDs nacionales)','price.f.cross':'Mapeo de cumplimiento entre jurisdicciones (Chile + UE)','price.f.doc_dual':'Documentación de auditoría para DPA de la UE y CPDP chileno','price.f.privacy_dual':'Alineación de políticas para procesamiento en doble jurisdicción','price.f.dedicated':'Soporte dedicado para preguntas de auditores y equipo legal',
'price.cta':'Contactar →','price.ent.label':'Soporte empresarial','price.ent.text':'<strong>Solicita una cotización.</strong> Ayuda práctica para desplegar MaskOps aislado de red y on-premise, soporte con respuesta garantizada, reportes de cumplimiento y soporte de integración dedicado para fintechs que lo integran en sus pipelines. Con precio según tu despliegue y anclado a la exposición que elimina, no a un número por asiento.','price.ent.cta':'Solicitar cotización →','price.pilot.label':'Piloto pagado','price.pilot.text':'<strong>Empieza sobre tus propios datos, no una demo.</strong> Un piloto pagado de 60 a 90 días: MaskOps integrado en un pipeline de Polars, reglas de enmascaramiento configuradas para tu PII y una prueba de éxito acordada de antemano (enmascarar 1M de filas en menos de 3 segundos, pasar una revisión de manifiesto por un auditor). La tarifa se acredita por completo al convertir, y se reembolsa si la prueba falla. Tu único riesgo es el tiempo.',
'install.label':'Comenzar','install.h2':'En marcha en 60 segundos.',
'install.s1.title':'Instalar desde PyPI','install.s1.desc':'Requiere Python 3.9+, Polars 0.46+','install.s2.title':'Importar y enmascarar','install.s2.desc':'No se necesita configuración para el enmascaramiento con asteriscos','install.s3.title':'Para el modo FPE','install.s3.desc':'Genera una clave de 32 bytes y un tweak de 7 bytes — guárdalos por separado de tus datos','install.s4.title':'Retainer empresarial / cumplimiento','install.s4.desc':'¿Necesitas documentación para CMF NCG 311, ISO 27001 o GDPR? <a href="#contact">Contáctanos directamente.</a>',
'contact.label':'Contacto','contact.h2':'Hablemos.','contact.sub':'Agenda una llamada de 15 minutos para discutir un piloto. Sin proceso de compra, sin presentación.','contact.phone':'WhatsApp / Teléfono','contact.email':'Correo',
'footer.changelog':'Historial','footer.roadmap':'Hoja de Ruta','footer.security':'Seguridad','footer.copy':'© 2026 Felipe Carvajal Brown · MaskOps es open-source bajo Mozilla Public License 2.0'
},
'pt-BR': {
'hero.badge':'Open-source · MPL-2.0 · v2.0.0','hero.h1':'Mascaramento de PII em <em>velocidade Rust</em>.<br/>Isolado. Pronto para a LGPD.','hero.sub':'Um plugin nativo do Polars que mascara dados sensíveis dentro do seu pipeline — nenhuma linha sai da sua infraestrutura, sem overhead de Python por linha.','hero.copy':'copiar','hero.copied':'copiado!','hero.github_btn':'Ver no GitHub →',
'stats.faster':'mais rápido que o Presidio','stats.speed':'para 1 milhão de linhas','stats.air':'isolado da rede','stats.gdpr':'LGPD / Art. 4(5) conforme','stats.note':'Mascaramento equivalente de PII estruturada (e-mail, telefone, IP, IBAN, cartao) vs Presidio sobre 1M de linhas. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Metodologia e numeros completos →</a>',
'feat.label':'Por que MaskOps','feat.h2':'Tudo que seu pipeline precisa.<br/>Nada além disso.','feat.desc':'Criado para engenheiros que não podem ter fornecedores de nuvem no fluxo de dados — ou que simplesmente não os querem.',
'feat.1.title':'Isolado por Design','feat.1.desc':'Sem chamadas de rede, nunca. Funciona offline, em CI, atrás de firewalls, em VPCs. Seus dados nunca tocam um servidor externo — por arquitetura, não por política.',
'feat.2.title':'Criptografia com Preservação de Formato','feat.2.desc':'Modo FPE (FF3-1 AES-256) produz pseudonimização reversível conforme LGPD/GDPR Art. 4(5). Mesmo formato, valor diferente, decifrável apenas com sua chave — que o MaskOps nunca vê.',
'feat.3.title':'Cobertura LATAM + UE','feat.3.desc':'RUT (Chile), CPF (Brasil), CURP (México), IBAN, VAT, IDs nacionais da UE, e-mail, telefone, IP, cartões de crédito.',
'feat.4.title':'Plugin Nativo do Polars','feat.4.desc':'Compilado para um .so nativo que o Polars carrega como plugin de expressão. Sem overhead de Python por linha. Paralelismo via Rayon, automático.',
'feat.5.title':'Detecção + Mascaramento','feat.5.desc':'contains_pii informa se uma coluna contém PII antes de mascará-la. Útil para auditorias, validação de esquema e verificações de conformidade.',
'feat.6.title':'Pronto para Auditorias','feat.6.desc':'Cada padrão declara sua regulamentação, categoria de conformidade e lógica de validação. Adequado para ANPD, ISO 27001 e documentação de auditores SOC 2.',
'code.label':'Modo FPE','code.h2':'Pseudonimização reversível. Sua chave, seus dados.',
'code.li1':'A chave FPE nunca sai da sua infraestrutura — o MaskOps nunca a vê','code.li2':'Os valores mascarados mantêm o formato original: um CPF continua parecendo um CPF válido','code.li3':'Produza um registro real em 10 segundos para uma auditoria regulatória','code.li4':'Pseudonimização conforme LGPD/GDPR Art. 4(5) — menor carga regulatória que PII bruto',
'fpe.title':'O que LGPD/GDPR Art. 4(5) significa para sua equipe','fpe.desc':'Dados pseudonimizados — onde a reidentificação requer uma chave mantida separadamente — ainda estão sob a LGPD/GDPR, mas com <span class="art">risco significativamente menor e menor carga de conformidade</span>. O MaskOps modo FPE é uma implementação técnica direta desse requisito. A chave fica com você. O regulador fica satisfeito. Sua equipe analytics continua trabalhando.',
'fpe.note':'Sobre a criptografia: o FF3-1 está proposto para descontinuação no rascunho NIST SP 800-38G Rev.1. Documentamos abertamente o status, nossas mitigações e o caminho de migração para o FF1 — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">leia a nota de segurança →</a>',
'comp.label':'Cobertura Regulatória','comp.h2':'Construído para as leis que seus clientes realmente enfrentam.','comp.desc':'Identificadores de PII vinculados à regulamentação que os torna sensíveis.',
'price.label':'Planos de Retainer','price.h2':'Preços simples e transparentes.','price.desc':'Comece com um piloto pago sobre seus próprios dados, com a taxa creditada integralmente na conversão. Sem comitês de compras, sem bloqueio anual.','price.anchor':'Uma multa da Ley 21.719 pode chegar a cerca de USD 1,5M. Uma violação no setor financeiro brasileiro custa em média R$8,9M. Um retainer é um detalhe diante de qualquer uma delas.','price.oss':'O MaskOps é 100% open source sob a MPL-2.0 — cada padrão, a CLI e o motor de políticas. Os planos pagos são serviços de suporte e conformidade, não uma versão diferente ou fechada do software.',
'price.launch.tier':'Lançamento','price.launch.when':'Primeiros 10 clientes · <strong style="color:var(--cipher)">tarifa congelada para sempre</strong>','price.launch.note1':'Disponível apenas para os primeiros 10 clientes.','price.launch.note2':'Sua tarifa nunca aumenta — jamais.',
'price.standard.tier':'Padrão','price.standard.badge':'Mais popular','price.standard.when':'Novos clientes após os primeiros 10',
'price.dual.tier':'Dupla Jurisdição','price.dual.when':'Multinacionais & subsidiárias GDPR',
'price.f.license':'Suporte comercial do motor open-source completo','price.f.updates':'Atualizações de padrões em 2 semanas após mudanças legais','price.f.monitoring':'E-mail mensal de monitoramento regulatório','price.f.support':'Suporte prioritário — resposta em 24h','price.f.upgrades':'Compatibilidade com atualizações de versão','price.f.auditor':'Documentação pronta para auditores (ANPD, SOC 2, ISO 27001)','price.f.privacy':'Revisão de alinhamento de política de privacidade','price.f.gdpr_layer':'Camada LGPD/GDPR para dados multinacionais','price.f.everything':'Tudo do plano Padrão','price.f.gdpr_eu':'Camada LGPD/GDPR — padrões UE configurados (IBAN, VAT, IDs nacionais)','price.f.cross':'Mapeamento de conformidade entre jurisdições (Brasil + UE)','price.f.doc_dual':'Documentação de auditoria para DPA da UE e ANPD','price.f.privacy_dual':'Política de privacidade para processamento em dupla jurisdição','price.f.dedicated':'Suporte dedicado para auditores e equipe jurídica',
'price.cta':'Entre em contato →','price.ent.label':'Suporte empresarial','price.ent.text':'<strong>Solicite um orçamento.</strong> Ajuda prática para implantar o MaskOps isolado da rede e on-premise, suporte com resposta garantida, relatórios de conformidade e suporte de integração dedicado para fintechs que o integram em seus pipelines. Precificado conforme sua implantação e ancorado na exposição que elimina, não em um número por assento.','price.ent.cta':'Solicitar orçamento →','price.pilot.label':'Piloto pago','price.pilot.text':'<strong>Comece sobre seus próprios dados, não uma demo.</strong> Um piloto pago de 60 a 90 dias: MaskOps integrado em um pipeline Polars, regras de mascaramento configuradas para seu PII e um teste de sucesso acordado de antemão (mascarar 1M de linhas em menos de 3 segundos, passar por uma revisão de manifesto por um auditor). A taxa é creditada integralmente na conversão e reembolsada se o teste falhar. Seu único risco é o tempo.',
'install.label':'Começar','install.h2':'Funcionando em 60 segundos.',
'install.s1.title':'Instalar do PyPI','install.s1.desc':'Requer Python 3.9+, Polars 0.46+','install.s2.title':'Importar e mascarar','install.s2.desc':'Nenhuma configuração necessária para mascaramento com asteriscos','install.s3.title':'Para o modo FPE','install.s3.desc':'Gere uma chave de 32 bytes e um tweak de 7 bytes — armazene-os separados dos seus dados','install.s4.title':'Retainer empresarial / conformidade','install.s4.desc':'Precisa de documentação para ANPD, ISO 27001 ou GDPR? <a href="#contact">Entre em contato.</a>',
'contact.label':'Contato','contact.h2':'Vamos conversar.','contact.sub':'Agende uma ligação de 15 minutos para discutir um piloto. Sem processo de compras, sem apresentação.','contact.phone':'WhatsApp / Telefone','contact.email':'E-mail',
'footer.changelog':'Histórico','footer.roadmap':'Roteiro','footer.security':'Segurança','footer.copy':'© 2026 Felipe Carvajal Brown · MaskOps é open-source sob Mozilla Public License 2.0'
},
de: {
'hero.badge':'Open-source · MPL-2.0 · v2.0.0','hero.h1':'PII-Maskierung mit <em>Rust-Geschwindigkeit</em>.<br/>Air-Gapped. DSGVO-konform.','hero.sub':'Ein natives Polars-Plugin, das sensible Daten innerhalb Ihrer Pipeline maskiert — keine Zeile verlässt Ihre Infrastruktur, kein Python-Overhead pro Zeile.','hero.copy':'kopieren','hero.copied':'kopiert!','hero.github_btn':'Auf GitHub ansehen →',
'stats.faster':'schneller als Presidio','stats.speed':'für 1 Million Zeilen','stats.air':'air-gapped','stats.gdpr':'Art. 4(5) DSGVO konform','stats.note':'Vergleichbare Maskierung strukturierter PII (E-Mail, Telefon, IP, IBAN, Karte) vs Presidio bei 1 Mio. Zeilen. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Methodik & vollstaendige Zahlen →</a>',
'feat.label':'Warum MaskOps','feat.h2':'Alles, was Ihre Datenpipeline braucht.<br/>Nichts mehr.','feat.desc':'Entwickelt für Ingenieure, die sich keine Cloud-Anbieter im Datenpfad leisten können — oder sie schlicht nicht wollen.',
'feat.1.title':'Air-Gapped by Design','feat.1.desc':'Keine Netzwerkaufrufe, niemals. Läuft offline, in CI, hinter Firewalls, in VPCs. Ihre Daten berühren nie einen externen Server — durch Architektur, nicht durch Richtlinien.',
'feat.2.title':'Formaterhaltende Verschlüsselung','feat.2.desc':'FPE-Modus (FF3-1 AES-256) erzeugt reversible Pseudonymisierung gemäß DSGVO Art. 4(5). Gleiches Format, anderer Wert, entschlüsselbar nur mit Ihrem Schlüssel — den MaskOps nie sieht.',
'feat.3.title':'LATAM + EU Abdeckung','feat.3.desc':'RUT (Chile), CPF (Brasilien), CURP (Mexiko), IBAN, USt-IdNr., EU-Ausweise, E-Mail, Telefon, IP, Kreditkarten.',
'feat.4.title':'Natives Polars-Plugin','feat.4.desc':'Kompiliert zu einer nativen .so, die Polars als Ausdrucks-Plugin lädt. Kein Python-Overhead pro Zeile. Parallelität über Rayon, automatisch.',
'feat.5.title':'Erkennung + Maskierung','feat.5.desc':'contains_pii zeigt an, ob eine Spalte personenbezogene Daten enthält, bevor Sie maskieren. Nützlich für Audits, Schema-Validierung und Compliance-Prüfungen.',
'feat.6.title':'Audit-Ready','feat.6.desc':'Jedes Muster deklariert seine Regulierung, Compliance-Kategorie und Validierungslogik. Geeignet für BSI-Grundschutz, ISO 27001 und SOC 2 Prüfer-Dokumentation.',
'code.label':'FPE-Modus','code.h2':'Reversible Pseudonymisierung. Ihr Schlüssel, Ihre Daten.',
'code.li1':'Der FPE-Schlüssel verlässt nie Ihre Infrastruktur — MaskOps sieht ihn nie','code.li2':'Maskierte Werte behalten das Originalformat: ein Personalausweis bleibt wie ein gültiger Personalausweis','code.li3':'Stellen Sie einen echten Datensatz in 10 Sekunden für eine Behördenprüfung bereit','code.li4':'DSGVO Art. 4(5) konforme Pseudonymisierung — geringere Compliance-Last als rohe personenbezogene Daten',
'fpe.title':'Was DSGVO Art. 4(5) für Ihr Team bedeutet','fpe.desc':'Pseudonymisierte Daten — bei denen die Reidentifizierung einen separat aufbewahrten Schlüssel erfordert — unterliegen weiterhin der DSGVO, aber mit <span class="art">deutlich reduziertem Risiko und geringerer Compliance-Last</span>. Gemäß Art. 32 ist Pseudonymisierung eine ausdrücklich empfohlene Sicherheitsmaßnahme. Der Schlüssel bleibt bei Ihnen. Die Behörde ist zufrieden. Ihr Analytics-Team arbeitet weiter.',
'fpe.note':'Zur Kryptografie: FF3-1 ist im NIST-Entwurf SP 800-38G Rev.1 zur Abkündigung vorgeschlagen. Wir dokumentieren den Status, unsere Gegenmaßnahmen und den FF1-Migrationspfad offen — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">Sicherheitshinweis lesen →</a>',
'comp.label':'Regulatorische Abdeckung','comp.h2':'Entwickelt für die Gesetze, mit denen Ihre Kunden konfrontiert sind.','comp.desc':'PII-Identifikatoren abgestimmt auf die Regulierung, die sie schützenswert macht.',
'price.label':'Retainer-Pläne','price.h2':'Einfache, transparente Preise.','price.desc':'Starten Sie mit einem kostenpflichtigen Piloten auf Ihren eigenen Daten, die Gebühr wird bei der Umstellung vollständig angerechnet. Kein Beschaffungsausschuss, keine Jahresbindung.','price.anchor':'Eine Geldbuße nach Ley 21.719 kann rund USD 1,5 Mio. erreichen. Eine Datenpanne im brasilianischen Finanzsektor kostet im Schnitt R$8,9 Mio. Ein Retainer ist dagegen ein Rundungsfehler.','price.oss':'MaskOps selbst ist zu 100% Open Source unter der MPL-2.0 — jedes Muster, die CLI und die Policy-Engine. Bezahlte Pläne sind Support- und Compliance-Dienstleistungen, keine andere oder geschlossene Version der Software.',
'price.launch.tier':'Start','price.launch.when':'Erste 10 Kunden · <strong style="color:var(--cipher)">Preis dauerhaft eingefroren</strong>','price.launch.note1':'Nur für die ersten 10 Kunden verfügbar.','price.launch.note2':'Ihr Preis steigt nie — nie.',
'price.standard.tier':'Standard','price.standard.badge':'Beliebteste','price.standard.when':'Neue Kunden nach den ersten 10',
'price.dual.tier':'Doppelte Jurisdiktion','price.dual.when':'Multinationale Unternehmen & DSGVO-Töchter',
'price.f.license':'Kommerzieller Support für die vollständige Open-Source-Engine','price.f.updates':'Muster-Updates innerhalb 2 Wochen nach Gesetzesänderungen','price.f.monitoring':'Monatliche regulatorische Monitoring-E-Mail','price.f.support':'Prioritäts-Support — Antwort in 24h','price.f.upgrades':'Versionsupgrade-Kompatibilität','price.f.auditor':'Audit-fertige Dokumentation (BSI, SOC 2, ISO 27001)','price.f.privacy':'Überprüfung der Datenschutzrichtlinien','price.f.gdpr_layer':'DSGVO-Schicht für multinationale Daten','price.f.everything':'Alles aus Standard','price.f.gdpr_eu':'DSGVO-Schicht — EU-Musterset konfiguriert (IBAN, USt-IdNr., nationale Ausweise)','price.f.cross':'Jurisdiktionsübergreifendes Compliance-Mapping (Chile + EU)','price.f.doc_dual':'Audit-Dokumentation für EU-Datenschutzbehörde & chilenische CPDP','price.f.privacy_dual':'Datenschutzrichtlinien für doppelte Jurisdiktion','price.f.dedicated':'Dedizierter Support für Prüfer- und Rechtsfragen',
'price.cta':'Kontakt aufnehmen →','price.ent.label':'Enterprise-Support','price.ent.text':'<strong>Preis auf Anfrage.</strong> Praktische Unterstützung bei der air-gapped On-Premise-Bereitstellung von MaskOps, Support mit garantierter Reaktionszeit, Compliance-Reporting und dedizierter Integrations-Support für Fintechs, die es in ihre Pipelines einbetten. Preis nach Ihrer Bereitstellung, verankert am Risiko, das es beseitigt, nicht an einer Pro-Platz-Zahl.','price.ent.cta':'Preis anfragen →','price.pilot.label':'Kostenpflichtiger Pilot','price.pilot.text':'<strong>Starten Sie auf Ihren eigenen Daten, nicht mit einer Demo.</strong> Ein fester kostenpflichtiger Pilot von 60 bis 90 Tagen: MaskOps in eine Polars-Pipeline integriert, Maskierungsregeln für Ihre PII konfiguriert und ein vorab vereinbarter Erfolgstest (1 Mio. Zeilen in unter 3 Sekunden maskieren, eine Prüfer-Manifestprüfung bestehen). Die Gebühr wird bei der Umstellung vollständig angerechnet und erstattet, falls der Test scheitert. Ihr einziges Risiko ist Zeit.',
'install.label':'Loslegen','install.h2':'In 60 Sekunden einsatzbereit.',
'install.s1.title':'Von PyPI installieren','install.s1.desc':'Erfordert Python 3.9+, Polars 0.46+','install.s2.title':'Importieren und maskieren','install.s2.desc':'Keine Konfiguration für Sternchen-Maskierung nötig','install.s3.title':'Für den FPE-Modus','install.s3.desc':'Generieren Sie einen 32-Byte-Schlüssel und einen 7-Byte-Tweak — separat von Ihren Daten speichern','install.s4.title':'Enterprise / Compliance-Retainer','install.s4.desc':'Benötigen Sie Dokumentation für BSI, ISO 27001 oder DSGVO? <a href="#contact">Kontaktieren Sie uns direkt.</a>',
'contact.label':'Kontakt','contact.h2':'Sprechen wir.','contact.sub':'Buchen Sie einen 15-Minuten-Call, um einen Piloten zu besprechen. Kein Beschaffungsprozess, keine Präsentation.','contact.phone':'WhatsApp / Telefon','contact.email':'E-Mail',
'footer.changelog':'Änderungsprotokoll','footer.roadmap':'Roadmap','footer.security':'Sicherheit','footer.copy':'© 2026 Felipe Carvajal Brown · MaskOps ist Open-Source unter Mozilla Public License 2.0'
},
fr: {
'hero.badge':'Open-source · MPL-2.0 · v2.0.0','hero.h1':'Masquage des DCP à la <em>vitesse de Rust</em>.<br/>Isolé. Conforme au RGPD.','hero.sub':'Un plugin natif Polars qui masque les données sensibles à l\'intérieur de votre pipeline — aucune ligne ne quitte votre infrastructure, aucun overhead Python par ligne.','hero.copy':'copier','hero.copied':'copié !','hero.github_btn':'Voir sur GitHub →',
'stats.faster':'plus rapide que Presidio','stats.speed':'pour 1 million de lignes','stats.air':'isolé du réseau','stats.gdpr':'Art. 4(5) RGPD conforme','stats.note':'Masquage comparable de DCP structurees (e-mail, telephone, IP, IBAN, carte) vs Presidio sur 1M de lignes. <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/benchmarks/RESULTS.md" target="_blank" rel="noopener">Methodologie et chiffres complets →</a>',
'feat.label':'Pourquoi MaskOps','feat.h2':'Tout ce dont votre pipeline a besoin.<br/>Rien de plus.','feat.desc':'Conçu pour les ingénieurs qui ne peuvent pas se permettre des fournisseurs cloud dans leur chemin de données — ou qui n\'en veulent simplement pas.',
'feat.1.title':'Isolé par Conception','feat.1.desc':'Aucun appel réseau, jamais. Fonctionne hors ligne, en CI, derrière des pare-feux, dans des VPCs. Vos données ne touchent jamais un serveur externe — par architecture, pas par politique.',
'feat.2.title':'Chiffrement Préservant le Format','feat.2.desc':'Mode FPE (FF3-1 AES-256) produit une pseudonymisation réversible conforme au RGPD Art. 4(5). Même format, valeur différente, déchiffrable uniquement avec votre clé — que MaskOps ne voit jamais.',
'feat.3.title':'Couverture LATAM + UE','feat.3.desc':'RUT (Chili), CPF (Brésil), CURP (Mexique), IBAN, TVA, cartes d\'identité européennes, e-mail, téléphone, IP, cartes bancaires.',
'feat.4.title':'Plugin Polars Natif','feat.4.desc':'Compilé en .so natif que Polars charge comme plugin d\'expression. Aucun overhead Python par ligne. Parallélisme via Rayon, automatique.',
'feat.5.title':'Détection + Masquage','feat.5.desc':'contains_pii indique si une colonne contient des DCP avant de les masquer. Utile pour les audits, la validation de schéma et les vérifications de conformité.',
'feat.6.title':'Prêt pour l\'Audit','feat.6.desc':'Chaque motif déclare sa réglementation, sa catégorie de conformité et sa logique de validation. Adapté à la CNIL, ISO 27001 et la documentation des auditeurs SOC 2.',
'code.label':'Mode FPE','code.h2':'Pseudonymisation réversible. Votre clé, vos données.',
'code.li1':'La clé FPE ne quitte jamais votre infrastructure — MaskOps ne la voit jamais','code.li2':'Les valeurs masquées conservent le format original : un IBAN reste un IBAN valide','code.li3':'Produisez un enregistrement réel en 10 secondes pour un audit réglementaire','code.li4':'Pseudonymisation conforme RGPD Art. 4(5) — charge réglementaire réduite par rapport aux DCP bruts',
'fpe.title':'Ce que signifie le RGPD Art. 4(5) pour votre équipe','fpe.desc':'Les données pseudonymisées — où la réidentification nécessite une clé détenue séparément — restent sous le RGPD, mais avec <span class="art">un risque significativement réduit et une charge de conformité allégée</span>. En vertu de l\'Art. 32, la pseudonymisation est une mesure de sécurité explicitement recommandée. La clé reste avec vous. Le régulateur est satisfait. Votre équipe analytics continue de travailler.',
'fpe.note':'À propos de la cryptographie : FF3-1 est proposé à l\'abandon dans le projet NIST SP 800-38G Rev.1. Nous documentons ouvertement le statut, nos mesures d\'atténuation et la voie de migration vers FF1 — <a href="https://github.com/fcarvajalbrown/MaskOps/blob/main/docs/gdpr/fpe-ff3-1-nist-status.md" target="_blank" rel="noopener">lire la note de sécurité →</a>',
'comp.label':'Couverture Réglementaire','comp.h2':'Conçu pour les lois auxquelles vos clients font face.','comp.desc':'Identifiants DCP associés à la réglementation qui les rend sensibles.',
'price.label':'Plans de Retainer','price.h2':'Tarification simple et transparente.','price.desc':'Commencez par un pilote payant sur vos propres données, les frais étant intégralement crédités lors de la conversion. Pas de comité d\'achat, pas d\'engagement annuel.','price.anchor':'Une amende au titre de la Ley 21.719 peut atteindre environ 1,5 M USD. Une violation dans le secteur financier brésilien coûte en moyenne 8,9 M R$. Un retainer ne pèse rien face à l\'une ou l\'autre.','price.oss':'MaskOps lui-même est 100% open source sous MPL-2.0 — chaque motif, la CLI et le moteur de politiques. Les plans payants sont des services de support et de conformité, pas une version différente ou fermée du logiciel.',
'price.launch.tier':'Lancement','price.launch.when':'10 premiers clients · <strong style="color:var(--cipher)">tarif verrouillé à vie</strong>','price.launch.note1':'Disponible uniquement pour les 10 premiers clients.','price.launch.note2':'Votre tarif n\'augmente jamais — jamais.',
'price.standard.tier':'Standard','price.standard.badge':'Le plus populaire','price.standard.when':'Nouveaux clients après les 10 premiers',
'price.dual.tier':'Double Juridiction','price.dual.when':'Multinationales & filiales RGPD',
'price.f.license':'Support commercial du moteur open-source complet','price.f.updates':'Mises à jour des motifs sous 2 semaines après changements légaux','price.f.monitoring':'E-mail mensuel de veille réglementaire','price.f.support':'Support prioritaire — réponse en 24h','price.f.upgrades':'Compatibilité avec les mises à jour de version','price.f.auditor':'Documentation prête pour les auditeurs (CNIL, SOC 2, ISO 27001)','price.f.privacy':'Révision de la politique de confidentialité','price.f.gdpr_layer':'Couche RGPD pour les données multinationales','price.f.everything':'Tout du plan Standard','price.f.gdpr_eu':'Couche RGPD — motifs UE configurés (IBAN, TVA, cartes d\'identité)','price.f.cross':'Cartographie de conformité inter-juridictions (Chili + UE)','price.f.doc_dual':'Documentation d\'audit pour l\'APD de l\'UE et la CPDP chilienne','price.f.privacy_dual':'Politique de confidentialité pour traitement en double juridiction','price.f.dedicated':'Support dédié pour auditeurs et équipe juridique',
'price.cta':'Nous contacter →','price.ent.label':'Support entreprise','price.ent.text':'<strong>Tarif sur demande.</strong> Aide concrète pour déployer MaskOps isolé du réseau et on-premise, support à temps de réponse garanti, rapports de conformité et support d\'intégration dédié pour les fintechs qui l\'intègrent dans leurs pipelines. Tarifé selon votre déploiement et ancré sur le risque qu\'il supprime, pas sur un nombre par poste.','price.ent.cta':'Demander un tarif →','price.pilot.label':'Pilote payant','price.pilot.text':'<strong>Commencez sur vos propres données, pas une démo.</strong> Un pilote payant de 60 à 90 jours : MaskOps intégré dans un pipeline Polars, règles de masquage configurées pour vos DCP et un test de réussite convenu à l\'avance (masquer 1 M de lignes en moins de 3 secondes, passer une revue de manifeste par un auditeur). Les frais sont intégralement crédités lors de la conversion, et remboursés si le test échoue. Votre seul risque, c\'est le temps.',
'install.label':'Démarrer','install.h2':'Opérationnel en 60 secondes.',
'install.s1.title':'Installer depuis PyPI','install.s1.desc':'Nécessite Python 3.9+, Polars 0.46+','install.s2.title':'Importer et masquer','install.s2.desc':'Aucune configuration requise pour le masquage avec astérisques','install.s3.title':'Pour le mode FPE','install.s3.desc':'Générez une clé de 32 octets et un tweak de 7 octets — stockez-les séparément de vos données','install.s4.title':'Retainer entreprise / conformité','install.s4.desc':'Besoin de documentation pour la CNIL, ISO 27001 ou RGPD ? <a href="#contact">Contactez-nous directement.</a>',
'contact.label':'Contact','contact.h2':'Parlons-en.','contact.sub':'Réservez un appel de 15 minutes pour discuter d\'un pilote. Pas de processus d\'achat, pas de présentation.','contact.phone':'WhatsApp / Téléphone','contact.email':'E-mail',
'footer.changelog':'Journal des modifications','footer.roadmap':'Feuille de route','footer.security':'Sécurité','footer.copy':'© 2026 Felipe Carvajal Brown · MaskOps est open-source sous Mozilla Public License 2.0'
}
};
let currentLang = localStorage.getItem('lang') || 'es';
function applyLang(lang) {
const dict = T[lang] || T['en'];
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
if (dict[key] !== undefined) el.textContent = dict[key];
});
document.querySelectorAll('[data-i18n-html]').forEach(el => {
const key = el.getAttribute('data-i18n-html');
if (dict[key] !== undefined) el.innerHTML = dict[key];
});
document.querySelectorAll('.lang-btn').forEach(btn => {
btn.classList.toggle('active', btn.textContent === lang.toUpperCase() || (lang === 'pt-BR' && btn.textContent === 'PT'));
});
document.documentElement.lang = lang;
}
function setLang(lang) {
currentLang = lang;
localStorage.setItem('lang', lang);
applyLang(lang);
}
function copyInstall(btn) {
navigator.clipboard.writeText('pip install maskops').then(() => {
const label = document.getElementById('copy-label');
const copied = (T[currentLang] || T['en'])['hero.copied'] || 'copied!';
label.textContent = copied;
label.classList.add('copied');
setTimeout(() => {
label.textContent = (T[currentLang] || T['en'])['hero.copy'] || 'copy';
label.classList.remove('copied');
}, 2000);
});
}
applyLang(currentLang);
</script>
</body>
</html>