Repository navigation
Expand file tree
/
Copy pathabout.html
More file actions
513 lines (468 loc) · 28 KB
/
Copy pathabout.html
File metadata and controls
513 lines (468 loc) · 28 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
<!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 develops the independent camouflage lab. Ghòstati!, part of NINA's Universal Union, organises workshops and handles whistleblowing.">
<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="Ghostmaxxing develops the independent camouflage lab. Ghòstati!, part of NINA's Universal Union, organises workshops and handles whistleblowing.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://ghostmaxxing.vecna.eu/about.html">
<meta property="og:image" content="https://ghostmaxxing.vecna.eu/images/social/ghostmaxxing-generic.jpg">
<meta property="og:image:type" content="image/jpeg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Ghostmaxxing: test face-recognition camouflage in your browser.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Vision & About — Ghostmaxxing">
<meta name="twitter:description" content="Ghostmaxxing develops the independent camouflage lab. Ghòstati!, part of NINA's Universal Union, organises workshops and handles whistleblowing.">
<meta name="twitter:image" content="https://ghostmaxxing.vecna.eu/images/social/ghostmaxxing-generic.jpg">
<meta name="twitter:image:alt" content="Ghostmaxxing: test face-recognition camouflage in your browser.">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "AboutPage",
"@id": "https://ghostmaxxing.vecna.eu/about.html#webpage",
"url": "https://ghostmaxxing.vecna.eu/about.html",
"name": "Vision & About — Ghostmaxxing",
"description": "Ghostmaxxing develops the independent camouflage lab. Ghòstati!, part of NINA's Universal Union, organises workshops and handles whistleblowing.",
"about": {
"@id": "https://ghostmaxxing.vecna.eu/#project"
},
"author": {
"@id": "https://me.vecna.eu/#vecna"
},
"mentions": [
{
"@type": "Project",
"name": "Ghòstati!",
"url": "https://sindacato.nina.watch/en/initiatives/ghostati/"
}
]
},
{
"@type": "Project",
"@id": "https://ghostmaxxing.vecna.eu/#project",
"name": "Ghostmaxxing",
"url": "https://ghostmaxxing.vecna.eu/",
"description": "Independent free software for local face-recognition camouflage experiments and an optional moderated Fediverse gallery.",
"author": {
"@id": "https://me.vecna.eu/#vecna"
},
"sourceOrganization": {
"@id": "https://nina.watch/#organization"
},
"sameAs": [
"https://github.com/vecna/ghostmaxxing"
]
},
{
"@type": "Person",
"@id": "https://me.vecna.eu/#vecna",
"name": "Claudio Agosti",
"alternateName": "vecna",
"url": "https://me.vecna.eu/",
"sameAs": [
"https://github.com/vecna",
"https://retro.pizza/@vecna"
]
},
{
"@type": "Organization",
"@id": "https://nina.watch/#organization",
"name": "NINA / Universal Digital Union",
"url": "https://nina.watch/",
"description": "The organization for which vecna developed the initial Ghostmaxxing concept; currently responsible for its workshops and separate whistleblowing platform."
}
]
}
</script>
<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">
<link rel="stylesheet" href="/styles/camera-stage.css">
</head>
<body>
<!-- Static navigation; keep generator copies in sync. -->
<!-- NAVIGATION: intentionally duplicated in pages and generators. See tutorials/navigation-maintenance.md. -->
<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>
<button class="gm-site-nav-toggle" type="button" aria-expanded="false" aria-controls="gmPrimaryNav" hidden>Menu</button>
<nav class="gm-site-nav" id="gmPrimaryNav" aria-label="Primary">
<details class="gm-site-nav__group gm-site-nav__group--tools">
<summary class="gm-site-nav__trigger" aria-controls="gmToolsMenu">Tools <span aria-hidden="true">▾</span></summary>
<div class="gm-site-menu" id="gmToolsMenu"><ul>
<li><a href="/lab.html">Camouflage lab</a><small>Apply Ghostyles and compare local results.</small></li>
<li><a href="/loader.html">Video analyser</a><small>Analyse a recorded makeup video.</small></li>
<li><a href="/realtime.html">Makeup Explorer</a><small>See how makeup changes face descriptors in real time.</small></li>
</ul></div>
</details>
<details class="gm-site-nav__group ">
<summary class="gm-site-nav__trigger" aria-controls="gmExploreMenu">Explore <span aria-hidden="true">▾</span></summary>
<div class="gm-site-menu" id="gmExploreMenu"><div><p class="gm-site-menu__kicker">Understand</p><ul>
<li><a href="/about.html" aria-current="page">About Ghostmaxxing</a></li>
<li><a href="/genealogy.html">Genealogy</a></li>
<li><a href="/references/">Research references</a></li>
<li><a href="/projects/">Related projects</a></li>
</ul></div><div><p class="gm-site-menu__kicker">Use and contribute</p><ul>
<li><a href="/docs/">Documentation</a></li>
<li><a href="/gallery.html">Gallery</a></li>
<li><a href="/fediverse.html">Fediverse integration</a></li>
<li><a href="https://github.com/vecna/ghostmaxxing">Source code ↗</a></li>
</ul></div></div>
</details>
<details class="gm-site-nav__group gm-site-nav__group--nina">
<summary class="gm-site-nav__trigger" aria-controls="gmNinaMenu">Ghòstati! / NINA <span aria-hidden="true">▾</span></summary>
<div class="gm-site-menu" id="gmNinaMenu"><div><p class="gm-site-menu__intro">Workshops, collective action and confidential reporting, organised by NINA’s Universal Union.</p><ul>
<li><a href="https://sindacato.nina.watch/it/blog/">Union blog · Italiano ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/blog/">Union blog · English ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/initiatives/ghostati/">Ghòstati! initiative & workshops ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/ghostati/report/">Confidential reporting at NINA ↗</a></li>
</ul></div></div>
</details>
</nav>
<a class="gm-site-cta" href="/lab.html">Open the lab</a>
</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><i>Contest</i> the spreading of biometric surveillance.</h1>
<p class="content-page__lead">
Ghostmaxxing is a public research lab for testing face-recognition
camouflage in the browser and documenting local experimental results.
NINA’s Universal Union coordinates the workshops and confidential
reporting through its Ghòstati! initiative.
</p>
<p class="content-page__deck">
Use the <b>lab</b> to test camouflage, the <b>archive</b> to find prior work,
and <a href="https://sindacato.nina.watch/en/ghostati/report/">NINA’s reporting channel</a>
to share evidence of deployments and abuse.
</p>
</section>
<div class="content-page__layout">
<div class="content-page__main gm-prose">
<section class="content-section" id="why">
<h2>Why Ghostmaxxing?</h2>
<div class="about-why">
<div>
<p>Face recognition is sold as security and convenience, despite evidence of abuse. Consumer <a href="https://techcrunch.com/2025/08/20/harvard-dropouts-to-launch-always-on-ai-smart-glasses-that-listen-and-record-every-conversation" target="_blank" rel="noopener noreferrer">products</a> are making it commonplace.
</p>
<p>Face-recognition abuse is a political problem as well as a technical one.
Ghostmaxxing develops the free software and documents local experiments.
<a href="https://sindacato.nina.watch/en/initiatives/ghostati/">Ghòstati!</a>,
part of <a href="https://sindacato.nina.watch/en/">NINA's Universal Union</a>,
organises collective action, workshops and whistleblowing around biometric surveillance.</p>
</div>
<figure class="about-figure">
<img src="/images/various/epstain-would-endorse-meta-perv-glasses.webp" alt="Subvertinging of Meta's glasses with Jeffry Epstein endorsing them; Irony intended to highlight the lack of genuine consent." loading="lazy">
<figcaption>
Meta's pervert glasses at their best, with people who stomp
on other people's consent, via <a href="https://www.instagram.com/everyonehateselon_/">EveryOneHatesElon</a>
(IG).
</figcaption>
</figure>
</div>
</section>
<section class="content-section" id="who">
<h2>Who is behind it.</h2>
<p>Ghostmaxxing is free software, and all contributions are welcome. Your
friendly techno-activist <a href="https://me.vecna.eu">Vecna</a> is
maintaining it as part of an attempt to explore how a concept born locally
can be global. The project began in spring 2026 for the
<a href="https://nina.watch">NINA</a> festival, alongside the initiative
<a href="https://sindacato.nina.watch/it/iniziative/ghostati/" target="_blank"><i>Ghòstati</i></a> ("become a ghost"), which is part
of an even more visionary experimental concept called the
<a href="https://sindacato.nina.watch/en" target="_blank">Universal
Digital Union</a>. The first workshop was held with
<a href="https://michelletylicki.com/">Michelle Tylicki</a>'s
participation. Michelle had previous experience in adversarial makeup
and had hosted the <a href="https://michelletylicki.com/dazzle">DAZZLE</a>
installation.
</p>
<p>Ghostmaxxing is now an independent software project. Its development,
<a href="/fediverse.html">Fediverse gallery</a>,
<a href="/references/">research references</a> and
<a href="/projects/">related projects</a> remain here. NINA and other groups can
run their own copy of the browser laboratory.</p>
<section id="nina-universal-union">
<h3>Workshops and whistleblowing: NINA's Universal Union</h3>
<p><a href="https://sindacato.nina.watch/en/initiatives/ghostati/">Ghòstati!</a>
is the name of the political initiative in both Italian and English.
It belongs to <a href="https://sindacato.nina.watch/en/">NINA's Universal Union</a>.
NINA organises the <a href="https://sindacato.nina.watch/en/blog/ghostati-workshop-october-2026/">workshops and facilitator network</a>
and handles <a href="https://sindacato.nina.watch/en/ghostati/report/">whistleblowing reports about real-world face recognition</a>
through its separate GlobaLeaks installation.</p>
<p>These confidential reports are separate from the optional clips submitted to
the Ghostmaxxing gallery. Gallery submissions go to this software project's server
for moderation and possible Fediverse publication; whistleblowing goes to NINA.</p>
<p>Read the workshop guide in <a href="https://sindacato.nina.watch/it/blog/ghostati-workshop-ottobre-2026/">Italian</a>
or <a href="https://sindacato.nina.watch/en/blog/ghostati-workshop-october-2026/">English</a>, and the reporting guidance in
<a href="https://sindacato.nina.watch/it/ghostati/segnalazioni/">Italian</a>
or <a href="https://sindacato.nina.watch/en/ghostati/report/">English</a>.</p>
</section>
</section>
<!-- ======================================================================
THE STAGE. Six camera types, six steps.
Tap a type: every camera of it leaves the field, and a fact appears with
the camera beside it, drawn LIVE, because the sentence is about
something it does now.
Behind the field, visible from the first paint, is the plume head.
At six of six the ground crosses soil -> cream over two seconds and the
whirlwind arrives. It is not a win screen. The closing line says what is
still true.
plume-head.svg is a PAINTED files, so <img> is correct.
The cam-*.svg below are class-driven and must stay templates: through
<img> they render solid black.
=================================================================== -->
<section id="camStage" class="cam-stage" data-cleared="0" aria-label="Surveillance landscape: tap a camera to read a fact about it">
<img id="camPlume" class="cam-plume" src="/images/motifs/plume-head.svg" alt="" aria-hidden="true">
<div id="camField" style="position:absolute;inset:0;z-index:2"></div>
<!-- <img class="cam-whirl" src="/images/motifs/whirlwind.svg" alt="" aria-hidden="true" /> -->
<div id="camHalfTop" class="cam-half top" aria-live="polite"></div>
<div id="camHalfBottom" class="cam-half bottom" aria-live="polite"></div>
<div id="camFinale" class="cam-finale" hidden="">
<p class="cam-finale__line gm-prose">
<a type="button" class="btn btn-final" href="/genealogy.html">
<span class="about-route__kicker">Genealogy</span>
</a>
<a type="button" class="btn btn-final" href="/projects/">
<span class="about-route__kicker">Complementary projects</span>
</a>
<a type="button" class="btn btn-final" href="/references/">
<span class="about-route__kicker">Papers and culture</span>
</a>
</p>
<div class="cam-finale__actions">
<a class="gm-site-cta" href="/lab.html">Open the lab
↗</a>
<button type="button" id="camReset" class="cam-reset">Put them
back
</button>
</div>
</div>
</section>
<section class="content-section" id="vision">
<h2>Vision / Goals / Wishes</h2>
<ul>
<li>Make adversarial makeup <b>a popular practice</b>.</li>
<li>Make <a href="https://sindacato.nina.watch/en/blog/ghostati-workshop-october-2026/">workshops</a> easier to
run.</li>
<li>Test existing clothing, 3D-printed objects, hats and lights.</li>
<li>Compare camouflage results and how much they change appearance.</li>
<li>Document weaknesses in deployed face-recognition systems.</li>
</ul>
</section>
<section class="content-section about-loop-section" id="loop">
<h2>How Does Ghostmaxxing Work?</h2>
<div class="about-loop">
<div class="about-loop__step" data-node="01">
<h3>Test camouflage</h3>
<p>
Try makeup, privacy clothing or another intervention. Share results
so others can retest them.
<br>
<i>Every result is local: you share it only if you want
to.</i>
</p>
<h3><br><a href="lab.html">Open the lab</a>
</h3>
</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"></use>
</svg>
<div class="about-loop__step" data-node="02">
<h3>Report deployments</h3>
<p>This lab uses open-source components, and it cannot establish performance against deployed systems.
<b>People who build, sell, operate or encounter them</b> can
provide evidence through the reporting channel.
<br>
</p><h3>
<a href="https://sindacato.nina.watch/en/ghostati/report/">Read the reporting guidance</a>
</h3>
<p></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"></use>
</svg>
<div class="about-loop__step" data-node="03">
<h3>Share and retest</h3>
<p>It's a collective effort to find the <i>least invasive</i> method to break face
recognition.
A federated content sharing network is the natural environment for
pushing and pulling results, inviting replications and learning more.
</p><h3><br>
<a href="/fediverse.html">Follow it there</a>
</h3>
<p></p>
</div>
</div>
<div class="callout">
<h3>Challenge surveillance policy</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 fought for that prohibition, but the surveillance state won.
Ghostmaxxing investigates deployments and challenges their normalisation.
</p>
</div>
</section>
<section class="content-section" id="sources">
<h2>Informants wanted! How to safely report?</h2>
<p>The <a href="https://sindacato.nina.watch/en/ghostati/report/">reporting node</a> runs on
<a href="https://globaleaks.org" target="_blank" rel="noopener noreferrer">GlobaLeaks</a>, and there is a
dedicated questionnaire for each kind of informant.</p>
<div class="callout">
<p>
Read the safety guidance on the
<a href="https://sindacato.nina.watch/en/ghostati/report/">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="built">
<h2>Fork the code.</h2>
<dl class="about-repos">
<dt><a href="https://github.com/vecna/ghostmaxxing">ghostmaxxing</a>
(on GitHub)</dt>
<dd>Clone and serve the site to run the browser lab locally.
See the <a href="/docs/">documentation</a>.</dd>
</dl>
</section>
</div>
<aside class="content-page__aside">
<h2>About the project</h2>
<nav aria-label="Page sections">
<a href="#why">Why Ghostmaxxing</a>
<a href="#who">Who is behind it</a>
<a href="#camField">Camera field</a>
<a href="#vision">Goals</a>
<a href="#loop">How it works</a>
<a href="#sources">What we need</a>
<a href="#built">Fork the code</a>
</nav>
</aside>
</div>
</div>
</main>
<!-- Static footer; keep generator copies in sync. -->
<!-- FOOTER: intentionally duplicated; update the generator copies too. -->
<footer class="gm-site-footer">
<div class="gm-site-footer__pyre" data-mode="cropped"><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__inner">
<a class="gm-site-footer__brand" href="/"><img src="/images/logo/mark-ondark.svg" width="32" height="32" alt="" aria-hidden="true">Ghostmaxxing</a>
<nav class="gm-site-footer__columns" aria-label="Footer">
<section><h2>Tools</h2><ul>
<li><a href="/lab.html">Camouflage lab</a></li>
<li><a href="/loader.html">Video analyser</a></li>
<li><a href="/realtime.html">Makeup Explorer</a></li>
</ul></section>
<section><h2>Research</h2><ul>
<li><a href="/genealogy.html">Genealogy</a></li>
<li><a href="/references/">Research references</a></li>
<li><a href="/projects/">Related projects</a></li>
</ul></section>
<section><h2>Project</h2><ul>
<li><a href="/about.html" aria-current="page">About Ghostmaxxing</a></li>
<li><a href="/gallery.html">Gallery</a></li>
<li><a href="/docs/">Documentation</a></li>
<li><a href="/docs/jsdoc/">API reference</a></li>
<li><a href="/fediverse.html">Fediverse integration</a></li>
<li><a href="https://github.com/vecna/ghostmaxxing">Source code ↗</a></li>
<li><a href="https://github.com/vecna/gstmxx-backend">Backend source ↗</a></li>
</ul></section>
<section><h2>Ghòstati! at NINA</h2><ul>
<li><a href="https://sindacato.nina.watch/it/blog/">Union blog · Italiano ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/blog/">Union blog · English ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/initiatives/ghostati/">Ghòstati! initiative & workshops ↗</a></li>
<li><a href="https://sindacato.nina.watch/en/ghostati/report/">Confidential reporting at NINA ↗</a></li>
</ul></section>
</nav>
<p class="gm-site-footer__responsibility">Ghostmaxxing develops the software. Ghòstati!, part of <a href="https://sindacato.nina.watch/en/">NINA’s Universal Union ↗</a>, organises workshops and handles confidential reporting.</p>
</div>
</footer>
<!-- Camera icon source, cloned by pages-js/index.js into the hero field.
These are TEMPLATES, not <img>: images/icons/cam-*.svg are class-driven
(class="cam-shell", no fill attribute), so an <img src="…"> of one has no
stylesheet and every shape falls back to black. Cloned into the document
they are ordinary nodes and cameras.css paints them. Geometry here is a
verbatim copy of images/icons/. That directory stays the source. -->
<template id="camtpl-dome">
<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>
</template>
<template id="camtpl-cube">
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true" focusable="false">
<path class="cam-mount" d="M50,16 V6 M38,6 H62" stroke-width="5"></path>
<rect class="cam-shell" x="16" y="16" width="68" height="68" rx="19"></rect>
<circle class="cam-dot cam-dot--ring" cx="73" cy="26" r="3.4"></circle>
<circle class="cam-lens" cx="50" cy="50" r="17"></circle>
<circle class="cam-iris" id="iris-cube" cx="50" cy="50" r="7.5"></circle>
<circle class="cam-glint" cx="44.9" cy="44.9" r="2.9"></circle>
</svg>
</template>
<template id="camtpl-glasses">
<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>
</template>
<template id="camtpl-pill">
<svg class="cam" viewBox="0 0 100 100" aria-hidden="true" focusable="false">
<path class="cam-mount" d="M40,36 V22 M28,22 H52" stroke-width="5"></path>
<rect class="cam-shell" x="6" y="36" width="88" height="28" rx="14"></rect>
<g class="cam-dot cam-dot--dark"><circle cx="62" cy="44" r="2"></circle><circle cx="70" cy="50" r="2"></circle><circle cx="62" cy="56" r="2"></circle><circle cx="78" cy="45" r="2"></circle><circle cx="80" cy="55" r="2"></circle><circle cx="86" cy="50" r="2"></circle></g>
<circle class="cam-lens" cx="30" cy="50" r="12"></circle>
<circle class="cam-iris" id="iris-pill" cx="30" cy="50" r="5.3"></circle>
<circle class="cam-glint" cx="26.4" cy="46.4" r="2"></circle>
</svg>
</template>
<template id="camtpl-street">
<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>
</template>
<template id="camtpl-bullet">
<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>
</template>
<script src="/pages-js/nav.js" defer=""></script>
<script src="/pages-js/camera-stage.js"></script>
</body></html>