-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
861 lines (768 loc) · 75 KB
/
Copy pathindex.html
File metadata and controls
861 lines (768 loc) · 75 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
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
<!doctype html>
<!--
SPDX-License-Identifier: AGPL-3.0-or-later
Copyright (c) 2026 Kristian Kramer
DeskTest.net: free diagnostic tools for front-desk IT.
Source: https://github.com/tech1k/desktest
For commercial licensing without AGPL obligations, contact the copyright holder.
-->
<html lang="en">
<head>
<meta charset="utf-8">
<script>(function(){try{var t=localStorage.getItem('desktest-theme');if(t==='light'||t==='dark')document.documentElement.setAttribute('data-theme',t)}catch(e){}})();</script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>DeskTest.net - Free diagnostic tools for front-desk IT</title>
<meta name="description" content="Free, open-source diagnostic pages for front-desk IT. Each tool runs in your browser. No accounts, no tracking, no telemetry.">
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0d1117" media="(prefers-color-scheme: dark)">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='6' y='7' width='20' height='14' rx='2.5' stroke-width='2.2'/%3E%3Cpath d='M16 21v3.5M11.5 25h9' stroke-width='2.2'/%3E%3Cpath d='M10.6 14.2l3 3 6.1-6.1' stroke-width='2.7'/%3E%3C/g%3E%3C/svg%3E">
<link rel="canonical" href="https://desktest.net/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="DeskTest.net">
<meta property="og:url" content="https://desktest.net/">
<meta property="og:title" content="DeskTest.net - Free diagnostic tools for front-desk IT">
<meta property="og:description" content="Free, open-source diagnostic pages for desktop peripherals and front-desk IT software. Each tool runs in your browser. No accounts, no tracking, no telemetry.">
<meta name="twitter:card" content="summary_large_image">
<meta property="og:image" content="https://desktest.net/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:image" content="https://desktest.net/og.png">
<meta name="twitter:title" content="DeskTest.net - Free diagnostic tools for front-desk IT">
<meta name="twitter:description" content="Free, open-source diagnostic pages for desktop peripherals and front-desk IT software. Each tool runs in your browser. No accounts, no tracking, no telemetry.">
<style>
*,*::before,*::after{box-sizing:border-box}
:root{
color-scheme:light dark;
--bg:#ffffff;
--bg-alt:#f6f8fa;
--text:#1f2328;
--text-muted:#57606a;
--border:#d0d7de;
--border-strong:#afb8c1;
--accent:#0969da;
--accent-hover:#0860c8;--accent-strong:#0969da;
--info-bg:#ddf4ff;
--info-border:#b6e3ff;
--info-text:#0a3069;
--logo-bg:var(--accent);
--logo-fg:#ffffff;
}
@media (prefers-color-scheme: dark){
:root{
--bg:#0d1117;
--bg-alt:#161b22;
--text:#e6edf3;
--text-muted:#8b949e;
--border:#30363d;
--border-strong:#484f58;
--accent:#2f81f7;
--accent-hover:#1f6feb;--accent-strong:#1a6fea;
--info-bg:rgba(56,139,253,.12);
--info-border:rgba(56,139,253,.4);
--info-text:#79c0ff;
}
}
:root[data-theme="light"]{color-scheme:light;--bg:#ffffff;
--bg-alt:#f6f8fa;
--text:#1f2328;
--text-muted:#57606a;
--border:#d0d7de;
--border-strong:#afb8c1;
--accent:#0969da;
--accent-hover:#0860c8;--accent-strong:#0969da;
--info-bg:#ddf4ff;
--info-border:#b6e3ff;
--info-text:#0a3069;
--logo-bg:var(--accent);
--logo-fg:#ffffff;}:root[data-theme="dark"]{color-scheme:dark;--bg:#0d1117;
--bg-alt:#161b22;
--text:#e6edf3;
--text-muted:#8b949e;
--border:#30363d;
--border-strong:#484f58;
--accent:#2f81f7;
--accent-hover:#1f6feb;--accent-strong:#1a6fea;
--info-bg:rgba(56,139,253,.12);
--info-border:rgba(56,139,253,.4);
--info-text:#79c0ff;}
html,body{margin:0;padding:0;background:var(--bg);color:var(--text);font:14px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Segoe UI Variable",Roboto,"Helvetica Neue",Arial,sans-serif;-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
code{font-family:"Consolas","Cascadia Mono",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em;background:var(--bg-alt);border:1px solid var(--border);border-radius:3px;padding:1px 5px}
.topbar{border-bottom:1px solid var(--border);background:var(--bg)}
.skip-link{position:absolute;left:8px;top:-48px;z-index:200;background:var(--accent-strong);color:#fff;padding:8px 14px;border-radius:0 0 6px 6px;font-size:14px;font-weight:500;transition:top .12s}.skip-link:focus{top:0}
.topbar-inner{max-width:880px;margin:0 auto;padding:14px 24px;display:flex;align-items:center;gap:12px}
.logo{width:24px;height:24px;border-radius:3px;background:var(--logo-bg);color:var(--logo-fg);display:grid;place-items:center;font-weight:700;font-size:11px;letter-spacing:.02em}
.wordmark{font-weight:600;font-size:15px;letter-spacing:-.005em}
.wordmark-suffix{color:var(--text-muted);font-weight:400}
.topbar-right{margin-left:auto;font-size:13px;color:var(--text-muted);display:flex;align-items:center;gap:14px}.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text-muted);cursor:pointer;line-height:0}.theme-toggle:hover{color:var(--text);border-color:var(--border-strong)}.theme-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
main{max-width:880px;margin:0 auto;padding:40px 24px 64px}
.hero{margin-bottom:28px}
.hero h1{font-size:30px;line-height:1.2;margin:0 0 10px;font-weight:600;letter-spacing:-.015em}
.hero p.lede{margin:0 0 18px;color:var(--text-muted);font-size:16px;max-width:640px}
.info-box{border:1px solid var(--info-border);background:var(--info-bg);border-radius:6px;padding:10px 12px;display:flex;gap:10px;align-items:flex-start;font-size:13px;color:var(--info-text);margin-bottom:32px}
.info-box svg{flex-shrink:0;margin-top:1px}
.info-box strong{font-weight:600}
.section-title{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin:0 0 12px;padding-bottom:6px;border-bottom:1px solid var(--border)}
.checkup-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin:0 0 30px}
.checkup-cta{display:flex;flex-direction:column;align-items:flex-start;gap:11px;padding:18px 20px;height:100%;border:1px solid var(--accent);border-radius:10px;background:linear-gradient(150deg,var(--info-bg) 0%,transparent 78%);text-decoration:none;color:var(--text);transition:box-shadow .12s}
.checkup-cta:hover{text-decoration:none;box-shadow:0 2px 16px rgba(9,105,218,.18)}
.checkup-cta-ico{width:44px;height:44px;flex-shrink:0;border-radius:9px;background:var(--accent-strong);color:#fff;display:grid;place-items:center}
.checkup-cta-text{flex:1;min-width:0}
.checkup-cta-title{display:block;margin:0;font-weight:600;font-size:16px;letter-spacing:-.005em}
.checkup-cta-sub{display:block;margin:4px 0 0;font-size:13px;color:var(--text-muted);line-height:1.5}
.checkup-cta-go{flex-shrink:0;display:inline-flex;align-items:center;gap:6px;font-weight:600;font-size:14px;color:var(--accent);white-space:nowrap;margin-top:2px}
@media (max-width:640px){.checkup-grid{grid-template-columns:1fr;gap:12px}}
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;margin-bottom:36px}
.tool{border:1px solid var(--border);border-radius:8px;padding:16px;background:var(--bg);transition:border-color .12s,transform .08s;text-decoration:none;color:inherit;display:flex;flex-direction:column;min-height:160px}
.tool:hover{border-color:var(--border-strong);text-decoration:none}
.tool.is-live:hover{border-color:var(--accent);transform:translateY(-1px)}
.tool.is-soon{opacity:.72;cursor:default}
.tool-head{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.tool-ico{width:22px;height:22px;flex-shrink:0}
.tool-name{font-size:16px;font-weight:600;margin:0;flex:1;min-width:0}
.tool-desc{font-size:13px;color:var(--text-muted);margin:0 0 12px;flex:1}
.tool-meta{font-size:12px;color:var(--text-muted);font-family:"Consolas","Cascadia Mono",ui-monospace,monospace;margin-top:auto;display:flex;align-items:center;gap:6px}
.tool.is-live .tool-meta::after{content:"→";color:var(--accent);font-family:inherit;margin-left:auto;font-size:14px;font-weight:600}
.about{margin-top:36px;padding:18px;border:1px solid var(--border);border-radius:8px;background:var(--bg-alt)}
.about h2{font-size:15px;font-weight:600;margin:0 0 8px;letter-spacing:-.005em}
.about p{font-size:13.5px;color:var(--text);margin:0 0 8px;line-height:1.6}
.about p:last-child{margin-bottom:0}
.about ul{font-size:13.5px;color:var(--text);margin:6px 0 0;padding-left:20px;line-height:1.7}
footer{margin-top:48px;padding-top:18px;border-top:1px solid var(--border);color:var(--text-muted);font-size:12px;display:flex;flex-wrap:wrap;gap:14px;justify-content:space-between}
footer .build{font-family:"Consolas","Cascadia Mono",ui-monospace,monospace}
/* Tool search / filter. Progressive enhancement: injected by JS, so a no-JS
visitor sees the full static hub with no dead control. Additive - it only
hides non-matching cards; the categories and every card stay put. */
.toolsearch{margin:2px 0 26px}
.toolsearch-label{display:block;font-size:13px;font-weight:600;color:var(--text);margin:0 0 7px}
.toolsearch-field{position:relative;display:flex;align-items:center}
.toolsearch-ico{position:absolute;left:12px;color:var(--text-muted);pointer-events:none;display:flex}
/* border uses --text-muted (>=3:1 non-text contrast in both themes) so a low-vision
visitor sees the field edge, not the ~2:1 --border-strong used elsewhere */
.toolsearch input{width:100%;font:inherit;font-size:15px;padding:11px 42px 11px 38px;border:1px solid var(--text-muted);border-radius:8px;background:var(--bg);color:var(--text)}
.toolsearch input::placeholder{color:var(--text-muted)}
.toolsearch input:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:var(--accent)}
.toolsearch input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.toolsearch-clear{position:absolute;right:7px;border:0;background:transparent;color:var(--text-muted);cursor:pointer;font-size:15px;line-height:1;padding:5px 9px;border-radius:6px;display:none}
.toolsearch-clear:hover{background:var(--bg-alt);color:var(--text)}
.toolsearch.has-query .toolsearch-clear{display:block}
.toolsearch-count{margin:8px 2px 0;font-size:13px;color:var(--text-muted)}
.toolsearch-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;padding:0;margin:-1px}
.toolsearch-empty{margin:18px 0 30px;padding:20px;border:1px dashed var(--border-strong);border-radius:8px;text-align:center;color:var(--text-muted);font-size:14px}
.toolsearch-empty button{font:inherit;font-size:14px;font-weight:500;margin-left:4px;cursor:pointer;border:1px solid var(--accent);background:var(--accent-strong);color:#fff;padding:7px 14px;border-radius:6px}
.toolsearch-empty button:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
[data-search-hidden]{display:none !important}
/* a11y: focus indicators + reduced motion */
button:focus-visible,a:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}
button.primary:focus-visible,.btn-action:focus-visible{outline:2px solid #fff;outline-offset:-3px;box-shadow:0 0 0 2px var(--accent)}
@media (prefers-reduced-motion: reduce){*,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}.tool.is-live:hover{transform:none}}
/* Subtle page-load fade for the hub landing (not on tool pages - those stay instant). */
@keyframes pageIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
main{animation:pageIn .32s ease both}
</style>
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<header class="topbar">
<div class="topbar-inner">
<a href="/" class="logo" tabindex="-1" aria-hidden="true"><svg aria-hidden="true" viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="4.3" width="19" height="13" rx="2" stroke-width="1.7"/><path d="M9.5 20.7h5M12 17.3v3.4" stroke-width="1.7"/><path d="M7.7 10.8l2.7 2.7 5.9-5.9" stroke-width="2.2"/></svg></a>
<div class="wordmark"><a href="/" style="color:inherit;text-decoration:none" aria-label="DeskTest.net home">DeskTest<span class="wordmark-suffix">.net</span></a></div>
<div class="topbar-right"><button type="button" class="theme-toggle" aria-label="Switch between light and dark theme" title="Switch theme"><svg width="15" height="15" viewBox="0 0 16 16" aria-hidden="true" fill="none"><circle cx="8" cy="8" r="6.25" stroke="currentColor" stroke-width="1.5"/><path d="M8 1.75a6.25 6.25 0 000 12.5z" fill="currentColor"/></svg></button><a href="https://github.com/tech1k/desktest" rel="noopener" aria-label="DeskTest.net source on GitHub" style="display:inline-flex;align-items:center;gap:6px;color:inherit"><svg width="15" height="15" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>GitHub</a></div>
</div>
</header>
<main id="main" tabindex="-1">
<div class="hero">
<h1>Diagnostic tools for the front-desk computer</h1>
<p class="lede">Free, single-purpose test pages for the software and peripherals that run a front desk: scanners, signature pads, printers, document viewers. Each tool answers one question: <em>does this work right now?</em></p>
</div>
<div class="info-box">
<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true" focusable="false" fill="currentColor"><path d="M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm6.5-.25A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
<div><strong>Privacy:</strong> Every tool runs in your browser. Peripheral checks talk only to your local drivers; the network checks reach only the endpoints they name to measure your connection. No accounts, no tracking, no telemetry, and your files and inputs never leave your machine. View source on any tool to verify.</div>
</div>
<h2 class="section-title">Checkups & guided flows</h2>
<div class="checkup-grid">
<a class="checkup-cta" href="/checkup/" data-keywords="health full checkup overall everything not sure where to start general workstation">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" aria-hidden="true"><circle cx="16" cy="16" r="9" stroke-width="2.2"/><path d="M11.5 16.5l3 3 6-6.5" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Not sure where to start? Run the Full Workstation Checkup</span>
<span class="checkup-cta-sub">One click checks your browser, system, performance, network, web apps, and clock, then gives you a plain-language health report you can send straight to IT. Nothing to install.</span>
</span>
<span class="checkup-cta-go">Run checkup <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
<a class="checkup-cta" href="/connection-check/" data-keywords="internet wifi isp is it me slow internet cant connect provider">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 13a15 15 0 0 1 22 0" stroke-width="2.2"/><path d="M9.5 17.5a9 9 0 0 1 13 0" stroke-width="2.2"/><path d="M13.5 21.8a4 4 0 0 1 5 0" stroke-width="2.2"/><circle cx="16" cy="25.5" r="1.3" fill="currentColor" stroke="none"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Connection Check</span>
<span class="checkup-cta-sub">Is it your Wi-Fi, your ISP, or the service? A layered plain-language verdict in about a minute, plus a report you can send your provider.</span>
</span>
<span class="checkup-cta-go">Run check <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
<a class="checkup-cta" href="/meeting-check/" data-keywords="video call zoom teams meet interview telehealth ready camera mic speaker">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="9" width="16" height="14" rx="2.5" stroke-width="2.2"/><path d="M21 14l6-3.5v11L21 18" stroke-width="2.2"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Meeting Readiness</span>
<span class="checkup-cta-sub">One-click "are you ready for your video call?" - camera, mic, speaker, echo, device selection, and call-grade network in one go/no-go. Add ?mode=interview, telehealth, streaming, hearing, or agent for tailored framing.</span>
</span>
<span class="checkup-cta-go">Run check <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
<a class="checkup-cta" href="/station-check/" data-keywords="front desk peripherals checklist scanner printer signature card reader barcode station">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="8" y="6" width="16" height="21" rx="2.5" stroke-width="2.2"/><path d="M12 5h8v4h-8z" stroke-width="2.2"/><path d="M12 15l1.8 1.8 3.4-3.4M12 21h8" stroke-width="2"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Front-Desk Station Check</span>
<span class="checkup-cta-sub">A guided checklist that walks a front-desk PC through the check scanner, printer, signature pad, card reader, and barcode scanner, then produces one combined station report for IT.</span>
</span>
<span class="checkup-cta-go">Start checklist <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
<a class="checkup-cta" href="/phone-check/" data-keywords="phone tablet mobile touchscreen sensors camera vibration">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="10" y="5" width="12" height="22" rx="3" stroke-width="2.2"/><path d="M14 8h4" stroke-width="2.2"/><circle cx="16" cy="23" r="1.2" fill="currentColor" stroke="none"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Phone Check</span>
<span class="checkup-cta-sub">Test a phone or tablet in the browser, no app to install - touchscreen, motion sensors, cameras, mic and speaker, vibration - with an honest list of what a browser cannot check (battery health, IMEI).</span>
</span>
<span class="checkup-cta-go">Run check <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
<a class="checkup-cta" href="/display-check/" data-keywords="monitor screen dead pixel burn in backlight bleed ghosting banding hdr grading">
<span class="checkup-cta-ico"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="4" y="6" width="24" height="16" rx="2.5" stroke-width="2.2"/><path d="M12 26h8M16 22v4" stroke-width="2.2"/><path d="M11 6v16M21 6v16M4 12h24M4 17h24" stroke-width="1.3"/></svg></span>
<span class="checkup-cta-text">
<span class="checkup-cta-title">Display Check</span>
<span class="checkup-cta-sub">A guided full-screen grading suite for a monitor, TV, or laptop screen - dead pixels, backlight bleed, OLED burn-in, response-time ghosting, and gradient banding, plus automatic HDR and wide-gamut capability detection. You look and judge; it guides your eye, records your calls, and produces a report.</span>
</span>
<span class="checkup-cta-go">Run check <svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
</a>
</div>
<h2 class="section-title">Input & peripherals</h2>
<div class="tools">
<a class="tool is-live" href="/keyboard-test/" data-keywords="keys typing stuck key ghosting not typing repeating keypress">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='4' y='9' width='24' height='14' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cg fill='%23fff'%3E%3Crect x='7.5' y='12' width='2.6' height='2.6' rx='0.5'/%3E%3Crect x='12' y='12' width='2.6' height='2.6' rx='0.5'/%3E%3Crect x='16.5' y='12' width='2.6' height='2.6' rx='0.5'/%3E%3Crect x='21' y='12' width='2.6' height='2.6' rx='0.5'/%3E%3Crect x='10' y='17.5' width='12' height='2.6' rx='0.8'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Keyboard Test</p>
</div>
<p class="tool-desc">Visual keymap that lights up every key on press; finds stuck keys.</p>
<p class="tool-meta">desktest.net/keyboard-test</p>
</a>
<a class="tool is-live" href="/keylayout-test/" data-keywords="wrong characters symbols azerty qwerty dvorak at sign shift punctuation layout mismatch">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5.5' y='7' width='9' height='9' rx='1.5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Crect x='17.5' y='16' width='9' height='9' rx='1.5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M16 9h6M22 9l-2.2-2.2M22 9l-2.2 2.2' stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M16 23h-6M10 23l2.2-2.2M10 23l2.2 2.2' stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Keyboard Layout Test</p>
</div>
<p class="tool-desc">Catch a keyboard-layout mismatch that types the wrong characters - like a quote key producing @, or Y and Z swapped (US vs UK vs AZERTY).</p>
<p class="tool-meta">desktest.net/keylayout-test</p>
</a>
<a class="tool is-live" href="/mouse-test/" data-keywords="cursor pointer clicking scroll wheel double click buttons not moving jumpy polling">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 5c-4 0-7 3-7 7v8c0 4 3 7 7 7s7-3 7-7v-8c0-4-3-7-7-7zm-.5 3v6h-4v-2c0-2.2 1.8-4 4-4z' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Mouse Test</p>
</div>
<p class="tool-desc">Tests every mouse button, the scroll wheel, and pointer movement smoothness. Finds stuck buttons and low-polling-rate drift.</p>
<p class="tool-meta">desktest.net/mouse-test</p>
</a>
<a class="tool is-live" href="/touch-test/" data-keywords="touchscreen touch finger tap swipe digitizer multitouch dead zone not responding">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg transform='translate(4 4)'%3E%3Cpath d='M9 11.24V7.5C9 6.12 10.12 5 11.5 5S14 6.12 14 7.5v3.74c1.21-.81 2-2.18 2-3.74C16 5.01 13.99 3 11.5 3S7 5.01 7 7.5c0 1.56.79 2.93 2 3.74zm9.84 4.63l-4.54-2.26c-.17-.07-.35-.11-.54-.11H13v-6C13 6.67 12.33 6 11.5 6S10 6.67 10 7.5v10.74l-3.43-.72c-.08-.01-.15-.03-.24-.03-.31 0-.59.13-.79.33l-.79.8 4.94 4.94c.27.27.65.44 1.06.44h6.79c.75 0 1.33-.55 1.44-1.28l.75-5.27c.01-.07.02-.14.02-.2 0-.62-.38-1.16-.91-1.38z' fill='%23fff'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Touchscreen Test</p>
</div>
<p class="tool-desc">Confirms a touchscreen works - touch registers, the whole screen responds, and multi-touch.</p>
<p class="tool-meta">desktest.net/touch-test</p>
</a>
<a class="tool is-live" href="/pen-test/" data-keywords="stylus wacom surface pen apple pencil tablet pressure tilt hover eraser drawing">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M21 5l6 6-12.5 12.5-7.5 1.5 1.5-7.5z' fill='%23fff'/%3E%3Cpath d='M9.5 22.5l-2.5 2.5' stroke='%23fff' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Pen and Stylus Test</p>
</div>
<p class="tool-desc">Test a pen or stylus - Wacom tablet, Surface Pen, Apple Pencil - pressure, tilt, hover, eraser, and barrel button.</p>
<p class="tool-meta">desktest.net/pen-test</p>
</a>
<a class="tool is-live" href="/controller-test/" data-keywords="gamepad joystick xbox playstation game buttons sticks triggers dpad drift vibration">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5' y='11' width='22' height='12' rx='6' fill='%23fff'/%3E%3Ccircle cx='21' cy='15' r='1.7' fill='%230969da'/%3E%3Ccircle cx='24' cy='18' r='1.7' fill='%230969da'/%3E%3Crect x='8' y='16.4' width='6' height='1.8' rx='.6' fill='%230969da'/%3E%3Crect x='10.1' y='14.3' width='1.8' height='6' rx='.6' fill='%230969da'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Controller Test</p>
</div>
<p class="tool-desc">Test a game controller or gamepad - buttons, sticks, triggers, D-pad, stick drift, and vibration (Gamepad API).</p>
<p class="tool-meta">desktest.net/controller-test</p>
</a>
<a class="tool is-live" href="/midi-test/" data-keywords="music keyboard piano synth pad controller notes daw">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='6' y='7' width='20' height='18' rx='2' fill='%23fff'/%3E%3Crect x='11' y='7' width='1.4' height='11' fill='%230969da'/%3E%3Crect x='16' y='7' width='1.4' height='11' fill='%230969da'/%3E%3Crect x='21' y='7' width='1.4' height='11' fill='%230969da'/%3E%3Crect x='9.4' y='7' width='3' height='7' fill='%230969da'/%3E%3Crect x='14.4' y='7' width='3' height='7' fill='%230969da'/%3E%3Crect x='19.4' y='7' width='3' height='7' fill='%230969da'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">MIDI Test</p>
</div>
<p class="tool-desc">Test a MIDI keyboard, pad, or controller - detect connected devices and watch live note and control input.</p>
<p class="tool-meta">desktest.net/midi-test</p>
</a>
<a class="tool is-live" href="/usb-test/" data-keywords="webusb webhid device port peripheral plugged in not recognized">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 25V8.5' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'/%3E%3Cpath d='M16 5l3 3.5h-6z' fill='%23fff'/%3E%3Cpath d='M16 15.5L11.5 12' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'/%3E%3Cpath d='M16 18.5L20.5 15' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'/%3E%3Ccircle cx='16' cy='25' r='2.1' fill='%23fff'/%3E%3Ccircle cx='11' cy='11.6' r='2.1' fill='%23fff'/%3E%3Crect x='19' y='13.3' width='3.4' height='3.4' rx='0.5' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">USB Device Test</p>
</div>
<p class="tool-desc">WebUSB and WebHID device chooser for verifying barcode scanners, terminals, HID gear.</p>
<p class="tool-meta">desktest.net/usb-test</p>
</a>
<a class="tool is-live" href="/bluetooth-test/" data-keywords="ble wireless pair pairing hardware wallet ledger fitness headset iot smart home">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M9 12l14 9-7 5V6l7 5-14 9' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Bluetooth Test</p>
</div>
<p class="tool-desc">Confirm this workstation can pair a Bluetooth (BLE) device, so the web apps that need it work - hardware wallets, IoT and smart-home config portals, some fitness and medical web apps.</p>
<p class="tool-meta">desktest.net/bluetooth-test</p>
</a>
<a class="tool is-live" href="/serial-test/" data-keywords="com port receipt printer cash drawer pole display rs232">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5.5' y='9' width='21' height='14' rx='4.5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cg fill='%23fff'%3E%3Ccircle cx='11' cy='14' r='1.5'/%3E%3Ccircle cx='16' cy='14' r='1.5'/%3E%3Ccircle cx='21' cy='14' r='1.5'/%3E%3Ccircle cx='13.5' cy='18.5' r='1.5'/%3E%3Ccircle cx='18.5' cy='18.5' r='1.5'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Serial Peripheral Test</p>
</div>
<p class="tool-desc">Confirms a receipt printer, cash drawer, or pole display is talking on its COM port (Web Serial).</p>
<p class="tool-meta">desktest.net/serial-test</p>
</a>
<a class="tool is-live" href="/barcode-test/" data-keywords="qr scanner keyboard wedge upc ean symbology check digit id scanner license pdf417">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg fill='%23fff'%3E%3Crect x='6' y='8' width='2' height='16'/%3E%3Crect x='10' y='8' width='1' height='16'/%3E%3Crect x='13' y='8' width='3' height='16'/%3E%3Crect x='18' y='8' width='1' height='16'/%3E%3Crect x='21' y='8' width='2' height='16'/%3E%3Crect x='25' y='8' width='1' height='16'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Barcode Scanner Test</p>
</div>
<p class="tool-desc">Tests any USB barcode or QR scanner - captures the scan, validates the format and check digit, and confirms it is configured right.</p>
<p class="tool-meta">desktest.net/barcode-test</p>
</a>
<a class="tool is-live" href="/card-reader-test/" data-keywords="magstripe magnetic swipe credit card payment id scanner license msr">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='4' y='8' width='24' height='16' rx='2.5' fill='%23fff'/%3E%3Crect x='4' y='11.5' width='24' height='4' fill='%230969da'/%3E%3Crect x='7' y='19' width='8' height='2' rx='1' fill='%230969da'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Card Reader Test</p>
</div>
<p class="tool-desc">Confirms a USB magnetic-stripe card reader works - the card number is masked, nothing is stored, and nothing is sent.</p>
<p class="tool-meta">desktest.net/card-reader-test</p>
</a>
<a class="tool is-live" href="/nfc-test/" data-keywords="tap tag fob contactless review tag key card android">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M11 9a10 10 0 0 1 0 14'/%3E%3Cpath d='M16 6.5a15 15 0 0 1 0 19'/%3E%3C/g%3E%3Ccircle cx='8' cy='16' r='2.2' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">NFC Tag Test</p>
</div>
<p class="tool-desc">Tap an NFC tag - a review, menu, or product tag - to confirm it reads and see what is on it.</p>
<p class="tool-meta">desktest.net/nfc-test</p>
</a>
<a class="tool is-live" href="/scanner-test/" data-keywords="check scanner deposit micr fis webscan digital check panini remote deposit">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='7' y='5' width='18' height='22' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cg stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M11 10h10'/%3E%3Cpath d='M11 14h7'/%3E%3C/g%3E%3Cpath d='M11 20l3 3 6-7' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Scanner Test</p>
</div>
<p class="tool-desc">Verifies a FIS WebScan install is running, the check scanner is connected, and a test scan completes successfully.</p>
<p class="tool-meta">desktest.net/scanner-test</p>
</a>
<a class="tool is-live" href="/sigpad-test/" data-keywords="signature sign topaz sigweb pad esign">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M5 22 Q10 14, 14 22 T22 22 T28 18' stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Signature Pad Test</p>
</div>
<p class="tool-desc">Verifies a Topaz SigWeb install can capture a signature from the connected signature pad.</p>
<p class="tool-meta">desktest.net/sigpad-test</p>
</a>
</div>
<h2 class="section-title">Audio, video & display</h2>
<div class="tools">
<a class="tool is-live" href="/webcam-test/" data-keywords="camera video call not working black screen">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='16' cy='16' r='7' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Ccircle cx='16' cy='16' r='3' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Webcam Test</p>
</div>
<p class="tool-desc">Confirms camera permission, video frames are flowing, and the preview shows.</p>
<p class="tool-meta">desktest.net/webcam-test</p>
</a>
<a class="tool is-live" href="/camera-quality/" data-keywords="camera video lighting fps frame rate backlight grainy dark">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='16' cy='16' r='4.3' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cg stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M16 4.5v3'/%3E%3Cpath d='M16 24.5v3'/%3E%3Cpath d='M4.5 16h3'/%3E%3Cpath d='M24.5 16h3'/%3E%3Cpath d='M8 8l2 2'/%3E%3Cpath d='M22 22l2 2'/%3E%3Cpath d='M24 8l-2 2'/%3E%3Cpath d='M10 22l-2 2'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Camera Quality Check</p>
</div>
<p class="tool-desc">Grade how you actually look on camera - delivered frame rate plus lighting and backlight - not just the advertised resolution.</p>
<p class="tool-meta">desktest.net/camera-quality</p>
</a>
<a class="tool is-live" href="/mic-test/" data-keywords="microphone audio voice sound input no sound not heard level meter">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 7a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0v-6a3 3 0 0 0-3-3Zm-6 9a6 6 0 0 0 12 0M16 22v3M12 25h8' stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Microphone Test</p>
</div>
<p class="tool-desc">Captures audio via getUserMedia, measures input level, plays back recording.</p>
<p class="tool-meta">desktest.net/mic-test</p>
</a>
<a class="tool is-live" href="/recording-check/" data-keywords="microphone podcast audiobook acx voiceover noise floor clipping recording quality">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='6.5' y='18' width='3.6' height='7' rx='1' fill='%23fff'/%3E%3Crect x='14.2' y='11' width='3.6' height='14' rx='1' fill='%23fff'/%3E%3Crect x='21.9' y='7' width='3.6' height='18' rx='1' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Recording Quality Check</p>
</div>
<p class="tool-desc">Grade your microphone setup against podcast/audiobook (ACX) targets - peak level, noise floor, and clipping - with plain-language fixes.</p>
<p class="tool-meta">desktest.net/recording-check</p>
</a>
<a class="tool is-live" href="/speaker-test/" data-keywords="sound audio speakers no sound cant hear volume left right channel headphones">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M9 12 H13 L18 8 V24 L13 20 H9 Z' fill='%23fff'/%3E%3Cpath d='M21 12 Q24 16, 21 20' stroke='%23fff' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3Cpath d='M23 9 Q28 16, 23 23' stroke='%23fff' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Speaker Test</p>
</div>
<p class="tool-desc">Plays a 440 Hz tone via Web Audio and confirms both ears hear it.</p>
<p class="tool-meta">desktest.net/speaker-test</p>
</a>
<a class="tool is-live" href="/echo-test/" data-keywords="echo feedback speakerphone latency delay reverb">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='9' cy='16' r='2.4' fill='%23fff'/%3E%3Cpath d='M13 11a7 7 0 0 1 0 10M16.5 8a11 11 0 0 1 0 16' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='M23 12a6 6 0 0 0 0 8' fill='none' stroke='%23fff' stroke-width='1.6' stroke-linecap='round' opacity='.55'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Echo and Latency Test</p>
</div>
<p class="tool-desc">Plays a chirp and listens for it to detect speakerphone echo/feedback and estimate audio round-trip latency.</p>
<p class="tool-meta">desktest.net/echo-test</p>
</a>
<a class="tool is-live" href="/call-test/" data-keywords="video call zoom teams meet camera microphone speaker latency preflight">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M8 17v-1a8 8 0 0 1 16 0v1' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Crect x='6' y='16' width='4' height='7' rx='1.5' fill='%23fff'/%3E%3Crect x='22' y='16' width='4' height='7' rx='1.5' fill='%23fff'/%3E%3Cpath d='M23 23v1a3 3 0 0 1-3 3h-4' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Call Readiness Test</p>
</div>
<p class="tool-desc">One-page pre-flight for Teams/Zoom/Meet: camera, microphone, speakers, and network in one check.</p>
<p class="tool-meta">desktest.net/call-test</p>
</a>
<a class="tool is-live" href="/device-sanity/" data-keywords="microphone speaker camera device selection virtual camera wrong device call meeting">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Cline x1='7' y1='11' x2='25' y2='11'/%3E%3Cline x1='7' y1='21' x2='25' y2='21'/%3E%3C/g%3E%3Ccircle cx='12' cy='11' r='3.2' fill='%230969da' stroke='%23fff' stroke-width='2.4'/%3E%3Ccircle cx='20' cy='21' r='3.2' fill='%230969da' stroke='%23fff' stroke-width='2.4'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Device Selection Check</p>
</div>
<p class="tool-desc">Confirm a call will use the right microphone, speaker, and camera - not a virtual cam or a device another app is holding - and that the mic is not driven too hot.</p>
<p class="tool-meta">desktest.net/device-sanity</p>
</a>
<a class="tool is-live" href="/screenshare-test/" data-keywords="share screen present teams zoom meet getdisplaymedia cant share">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5' y='7' width='22' height='14' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M13 24h6M16 21v3' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='M16 18v-6M13 15l3-3 3 3' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Screen Share Test</p>
</div>
<p class="tool-desc">Confirms this machine can share its screen in Teams, Zoom, or Meet.</p>
<p class="tool-meta">desktest.net/screenshare-test</p>
</a>
<a class="tool is-live" href="/webrtc-test/" data-keywords="video call zoom teams meet stun ice peer firewall">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='12' cy='16' r='5.5' fill='none' stroke='%23fff' stroke-width='2.2'/%3E%3Ccircle cx='20' cy='16' r='5.5' fill='none' stroke='%23fff' stroke-width='2.2'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">WebRTC Test</p>
</div>
<p class="tool-desc">Verifies STUN reachability, ICE candidate gathering, and end-to-end peer connection for Zoom, Teams, Meet, Slack Huddles.</p>
<p class="tool-meta">desktest.net/webrtc-test</p>
</a>
<a class="tool is-live" href="/display-test/" data-keywords="monitor screen color dead pixel resolution stuck pixel test pattern">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='6' y='8' width='20' height='13' rx='1.5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M13 24h6M16 21v3' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Display Test</p>
</div>
<p class="tool-desc">Color test patterns, dead-pixel scan, and resolution detection.</p>
<p class="tool-meta">desktest.net/display-test</p>
</a>
<a class="tool is-live" href="/refresh-rate/" data-keywords="hz monitor 144 165 120 60 fps stutter smoothness gaming">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M7 22a9 9 0 0 1 18 0' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'/%3E%3Cpath d='M16 22l6-6.5' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round'/%3E%3Ccircle cx='16' cy='22' r='1.9' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Refresh Rate Test</p>
</div>
<p class="tool-desc">Measure your monitor's actual refresh rate - is that 144Hz panel really running at 144, or did Windows quietly default it to 60?</p>
<p class="tool-meta">desktest.net/refresh-rate</p>
</a>
</div>
<h2 class="section-title">Network & connectivity</h2>
<div class="tools">
<a class="tool is-live" href="/network-test/" data-keywords="internet connection wifi cdn dns websocket reachability offline down cant connect">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M9 11 L23 11 L16 23 Z' stroke='%23fff' stroke-width='1.8' fill='none' stroke-linejoin='round'/%3E%3Ccircle cx='9' cy='11' r='3' fill='%23fff'/%3E%3Ccircle cx='23' cy='11' r='3' fill='%23fff'/%3E%3Ccircle cx='16' cy='23' r='3' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Network Test</p>
</div>
<p class="tool-desc">Probes public CDNs, DNS-over-HTTPS, and a WebSocket echo to verify egress.</p>
<p class="tool-meta">desktest.net/network-test</p>
</a>
<a class="tool is-live" href="/speed-test/" data-keywords="bandwidth mbps download upload throughput fast slow internet speed">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M6 22 A10 10 0 0 1 26 22' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'/%3E%3Cline x1='16' y1='22' x2='22.5' y2='13.5' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'/%3E%3Ccircle cx='16' cy='22' r='2.3' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Speed Test</p>
</div>
<p class="tool-desc">Real download and upload throughput in Mbps for this desk, plus which Teams/Zoom video modes will hold up - the bandwidth number the Network Test deliberately does not measure.</p>
<p class="tool-meta">desktest.net/speed-test</p>
</a>
<a class="tool is-live" href="/socket-stability-test/" data-keywords="websocket drop flaky wifi disconnect stability dropping unstable">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M4 16 h5 l2.5 -7 4 14 2.5 -7 h5' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round' stroke-linecap='round'/%3E%3Ccircle cx='27' cy='16' r='2.2' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Connection Stability Test</p>
</div>
<p class="tool-desc">Watch a live connection for about 45 seconds to catch flaky Wi-Fi that drops long-running sessions like check scanners, Teams, and RDP.</p>
<p class="tool-meta">desktest.net/socket-stability-test</p>
</a>
<a class="tool is-live" href="/proxy-test/" data-keywords="proxy ssl tls inspection corporate firewall mitm interception">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M7 13h18M7 19h18' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='13' r='2.6' fill='%230969da' stroke='%23fff' stroke-width='1.8'/%3E%3Ccircle cx='20' cy='19' r='2.6' fill='%230969da' stroke='%23fff' stroke-width='1.8'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Proxy Test</p>
</div>
<p class="tool-desc">Detects a corporate proxy or TLS inspection sitting between your browser and the internet.</p>
<p class="tool-meta">desktest.net/proxy-test</p>
</a>
<a class="tool is-live" href="/saas-test/" data-keywords="cloud microsoft 365 office zoom slack salesforce dropbox docusign reachability outage">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M11.5 22h10a4 4 0 0 0 .4-8 6 6 0 0 0-11.5-1.5A4.1 4.1 0 0 0 11.5 22z' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">SaaS Reachability Test</p>
</div>
<p class="tool-desc">Checks whether Microsoft 365, Google, Salesforce, and other cloud apps are reachable, and whether an outage is your network or the vendor.</p>
<p class="tool-meta">desktest.net/saas-test</p>
</a>
<a class="tool is-live" href="/sitelink-test/" data-keywords="self storage sitelink myhub property management">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M21 12 C21 9 11 9 11 12.7 C11 16.5 21 15.5 21 19.3 C21 23 11 23 11 20' stroke='%23fff' stroke-width='3' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">SiteLink Test</p>
</div>
<p class="tool-desc">Browser readiness check for SiteLink Web Edition. Confirms TLS, cookies, popups, and reachability of known SiteLink endpoints.</p>
<p class="tool-meta">desktest.net/sitelink-test</p>
</a>
<a class="tool is-live" href="/cert-check/" data-keywords="certificate ssl tls x509 expiry expired https chain trust">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='16' cy='13' r='6.5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M12.5 18.5L11 27l5-2.5 5 2.5-1.5-8.5' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Certificate Check</p>
</div>
<p class="tool-desc">Inspect an X.509 certificate locally: issuer, validity, expiry, SAN domains, self-signed. Nothing is uploaded.</p>
<p class="tool-meta">desktest.net/cert-check</p>
</a>
<a class="tool is-live" href="/clock-test/" data-keywords="time clock skew wrong date wrong time https login 2fa kerberos">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='16' cy='16' r='9.5' fill='none' stroke='%23fff' stroke-width='2.2'/%3E%3Cpath d='M16 10.5V16l4 2.5' stroke='%23fff' stroke-width='2.2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Clock Test</p>
</div>
<p class="tool-desc">Checks whether the system clock is off enough to break HTTPS, domain logins, and 2FA.</p>
<p class="tool-meta">desktest.net/clock-test</p>
</a>
</div>
<h2 class="section-title">Browser, system & performance</h2>
<div class="tools">
<a class="tool is-live" href="/browser-test/" data-keywords="browser user agent version support storage compatibility api">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M6 8h20v4H6zM6 14h20v12H6z' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Ccircle cx='9' cy='10' r='1' fill='%23fff'/%3E%3Ccircle cx='12' cy='10' r='1' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Browser Test</p>
</div>
<p class="tool-desc">Reports browser version, security context, storage, and modern API support.</p>
<p class="tool-meta">desktest.net/browser-test</p>
</a>
<a class="tool is-live" href="/system-info/" data-keywords="cpu memory ram gpu graphics os specs hardware storage what computer">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cg stroke='%23fff' stroke-width='2' fill='none' stroke-linecap='round'%3E%3Crect x='10' y='10' width='12' height='12' rx='1.5'/%3E%3Cpath d='M13 10V6M19 10V6M13 26v-4M19 26v-4M10 13H6M10 19H6M26 13h-4M26 19h-4'/%3E%3C/g%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">System Info</p>
</div>
<p class="tool-desc">Reports CPU, memory, GPU, display, OS, network, and storage - everything the browser can see, locally.</p>
<p class="tool-meta">desktest.net/system-info</p>
</a>
<a class="tool is-live" href="/perf-test/" data-keywords="slow performance cpu lag laggy responsiveness is my pc slow freezing">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M7 22a9 9 0 0 1 18 0' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='M16 21l6-5' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Ccircle cx='16' cy='21' r='2' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Performance Test</p>
</div>
<p class="tool-desc">A quick "is this PC slow?" check: CPU, rendering, memory, and main-thread responsiveness.</p>
<p class="tool-meta">desktest.net/perf-test</p>
</a>
<a class="tool is-live" href="/webapp-test/" data-keywords="popup cookie notification vendor web app blocked login issues policy">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='6' y='7' width='20' height='16' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M6 11h20' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M12 18l2.5 2.5 5-5.5' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Web App Readiness Test</p>
</div>
<p class="tool-desc">Checks popups, cookies, notifications, and clipboard - the browser settings that block vendor web apps.</p>
<p class="tool-meta">desktest.net/webapp-test</p>
</a>
<a class="tool is-live" href="/notification-test/" data-keywords="notification alert desktop popup focus assist do not disturb toast">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 6.5a5.2 5.2 0 0 0-5.2 5.2c0 5-2.1 6.3-2.1 6.3h14.6s-2.1-1.3-2.1-6.3A5.2 5.2 0 0 0 16 6.5z' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='M13.8 22.5a2.2 2.2 0 0 0 4.4 0' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Notification Test</p>
</div>
<p class="tool-desc">Confirms desktop and browser notifications actually work - it requests permission and fires a real test notification, catching browser-blocked and OS Focus Assist / Do Not Disturb.</p>
<p class="tool-meta">desktest.net/notification-test</p>
</a>
<a class="tool is-live" href="/clipboard-test/" data-keywords="copy paste clipboard rdp citrix remote desktop image paste">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='8' y='7' width='16' height='19' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Crect x='12' y='5' width='8' height='4' rx='1.6' fill='%23fff'/%3E%3Cpath d='M11 14h10M11 18h10M11 22h6' stroke='%23fff' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Clipboard Test</p>
</div>
<p class="tool-desc">Confirms copy, paste, and image-paste work - a common failure point in RDP, Citrix, and locked-down browsers.</p>
<p class="tool-meta">desktest.net/clipboard-test</p>
</a>
<a class="tool is-live" href="/cache-test/" data-keywords="service worker cache update stuck old version refresh reload hard refresh">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M24 16a8 8 0 1 1-2.3-5.6' fill='none' stroke='%23fff' stroke-width='2.6' stroke-linecap='round'/%3E%3Cpath d='M24 8v4.5h-4.5' fill='none' stroke='%23fff' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Cache and Update Test</p>
</div>
<p class="tool-desc">The "a hard refresh fixes it" inspector - registered service workers and their state, cache storage, and how to force an update.</p>
<p class="tool-meta">desktest.net/cache-test</p>
</a>
<a class="tool is-live" href="/font-check/" data-keywords="font fonts micr barcode font installed missing typeface">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ctext x='16' y='23' font-family='Georgia,Times New Roman,serif' font-size='19' font-weight='700' text-anchor='middle' fill='%23fff'%3EAa%3C/text%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Font Presence Check</p>
</div>
<p class="tool-desc">Confirm the fonts a vendor app or check-printer needs - including MICR and barcode fonts - are actually installed.</p>
<p class="tool-meta">desktest.net/font-check</p>
</a>
<a class="tool is-live" href="/access-check/" data-keywords="accessibility zoom contrast a11y magnify large text high contrast reduced motion">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='16' cy='8.5' r='2.6' fill='%23fff'/%3E%3Cpath d='M7 13h18M16 13v7M16 20l-4.2 6M16 20l4.2 6' stroke='%23fff' stroke-width='2.1' stroke-linecap='round' fill='none'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Accessibility and Zoom Check</p>
</div>
<p class="tool-desc">Check whether the accessibility, zoom, and contrast settings a user turned on are actually reaching the browser - and how to fix them.</p>
<p class="tool-meta">desktest.net/access-check</p>
</a>
<a class="tool is-live" href="/currency-test/" data-keywords="outdated old browser windows update eol end of life unsupported security risk win10">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 4l8 3v6c0 5.5-3.5 8.5-8 10.5-4.5-2-8-5-8-10.5V7z' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='M16 10v8M12.5 13.5 16 10l3.5 3.5' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Browser and OS Currency Check</p>
</div>
<p class="tool-desc">Flags an out-of-date or end-of-life browser or Windows build that is a security liability.</p>
<p class="tool-meta">desktest.net/currency-test</p>
</a>
<a class="tool is-live" href="/kiosk-test/" data-keywords="kiosk fullscreen lockdown stay awake wake lock digital signage unattended">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5' y='6' width='22' height='15' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M12 25h8M16 21v4' stroke='%23fff' stroke-width='2' stroke-linecap='round'/%3E%3Crect x='12.5' y='12' width='7' height='5.5' rx='1' fill='%23fff'/%3E%3Cpath d='M13.5 12v-1.5a2.5 2.5 0 0 1 5 0V12' fill='none' stroke='%23fff' stroke-width='1.6'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Kiosk Readiness Check</p>
</div>
<p class="tool-desc">Pre-deployment go/no-go for a self-serve kiosk: stays awake, holds fullscreen, and locks down.</p>
<p class="tool-meta">desktest.net/kiosk-test</p>
</a>
</div>
<h2 class="section-title">Security & privacy</h2>
<div class="tools">
<a class="tool is-live" href="/security-key-test/" data-keywords="yubikey fido2 fido webauthn passkey windows hello touch id 2fa mfa security key">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Ccircle cx='12' cy='16' r='4.6' fill='none' stroke='%23fff' stroke-width='2.4'/%3E%3Cpath d='M16.4 16H26M22 16v4M26 16v3.4' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Security Key Test</p>
</div>
<p class="tool-desc">Test a FIDO2 security key (like a YubiKey) or a built-in platform authenticator (Windows Hello / Touch ID) with a throwaway credential - nothing is registered, stored, or sent.</p>
<p class="tool-meta">desktest.net/security-key-test</p>
</a>
<a class="tool is-live" href="/email-check/" data-keywords="email spf dkim dmarc dns deliverability spam headers spoofing">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='5.5' y='9' width='21' height='14' rx='2' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Cpath d='M6.5 11l9.5 6.5L25.5 11' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Email Header Check</p>
</div>
<p class="tool-desc">Inspect a suspicious email's headers for spoofing and phishing, locally. Nothing is uploaded.</p>
<p class="tool-meta">desktest.net/email-check</p>
</a>
<a class="tool is-live" href="/hash-check/" data-keywords="hash checksum md5 sha256 sha1 file integrity verify download">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M16 5l9 3v6c0 5.5-3.8 10.6-9 12-5.2-1.4-9-6.5-9-12V8z' fill='none' stroke='%23fff' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='M12 16l3 3 6-6' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">File Hash Check</p>
</div>
<p class="tool-desc">Compute a file's SHA-256 locally and compare it to a vendor's published hash to verify a download. Nothing is uploaded.</p>
<p class="tool-meta">desktest.net/hash-check</p>
</a>
</div>
<h2 class="section-title">Documents & printing</h2>
<div class="tools">
<a class="tool is-live" href="/pdf-test/" data-keywords="pdf document form fillable print viewer acrobat">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Cpath d='M9 7h10l4 4v14a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1z' fill='none' stroke='%23fff' stroke-width='1.8' stroke-linejoin='round'/%3E%3Cpath d='M19 7v4h4' fill='none' stroke='%23fff' stroke-width='1.8' stroke-linejoin='round'/%3E%3Ctext x='16' y='22' text-anchor='middle' fill='%23fff' font-family='Helvetica,Arial,sans-serif' font-size='7' font-weight='700'%3EPDF%3C/text%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">PDF Test</p>
</div>
<p class="tool-desc">Confirms PDF viewing, form-filling, and printing work in this browser. Detects Adobe Acrobat vs. built-in viewers.</p>
<p class="tool-meta">desktest.net/pdf-test</p>
</a>
<a class="tool is-live" href="/printer-test/" data-keywords="print printer alignment color test page not printing streaks">
<div class="tool-head">
<img class="tool-ico" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='3' fill='%230969da'/%3E%3Crect x='8' y='12' width='16' height='10' rx='1' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Crect x='11' y='7' width='10' height='5' fill='none' stroke='%23fff' stroke-width='2'/%3E%3Crect x='12' y='17' width='8' height='6' fill='%23fff'/%3E%3C/svg%3E" alt="" aria-hidden="true">
<p class="tool-name">Printer Test</p>
</div>
<p class="tool-desc">Guided test page to confirm the configured printer prints correctly, including alignment and color/grayscale.</p>
<p class="tool-meta">desktest.net/printer-test</p>
</a>
</div>
<div class="about">
<h2>What is DeskTest.net?</h2>
<p>A free collection of diagnostic pages built for the software stack that powers a front desk: property management, self-storage, dental, medical, legal, hospitality. Every tool here is the single thing an IT person sends a user to when something isn't working.</p>
<p>Each page is built around three rules:</p>
<ul>
<li><strong>One page, one question.</strong> A test should give a clear pass/fail in under a minute. No menus, no settings, no decisions to make.</li>
<li><strong>Your data never leaves your computer.</strong> Peripheral checks run locally against your installed drivers; network checks contact only the endpoints they name, never your files or inputs. No backend, no analytics, no telemetry. View source proves it.</li>
<li><strong>No accounts, no tracking, no monetization.</strong> The trust posture is the moat. If you ever see a "sign up" button on this site, something has gone wrong.</li>
</ul>
</div>
<footer>
<span><a href="/about/">About</a> | <a href="/help/getting-started/">Help</a> | <a href="/help/deployment/">For IT</a> | <a href="https://github.com/tech1k/desktest" rel="noopener">GitHub</a> | <a href="https://github.com/tech1k/desktest/issues/new/choose" rel="noopener">Suggest a tool</a></span>
<span>Built by <a href="https://kristiankramer.net" rel="noopener">Kristian Kramer</a> | No tracking. Runs locally. | <a href="/privacy/">Privacy</a> | <a href="/accessibility/">Accessibility</a></span>
</footer>
</main>
<script>
// Tool search / filter. Injected here (progressive enhancement) so a no-JS visitor
// keeps the full static hub with no dead control. Additive and forgiving: it never
// auto-focuses, it only hides non-matching cards (the categories and every card
// stay), and an empty result offers a one-click "Show all tools". Matches on each
// tool's name + description + curated keywords, so typing a PROBLEM ("no sound",
// "slow", "printer") finds the right tool, not just its exact title.
(function(){
var main = document.getElementById('main');
var infobox = main && main.querySelector('.info-box');
var cards = Array.prototype.slice.call(document.querySelectorAll('a.tool, a.checkup-cta'));
if(!main || !infobox || !cards.length) return;
cards.forEach(function(c){
var name = (c.querySelector('.tool-name, .checkup-cta-title') || {}).textContent || '';
var desc = (c.querySelector('.tool-desc, .checkup-cta-sub') || {}).textContent || '';
var kw = c.getAttribute('data-keywords') || '';
c._search = (name + ' ' + desc + ' ' + kw).toLowerCase();
});
var sections = Array.prototype.slice.call(main.querySelectorAll('h2.section-title')).map(function(h){
var grid = h.nextElementSibling;
while(grid && !(grid.classList.contains('tools') || grid.classList.contains('checkup-grid'))) grid = grid.nextElementSibling;
return { head: h, grid: grid };
});
var wrap = document.createElement('div');
wrap.className = 'toolsearch';
wrap.innerHTML =
'<label class="toolsearch-label" for="toolsearch-input">Search tools by name or problem</label>' +
'<div class="toolsearch-field">' +
'<span class="toolsearch-ico"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="M11 11l3 3" stroke-linecap="round"/></svg></span>' +
'<input id="toolsearch-input" type="search" autocomplete="off" spellcheck="false" placeholder="Try camera, printer, no sound, slow, wifi...">' +
'<button type="button" class="toolsearch-clear" aria-label="Clear search">✕</button>' +
'</div>' +
'<p class="toolsearch-count" aria-hidden="true"></p>' +
'<span class="toolsearch-sr" role="status"></span>';
infobox.parentNode.insertBefore(wrap, infobox.nextSibling);
var empty = document.createElement('div');
empty.className = 'toolsearch-empty';
empty.hidden = true;
empty.appendChild(document.createTextNode('No tools match that. '));
var showAll = document.createElement('button');
showAll.type = 'button';
showAll.textContent = 'Show all tools';
empty.appendChild(showAll);
wrap.parentNode.insertBefore(empty, wrap.nextSibling);
var input = wrap.querySelector('input');
var clearBtn = wrap.querySelector('.toolsearch-clear');
var count = wrap.querySelector('.toolsearch-count');
var srCount = wrap.querySelector('.toolsearch-sr');
var announceTimer;
function apply(raw){
var q = raw.trim().toLowerCase();
wrap.classList.toggle('has-query', !!q);
clearTimeout(announceTimer);
if(!q){
cards.forEach(function(c){ c.removeAttribute('data-search-hidden'); });
sections.forEach(function(s){ s.head.removeAttribute('data-search-hidden'); if(s.grid) s.grid.removeAttribute('data-search-hidden'); });
count.textContent = '';
srCount.textContent = '';
empty.hidden = true;
return;
}
var toks = q.split(/\s+/);
var shown = 0;
cards.forEach(function(c){
var hit = toks.every(function(t){ return c._search.indexOf(t) !== -1; });
if(hit){ c.removeAttribute('data-search-hidden'); shown++; }
else c.setAttribute('data-search-hidden', '');
});
sections.forEach(function(s){
if(!s.grid) return;
var live = s.grid.querySelector('a.tool:not([data-search-hidden]), a.checkup-cta:not([data-search-hidden])');
if(live){ s.head.removeAttribute('data-search-hidden'); s.grid.removeAttribute('data-search-hidden'); }
else { s.head.setAttribute('data-search-hidden', ''); s.grid.setAttribute('data-search-hidden', ''); }
});
// Visible count (sighted users) echoes the query; "results" covers tools + flows.
count.textContent = shown + (shown === 1 ? ' result matches "' : ' results match "') + raw.trim() + '"';
empty.hidden = shown > 0;
// Screen-reader announcement: debounced so slow typing is not chatty, no query echo
// (the input already echoes it), and it names the one-click recovery when empty.
announceTimer = setTimeout(function(){
srCount.textContent = shown === 0
? 'No tools match. Clear the search box to see all tools.'
: (shown + (shown === 1 ? ' result matches.' : ' results match.'));
}, 350);
}
input.addEventListener('input', function(){ apply(input.value); });
input.addEventListener('keydown', function(e){ if(e.key === 'Escape' && input.value){ input.value = ''; apply(''); } });
clearBtn.addEventListener('click', function(){ input.value = ''; apply(''); input.focus(); });
showAll.addEventListener('click', function(){ input.value = ''; apply(''); input.focus(); });
})();
</script>
<script>(function(){var b=document.querySelector('.theme-toggle');if(!b)return;b.addEventListener('click',function(){var d=document.documentElement,c=d.getAttribute('data-theme');if(!c)c=matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';var n=c==='dark'?'light':'dark';d.setAttribute('data-theme',n);var mc=n==='dark'?'#0d1117':'#ffffff',ms=document.querySelectorAll('meta[name=theme-color]');for(var i=0;i<ms.length;i++)ms[i].setAttribute('content',mc);try{localStorage.setItem('desktest-theme',n)}catch(e){}})})();</script>
</body>
</html>