-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathabout.html
More file actions
499 lines (459 loc) · 24.8 KB
/
Copy pathabout.html
File metadata and controls
499 lines (459 loc) · 24.8 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
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Vision & About — Ghostmaxxing</title>
<meta name="description"
content="Ghostmaxxing is a public research lab for testing face-recognition camouflage, documenting what actually works, and investigating the biometric systems installed in public space." />
<link rel="canonical" href="https://ghostmaxxing.vecna.eu/about.html" />
<link rel="manifest" href="/manifest.webmanifest" />
<meta name="theme-color" content="#14100c" />
<link rel="icon" type="image/svg+xml" href="/images/logo/mark-color.svg" />
<link rel="icon" type="image/png" sizes="32x32"
href="/images/logo/favicon-32.png" />
<link rel="apple-touch-icon" href="/images/logo/favicon-180.png" />
<meta property="og:title" content="Vision & About — Ghostmaxxing" />
<meta property="og:description"
content="A public lab for testing face-recognition camouflage, and the research loop that keeps it honest." />
<meta property="og:type" content="website" />
<meta property="og:image" content="/images/social-card.svg" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="stylesheet" href="/styles/styles.css" />
<link rel="stylesheet" href="/styles/pages.css" />
<link rel="stylesheet" href="/styles/content-pages.css" />
<link rel="stylesheet" href="/styles/about.css" />
</head>
<body>
<!-- ===== SITE HEADER — canonical. Byte-identical on every page. =========
Only two things may differ per page: aria-current="page" on the link to
the current page, and the optional .gm-site-nav__extra slot.
Styling: styles/chrome.css. Behaviour: lab-js/nav.js.
==================================================================== -->
<header class="gm-site-header">
<a class="gm-site-wordmark" href="/" aria-label="Ghostmaxxing homepage">
<img class="gm-site-wordmark__mark" src="/images/logo/mark-color.svg"
width="40" height="40" alt aria-hidden="true" />
<span class="gm-site-wordmark__text">
<span class="gm-site-wordmark__title">Ghostmaxxing</span>
<span class="gm-site-wordmark__sub">A public lab for testing
camouflage</span>
</span>
</a>
<nav class="gm-site-nav" aria-label="Primary">
<a class="gm-site-chip" href="/fediverse.html">in the Fediverse</a>
<div class="gm-site-nav__group">
<button class="gm-site-nav__trigger" aria-expanded="false"
aria-controls="gmSiteMenu">Know more <span
aria-hidden="true">▾</span></button>
<div class="gm-site-menu" id="gmSiteMenu">
<div>
<p class="gm-site-menu__kicker">Informative</p>
<ul>
<li><a href="/about.html" aria-current="page">Vision &
about</a></li>
<li><a href="/genealogy.html">The genealogy of the read</a></li>
<li><a href="/report.html">Report a deployment</a></li>
<li><a href="/workshops.html">Workshops</a></li>
</ul>
</div>
<div>
<p class="gm-site-menu__kicker">Technology</p>
<ul>
<li><a href="/lab.html">Open the lab ↗</a></li>
<li><a href="/ghostyle-transfer.html">Ghostyle transfer</a></li>
<li><a href="/references/">References archive</a></li>
<li><a href="/docs/">Docs</a></li>
<li><a
href="https://github.com/vecna/ghostmaxxing">Code</a></li>
</ul>
</div>
</div>
</div>
<a class="gm-site-cta" href="/report.html">Leak to us ↗</a>
</nav>
</header>
<main class="editorial-homepage content-page">
<div class="editorial-homepage__shell">
<section class="content-page__header-area">
<span class="content-page__kicker">Vision & About</span>
<h1>Make the machine-readable face <i>contestable</i>.</h1>
<p class="content-page__lead">
Ghostmaxxing is a public research lab for testing face-recognition
camouflage in the browser, documenting what actually works, and
investigating the biometric systems already installed in public
space.
</p>
<p class="content-page__deck">
It is not an invisibility product and it does not sell protection.
It is a test bench, an archive of what has already been tried, and
a way for people who know how these systems are built, bought or
operated to reach us.
</p>
</section>
<section class="content-section about-loop-section gm-prose" id="loop">
<h2>What's Ghostmaxxing.</h2>
<p>Ghostmaxxing is one research loop, not four features that happen
to share a website. Each stage produces the material the next stage
needs, and the last stage feeds the first.</p>
<div class="about-loop">
<!-- The lab.html Info icon, path-identical, defined once.
Two groups: the single arc used between the blocks, and the
full three-arrow icon used once in the closing strip at its
natural glyph size. Inlined (not <img>) so stroke comes from
tokens via CSS: styleguide 12, and the #gm-wind precedent. -->
<svg width="0" height="0" aria-hidden="true" focusable="false"
style="position:absolute">
<defs>
<g id="gm-loop-arc" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path d="M12 5 A7 7 0 0 1 18 8.5" />
<path d="M18 8.5 l-2.4 .3 M18 8.5 l.3 -2.4" />
</g>
<g id="gm-loop-icon" fill="none" stroke-linecap="round"
stroke-linejoin="round">
<path d="M12 5 A7 7 0 0 1 18 8.5" />
<path d="M18 8.5 l-2.4 .3 M18 8.5 l.3 -2.4" />
<path d="M12 5 A7 7 0 0 1 18 8.5"
transform="rotate(120 12 12)" />
<path d="M18 8.5 l-2.4 .3 M18 8.5 l.3 -2.4"
transform="rotate(120 12 12)" />
<path d="M12 5 A7 7 0 0 1 18 8.5"
transform="rotate(240 12 12)" />
<path d="M18 8.5 l-2.4 .3 M18 8.5 l.3 -2.4"
transform="rotate(240 12 12)" />
</g>
</defs>
</svg>
<div class="about-loop__step" data-node="01">
<h3>People test, and state the conditions.</h3>
<p>In the <a href="/lab.html">browser lab</a>, with water-based
makeup, printed patterns or anything else worth trying. A result
is packaged as a Ghostyle, a modular AR intervention others can
apply, inspect and retest. Every result is local, conditional
and temporary until someone tests it again.</p>
</div>
<svg class="about-loop__arc" viewBox="11.7 3.45 6.9 6.9"
aria-hidden="true" focusable="false">
<use href="#gm-loop-arc" />
</svg>
<div class="about-loop__step" data-node="02">
<h3>Informed people report what is really deployed.</h3>
<p>A browser pipeline is not a deployed system. Evidence from
people who build, sell, operate, approve or encounter face
recognition tells us which technologies are in circulation, and
whether our camouflage is being tested against anything close to
them. <a href="/report.html">Leak to us</a> is where that
arrives.</p>
</div>
<svg class="about-loop__arc" viewBox="11.7 3.45 6.9 6.9"
aria-hidden="true" focusable="false">
<use href="#gm-loop-arc" />
</svg>
<div class="about-loop__step" data-node="03">
<h3>The Fediverse carries the research outward.</h3>
<p>Results, limits and references are published through
ActivityPub rather than locked into one website, so other
communities and applications can follow, question and reproduce
the work. More distribution means more tests, and more routes
back to people who know something.
<a href="/fediverse.html">Follow it there</a>.</p>
</div>
<div class="about-loop__again">
<svg class="about-loop__icon" viewBox="0 0 24 24"
aria-hidden="true" focusable="false">
<use href="#gm-loop-icon" />
</svg>
<p>Then the loop closes: verified evidence changes the archive,
the threat model and the next round of tests.</p>
</div>
</div>
<div class="callout">
<p>Two honest limits on that diagram. The return arrow, the lab
reading validated updates back from the network, is the intended
architecture and is not operational yet. And the loop does not
claim that public visibility on its own changes institutional
power. It builds shared, testable knowledge, and a path by which
new evidence can change the research.</p>
</div>
</section>
<div class="content-page__layout">
<div class="content-page__main gm-prose">
<section class="content-section" id="sources">
<h2>Informed sources welcome.</h2>
<p>The <a href="/report.html">reporting node</a> runs on
GlobaLeaks and is built for seven positions, because each one
sees a different part of the same system. There is a separate
questionnaire for each.</p>
<ul class="about-publics">
<li><b>You build or maintain the technology.</b> You know how a
system is assembled, what it covers and who touches the
data.</li>
<li><b>You know where a deployment falls apart.</b> A specific
system that is misconfigured, unmaintained or easy to read
from outside.</li>
<li><b>You have seen the paperwork.</b> Contracts, tenders,
vendor pitches, internal evaluations.</li>
<li><b>You operate a system day to day.</b> You watch the
alerts, override the false matches and log who gets
flagged.</li>
<li><b>You approved it, funded it or signed it off.</b> Public
tenders, impact assessments, oversight reports.</li>
<li><b>You noticed something in public space.</b> A camera, a
kiosk, a sign, a badge. No inside access needed.</li>
<li><b>You were stopped, flagged or misidentified.</b>
Something went wrong on the other side of the lens, and it
happened to you.</li>
</ul>
<div class="callout">
<p>None of this is an invitation to disclose sensitive material
casually. Read the safety guidance on the
<a href="/report.html">reporting page</a> before you write
anything, describe what you saw in your own words rather than
uploading originals where you can, and do not continue if
doing so would put you at risk.</p>
</div>
</section>
<section class="content-section" id="why">
<h2>Why it exists.</h2>
<div class="about-why">
<div>
<p>Face recognition arrived in public space without anyone
being asked, and it is normalised through consumer products
before it is ever debated as infrastructure. Smart glasses
put a camera at eye level with no housing, no notice and no
moment in which you are told a read happened. What is sold
as convenience for the person wearing them is an
unannounced identification system for everyone standing in
front of them.</p>
</div>
<figure class="about-figure">
<img src="/images/various/epstain-would-endorse-meta-perv-glasses.webp"
alt="Meta perv glasses works best for people that stops on others' consent."
loading="lazy">
<figcaption>
Example of Meta's perv glasses, shining their best in people that stop on others' consent, via <a href="https://www.instagram.com/everyonehateselon_/">EveryOneHatesElon</a> (IG).
</figcaption>
</figure>
</div>
<div class="callout">
<h3>A ban that keeps getting reopened.</h3>
<p>In Europe, real-time remote biometric identification in
publicly accessible spaces for law enforcement is treated as
a prohibited AI practice, subject to narrow exceptions. The
<a href="https://reclaimyourface.eu/">Reclaim Your Face</a>
campaign spent years getting that prohibition written, and
reporting from the campaign has documented national
authorities working around the limits rather than complying
with them: carve-outs for major events, "special" cases,
pilot deployments. A prohibition that is quietly reopened by
securitarian framing needs the same public pressure and
evidence-gathering that produced it. That is part of why the
reporting node exists here.</p>
</div>
</section>
<section class="content-section" id="who">
<h2>Who is behind it.</h2>
<p>Ghostmaxxing was developed by Claudio Agosti for the 2026 NINA
festival, where it ran as <i>Ghòstati</i> (become a ghost), a
workshop held with the participation of
<a href="https://michelletylicki.com/">Michelle Tylicki</a>.
Tylicki had been running adversarial makeup workshops before
us: her installation <a
href="https://michelletylicki.com/dazzle">DAZZLE</a>,
developed with Lauri Love, is an art-and-tech piece for
teaching Computer Vision Dazzle. We added the application, and
learned the workshop from people who had already been doing
it.</p>
<p>What began as a workshop assistant has since been generalised,
internationalised and expanded. The same code now has to work
for a facilitator in a city none of us has visited, which
changes the research question from "did this look work in this
room" to "does anything we found here transfer at all".</p>
</section>
<section class="content-section" id="built">
<h2>How it is built.</h2>
<p>Two repositories, split by where the code runs.</p>
<dl class="about-repos">
<dt><a
href="https://github.com/vecna/ghostmaxxing">ghostmaxxing</a></dt>
<dd>The site and the browser lab. It runs locally: clone it,
serve it, and the whole test bench works on your own machine
with no server involved.</dd>
<dt><a
href="https://github.com/vecna/gstmxx-backend">gstmxx-backend</a></dt>
<dd>The server side running on vecna.eu. It handles the parts
that are online by definition, such as moderated uploads and
the shared gallery.</dd>
</dl>
<p>Workshops run on people, not infrastructure. There is a Signal
group for facilitators, and the
<a href="/workshops.html">workshops page</a> is meant to grow
into a way of matching activists who can facilitate with groups
who want a session, anywhere in the world.</p>
<div class="callout">
<p>Ghostmaxxing has no funding. It is volunteer work, and it is
built by technologists working in the public interest rather
than by an organisation with a budget line. Facilitators
should not treat that as a reason to work for free: asking a
host for expenses and hospitality is reasonable, and a small
contribution on top of that is fair.</p>
</div>
</section>
<section class="content-section" id="vision">
<h2>Vision.</h2>
<ul>
<li>Make the workshop easier to run.</li>
<li>Make adversarial makeup a popular practice, not a niche
one.</li>
<li>Collect evidence of what actually works.</li>
<li>Support new forms: clothing, 3D-printed objects, and
beyond.</li>
<li>Support new research.</li>
<li>Use network effects to test everywhere, share results and
keep improving.</li>
</ul>
<p>Underneath all six sits one research question: how little
makeup is needed to disrupt a face-recognition pipeline? Less
paint matters because it lowers the barrier to practice. A look
that takes two lines instead of a full mask is easier to learn,
easier to repeat and easier to move from an exceptional
workshop performance into everyday culture. The aim is not to
sell invisibility. It is to make adversarial makeup legible
enough to become an ordinary thing people do.</p>
</section>
<section class="content-section" id="engage">
<h2>How to engage with it.</h2>
<p>Follow Ghostmaxxing in the Fediverse: that is where results,
limits and updates are published, and where a test can reach
someone able to reproduce or challenge it. The largest success
available to this project is not a perfect pattern. It is
adversarial makeup becoming popular, frequent and fun enough
that a face which does not resolve stops being remarkable.</p>
<div class="resource-grid">
<a class="resource-card" href="/lab.html">
<h3>Open the lab</h3>
<p>Run local browser tests and watch a recognition pipeline
react to your face in real time.</p>
</a>
<a class="resource-card" href="/loader.html">
<h3>Video Loader</h3>
<p>Run pre-recorded MP4 tests to extract and compare face
signatures frame by frame.</p>
</a>
<a class="resource-card" href="/references/">
<h3>Research references</h3>
<p>Trace the artistic, technical and activist lineage of
face-obfuscation work.</p>
</a>
<a class="resource-card" href="/docs/">
<h3>Technical documentation</h3>
<p>Inspect modules, plugin logic and implementation
details.</p>
</a>
<a class="resource-card" href="/workshops.html">
<h3>Workshops</h3>
<p>See how a session runs, or offer to facilitate one where
you are.</p>
</a>
<a class="resource-card" href="/report.html">
<h3>Leak to us</h3>
<p>Help investigate the real-world pipeline and supply chain
of face recognition.</p>
</a>
</div>
</section>
</div>
<aside class="content-page__aside">
<h2>On this page</h2>
<nav aria-label="Page sections">
<a href="#loop">What's Ghostmaxxing</a>
<a href="#sources">Informed sources welcome</a>
<a href="#why">Why it exists</a>
<a href="#who">Who is behind it</a>
<a href="#built">How it is built</a>
<a href="#vision">Vision</a>
<a href="#engage">How to engage with it</a>
</nav>
</aside>
</div>
</div>
</main>
<!-- ===== SITE FOOTER — canonical. Byte-identical on every page. =========
Pyre band, soil edge, link row. Replaces the .camera-band div, which
pointed at images/homepage-camera-band.svg — not in the repo, so it only
ever painted a faint gradient. The camera icons are INLINE <svg>: the
files in images/icons/ are class-driven and render black through <img>.
==================================================================== -->
<footer class="gm-site-footer">
<div class="gm-site-footer__pyre" data-mode="full">
<img src="/images/motifs/pyre.svg" alt aria-hidden="true" />
</div>
<img class="gm-site-footer__edge" src="/images/motifs/soil-edge.svg" alt
aria-hidden="true" />
<div class="gm-site-footer__row">
<div class="gm-site-footer__cams">
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true"
focusable="false">
<path class="cam-mount" d="M6,29 H94" stroke-width="7"></path>
<path class="cam-shell" d="M20,29 A30,30 0 0 0 80,29 Z"></path>
<circle class="cam-lens" cx="50" cy="44" r="15"></circle>
<circle class="cam-iris" id="iris-dome" cx="50" cy="44"
r="6.6"></circle>
<circle class="cam-glint" cx="45.5" cy="39.5" r="2.55"></circle>
</svg>
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true"
focusable="false">
<path class="cam-mount" d="M80,26 V92" stroke-width="6"></path>
<path class="cam-mount" d="M80,30 H44" stroke-width="6"></path>
<path class="cam-mount" d="M52,30 V40" stroke-width="5"></path>
<rect class="cam-shell" x="10" y="40" width="72" height="30"
rx="7"></rect>
<rect class="cam-panel" x="54" y="47" width="22" height="16"
rx="3"></rect>
<g class="cam-dot"><circle cx="60" cy="51" r="2"></circle><circle
cx="70" cy="51" r="2"></circle><circle cx="60" cy="59"
r="2"></circle><circle cx="70" cy="59" r="2"></circle></g>
<circle class="cam-lens" cx="32" cy="55" r="12"></circle>
<circle class="cam-iris" id="iris-street" cx="32" cy="55"
r="5.3"></circle>
<circle class="cam-glint" cx="28.4" cy="51.2" r="2"></circle>
</svg>
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true"
focusable="false">
<path class="cam-mount" d="M8,44 L2,32 M92,44 L98,32"
stroke-width="5"></path>
<path class="cam-shell"
d="M50,45 C65,25 90,25 90,45 C90,65 65,65 50,45 C35,25 10,25 10,45 C10,65 35,65 50,45 Z"
stroke-linecap="round"></path>
<path class="cam-glare" d="M22,52 L34,38 M29,53 L37,44"></path>
<path class="cam-glare" d="M66,52 L78,38 M73,53 L81,44"></path>
<circle class="cam-iris cam-iris--void" id="iris-glasses-l" cx="28"
cy="45" r="9"></circle>
<circle class="cam-iris cam-iris--void" id="iris-glasses-r" cx="72"
cy="45" r="9"></circle>
</svg>
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true"
focusable="false">
<path class="cam-mount" d="M45,30 V12 M32,12 H58"
stroke-width="5"></path>
<rect class="cam-shell" x="16" y="36" width="66" height="34"
rx="5"></rect>
<path class="cam-mount" d="M12,30 H74 L84,40"
stroke-width="5"></path>
<circle class="cam-lens" cx="60" cy="51" r="14"></circle>
<circle class="cam-iris" id="iris-bullet" cx="60" cy="51"
r="6.2"></circle>
<circle class="cam-glint" cx="55.8" cy="46.8" r="2.4"></circle>
</svg>
</div>
<div class="gm-site-footer__links">
<a href="/docs/">Technical documentation</a>
<a href="https://github.com/vecna/ghostmaxxing">Code</a>
<a href="/loader.html">Video Loader</a>
</div>
</div>
</footer>
<script src="/pages-js/nav.js" defer></script>
</body>
</html>