packetsnitch 1.5.604 → 1.5.605

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.github/FUNDING.yml +15 -0
  2. package/.webpack/main/index.js +1697 -0
  3. package/.webpack/main/index.js.map +1 -0
  4. package/.webpack/renderer/main_window/index.html +1036 -0
  5. package/.webpack/renderer/main_window/index.js +4736 -0
  6. package/.webpack/renderer/main_window/preload.js +1418 -0
  7. package/docs/Backend.md +278 -0
  8. package/docs/Filters.md +735 -0
  9. package/docs/Frontend.md +494 -0
  10. package/docs/README.md +43 -0
  11. package/docs/bitcoin-qr.png +0 -0
  12. package/docs/paypal-qr.png +0 -0
  13. package/docs/screenshots/PacketSnitch_ss10.png +0 -0
  14. package/docs/screenshots/PacketSnitch_ss9-2.jpg +0 -0
  15. package/docs/screenshots/comparison-operator-packetsnitch-ss21.png +0 -0
  16. package/docs/screenshots/packetSnitch_ss13.png +0 -0
  17. package/docs/screenshots/packetSnitch_ss20.png +0 -0
  18. package/docs/screenshots/packetsnitch-ss16.png +0 -0
  19. package/docs/screenshots/packetsnitch_32.png +0 -0
  20. package/docs/screenshots/packetsnitch_ss11.png +0 -0
  21. package/docs/screenshots/packetsnitch_ss12.png +0 -0
  22. package/docs/screenshots/packetsnitch_ss19.png +0 -0
  23. package/docs/screenshots/packetsnitch_ss23.png +0 -0
  24. package/docs/screenshots/packetsnitch_ss24.png +0 -0
  25. package/docs/screenshots/packetsnitch_ss25.png +0 -0
  26. package/docs/screenshots/packetsnitch_win_ss14.png +0 -0
  27. package/docs/screenshots/packetsntich_ss26.png +0 -0
  28. package/docs/screenshots/ps-views.gif +0 -0
  29. package/docs/screenshots/screenshot_7.png +0 -0
  30. package/docs/venmo-qr.png +0 -0
  31. package/forge.config.js +21 -33
  32. package/ideas/Dark-mode UI mockup for packetsnitch.png +0 -0
  33. package/ideas/Dark-packetsnitch-UI-mockup-5.png +0 -0
  34. package/ideas/PacketSnitch-timeline-landscape-mockup.png +0 -0
  35. package/ideas/Screenshot 2026-03-05 at 22-09-09 Packet Decoder Frontend /342/200/223 Figma Make.png +0 -0
  36. package/ideas/Screenshot 2026-03-07 at 12-31-05 Grok _ X.png +0 -0
  37. package/ideas/ideas.txt +340 -0
  38. package/logo/LidakzOne_PERSONAL_USE_ONLY.otf +0 -0
  39. package/logo/byline-packetsnitch.xcf +0 -0
  40. package/logo/logo-packetsnitch-2.png +0 -0
  41. package/logo/logo-packetsnitch-3.png +0 -0
  42. package/logo/logo-packetsnitch-4.png +0 -0
  43. package/logo/logo-packetsnitch-5.png +0 -0
  44. package/logo/logo-packetsnitch.png +0 -0
  45. package/logo/logo-packetsnitch.webp +0 -0
  46. package/logo/logo-packetsnitch.xcf +0 -0
  47. package/logo/packet-snitch-tag-transp-whitetext.png +0 -0
  48. package/logo/packet-snitch-tag-transp.png +0 -0
  49. package/logo/ps-icon.ico +0 -0
  50. package/logo/ps-installer-icon.ico +0 -0
  51. package/logo/qr-code(1).png +0 -0
  52. package/logo/qr-code.png +0 -0
  53. package/logo/rat-standing.png +0 -0
  54. package/package.json +1 -2
  55. package/samples/hosts.json +15112 -0
  56. package/samples/hustoj_capture.pcapng +0 -0
  57. package/.eslintrc.json +0 -28
  58. package/.webpack/x64/main/index.js +0 -2
  59. package/.webpack/x64/main/index.js.map +0 -1
  60. package/.webpack/x64/renderer/main_window/index.html +0 -3
  61. package/.webpack/x64/renderer/main_window/index.js +0 -3
  62. package/.webpack/x64/renderer/main_window/index.js.LICENSE.txt +0 -36
  63. package/.webpack/x64/renderer/main_window/index.js.map +0 -1
  64. package/.webpack/x64/renderer/main_window/preload.js +0 -2
  65. package/.webpack/x64/renderer/main_window/preload.js.map +0 -1
  66. /package/.webpack/{x64/renderer → renderer}/assets/css/rubikglitch.woff2 +0 -0
  67. /package/.webpack/{x64/renderer → renderer}/assets/css/style.css +0 -0
  68. /package/.webpack/{x64/renderer → renderer}/assets/images/loading.gif +0 -0
  69. /package/.webpack/{x64/renderer → renderer}/assets/images/logo.webp +0 -0
  70. /package/.webpack/{x64/renderer → renderer}/assets/images/packet-snitch-tag.webp +0 -0
@@ -0,0 +1,1036 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>PacketSnitch</title>
7
+
8
+ <!-- Google Font -->
9
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
11
+
12
+ <link rel="stylesheet" href="assets/css/style.css" type="text/css" />
13
+ <script defer src="/main_window/index.js"></script></head>
14
+ <body>
15
+ <div class="container_box">
16
+ <div class="top_bar">
17
+ <div class="tagline">
18
+ <img
19
+ class="tagline"
20
+ id="psbyline"
21
+ src="../assets/images/packet-snitch-tag.webp"
22
+ />
23
+ </div>
24
+ <button id="close-btn" aria-label="Quit application" title="Quit">
25
+ &#10005;
26
+ </button>
27
+ </div>
28
+ <div class="entry_bar">
29
+ <div class="logo-cont">
30
+ <img src="../assets/images/logo.webp" />
31
+ </div>
32
+ <div id="filters-container">
33
+ <input id="host_filter" type="text" placeholder="0.0.0.0" disabled />
34
+ <label style="color: white">Filter</label>
35
+ <div id="filterStr-wrap">
36
+ <div id="filterStr-highlight" aria-hidden="true"></div>
37
+ <input
38
+ id="filterStr"
39
+ type="text"
40
+ disabled
41
+ placeholder="wire.len: >100 && tcp.proto: https || dns.qname: example.com"
42
+ />
43
+ <button
44
+ id="filterStr-clear"
45
+ type="button"
46
+ disabled
47
+ aria-label="Clear filter"
48
+ title="Clear filter"
49
+ >
50
+ Clear
51
+ </button>
52
+ </div>
53
+ <div id="filter-history">
54
+ <select
55
+ id="filter-history-select"
56
+ disabled
57
+ aria-label="Previously used filters"
58
+ >
59
+ <option value="" selected>Previous queries</option>
60
+ </select>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div class="menu_bar" id="dropdown" style="display: none">
65
+ <!-- this is where the dropdowns are handled, they are hidden by
66
+ default and only shown when called upon -->
67
+ </div>
68
+ <div class="menu_bar" id="tab-btns">
69
+ <input
70
+ type="button"
71
+ id="summary-btn"
72
+ value="Analysis"
73
+ class="custom-btns"
74
+ />
75
+ <input
76
+ type="button"
77
+ id="data-btn"
78
+ value="Host Data"
79
+ class="custom-btns"
80
+ />
81
+ <input
82
+ type="button"
83
+ id="data-tools-btn"
84
+ value="Conv"
85
+ title="Data Conversion"
86
+ class="custom-btns"
87
+ />
88
+ <input
89
+ type="button"
90
+ id="crypt-btn"
91
+ value="Crypt"
92
+ title="Encryption workspace"
93
+ class="custom-btns"
94
+ />
95
+ <input
96
+ type="button"
97
+ id="keystore-btn"
98
+ value="Keystore"
99
+ title="Persistent local keystore"
100
+ class="custom-btns"
101
+ />
102
+ <input type="button" id="stats-btn" value="Stats" class="custom-btns" />
103
+ <input type="button" id="list-btn" value="List" class="custom-btns" />
104
+ <input type="button" id="notes-btn" value="Notes" class="custom-btns" />
105
+ <input type="button" id="log-btn" value="Log" class="custom-btns" />
106
+ <div id="rotate-btns" class="menu_bar">
107
+ <input
108
+ type="button"
109
+ id="prev-btn"
110
+ value="Prev"
111
+ class="custom-btns"
112
+ style="display: none"
113
+ />
114
+ <input
115
+ type="button"
116
+ id="next-btn"
117
+ value="Next"
118
+ class="custom-btns"
119
+ style="display: none"
120
+ />
121
+ </div>
122
+ </div>
123
+ <div class="content_area">
124
+ <div class="sidebar">
125
+ <form
126
+ method="post"
127
+ enctype="multipart/form-data"
128
+ id="jsonFile"
129
+ name="jsonFile"
130
+ >
131
+ <input type="file" id="json-upload" name="json-up" hidden />
132
+ <label id="json-lab" for="json-upload" class="menu-btns"
133
+ >Load Session</label
134
+ >
135
+ </form>
136
+ <br />
137
+ <input type="button" id="pcap-filename" name="pcap-up" hidden />
138
+ <label id="pcap-lab" for="pcap-filename" class="menu-btns"
139
+ >Choose PCAP</label
140
+ >
141
+ <div id="llm-toggle">
142
+ <label class="menu-btns">
143
+ <input type="checkbox" id="use-llm" checked />
144
+ Enable LLM
145
+ </label>
146
+ </div>
147
+
148
+ <div id="leftside">
149
+ <!-- </form> -->
150
+ <!-- Dropdown menus -->
151
+ <label for="target_hosts" class="menu-btns left">Target Host</label>
152
+ <select id="target_hosts" hidden class="menu-btns left"></select>
153
+ <br />
154
+ <input
155
+ type="button"
156
+ id="setBookmark"
157
+ value="Bookmark"
158
+ class="menu-btns left"
159
+ />
160
+ <select id="selectBookmark" class="menu-btns left">
161
+ <option class="menu-btns left" value="" disabled selected>
162
+ Select a bookmark
163
+ </option>
164
+ </select>
165
+ <input
166
+ type="button"
167
+ id="save-json-btn"
168
+ value="Save Session"
169
+ class="menu-btns left"
170
+ />
171
+ <div id="file-info">
172
+ <div id="pcap-size">PCAP size: 0</div>
173
+ <div id="load-time">Load time:</div>
174
+ <div id="total-packets">Total Packets: 0</div>
175
+ <div id="filter-returned">Filtered Packets: 0</div>
176
+ <div id="timestamp"></div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ <div id="main" class="main_panel">
181
+ <div id="loading-container">
182
+ <h2>Loading packets...</h2>
183
+ <br />
184
+ <img
185
+ width="25%"
186
+ height="25%"
187
+ id="loading"
188
+ src="../assets/images/loading.gif"
189
+ />
190
+ </div>
191
+ <div id="error-container">
192
+ <h2>Error!</h2>
193
+ <br />
194
+ <p id="error-message"></p>
195
+ </div>
196
+ <div id="summary_box">
197
+ <div id="summary_content">
198
+ Load a file to get started!
199
+ <!-- <span id="loaderdots" class="loading">Loading</span> -->
200
+ </div>
201
+ </div>
202
+ <div id="stats_box">
203
+ <div id="stats_content"></div>
204
+ </div>
205
+ <div id="data_tools_box">
206
+ <div class="crypt-workspace-header">Conv Workspace</div>
207
+ <div class="crypt-subtab-row">
208
+ <button
209
+ id="conv-subtab-conversions"
210
+ class="crypt-subtab-btn active"
211
+ >
212
+ Conversions
213
+ </button>
214
+ <button id="conv-subtab-hashes" class="crypt-subtab-btn">
215
+ Hashes
216
+ </button>
217
+ <button id="conv-subtab-decodes" class="crypt-subtab-btn">
218
+ Decodes
219
+ </button>
220
+ </div>
221
+
222
+ <div id="conv-conversions-panel" class="crypt-subtab-panel">
223
+ <div class="data-tools-grid">
224
+ <div class="data-tools-section">
225
+ <div class="data-tools-title">Input</div>
226
+ <label for="data-tools-format">Input format</label>
227
+ <select id="data-tools-format">
228
+ <option value="base64">Base64</option>
229
+ <option value="binary">Binary</option>
230
+ <option value="hex" selected>Hex</option>
231
+ <option value="ascii">ASCII / UTF-8</option>
232
+ <option value="decimal">Decimal bytes</option>
233
+ </select>
234
+ <textarea
235
+ id="data-tools-input"
236
+ placeholder="Paste base64, binary, hex, ascii, or decimal byte values here..."
237
+ ></textarea>
238
+ <div class="data-tools-actions">
239
+ <button id="data-tools-convert-btn">Convert</button>
240
+ <button id="data-tools-clear-btn">Clear</button>
241
+ </div>
242
+ <div id="data-tools-error" role="alert"></div>
243
+ </div>
244
+ <div class="data-tools-section">
245
+ <div class="data-tools-title">Converted Output</div>
246
+ <div class="data-tools-output-label">Hex</div>
247
+ <textarea id="data-tools-hex-output" readonly></textarea>
248
+ <div class="data-tools-output-label">Binary</div>
249
+ <textarea id="data-tools-binary-output" readonly></textarea>
250
+ <div class="data-tools-output-label">Decimal bytes</div>
251
+ <textarea id="data-tools-decimal-output" readonly></textarea>
252
+ <div class="data-tools-output-label">Decimal integer</div>
253
+ <textarea
254
+ id="data-tools-decimal-integer-output"
255
+ readonly
256
+ ></textarea>
257
+ <div class="data-tools-output-label">ASCII</div>
258
+ <textarea id="data-tools-ascii-output" readonly></textarea>
259
+ <div class="data-tools-output-label">Base64</div>
260
+ <textarea id="data-tools-base64-output" readonly></textarea>
261
+ </div>
262
+ <div class="data-tools-section">
263
+ <div class="data-tools-title">Data Insights</div>
264
+ <div id="data-tools-byte-length" class="data-tools-kv">
265
+ Byte Length: 0
266
+ </div>
267
+ <div id="data-tools-mime-type" class="data-tools-kv">
268
+ MIME Type: Unknown
269
+ </div>
270
+ <div id="data-tools-entropy" class="data-tools-kv">
271
+ Shannon Entropy: 0.00 (Low)
272
+ </div>
273
+ </div>
274
+ </div>
275
+ </div>
276
+
277
+ <div id="conv-hashes-panel" class="crypt-subtab-panel" hidden>
278
+ <div class="data-tools-section data-tools-hashes-section">
279
+ <div class="data-tools-title">Hashes</div>
280
+ <div class="data-tools-hashes-grid">
281
+ <div class="data-tools-output-label">Hashed Input</div>
282
+ <textarea
283
+ id="data-tools-hash-input-reading"
284
+ class="data-tools-hash-input-reading"
285
+ placeholder="Type text here to hash..."
286
+ ></textarea>
287
+ <div class="data-tools-output-label">MD5</div>
288
+ <input
289
+ type="text"
290
+ id="data-tools-md5-output"
291
+ class="data-tools-hash-output"
292
+ readonly
293
+ placeholder="—"
294
+ />
295
+ <div class="data-tools-output-label">SHA-1</div>
296
+ <input
297
+ type="text"
298
+ id="data-tools-sha1-output"
299
+ class="data-tools-hash-output"
300
+ readonly
301
+ placeholder="—"
302
+ />
303
+ <div class="data-tools-output-label">SHA-256</div>
304
+ <input
305
+ type="text"
306
+ id="data-tools-sha256-output"
307
+ class="data-tools-hash-output"
308
+ readonly
309
+ placeholder="—"
310
+ />
311
+ <div class="data-tools-output-label">SHA-384</div>
312
+ <input
313
+ type="text"
314
+ id="data-tools-sha384-output"
315
+ class="data-tools-hash-output"
316
+ readonly
317
+ placeholder="—"
318
+ />
319
+ <div class="data-tools-output-label">SHA-512</div>
320
+ <input
321
+ type="text"
322
+ id="data-tools-sha512-output"
323
+ class="data-tools-hash-output"
324
+ readonly
325
+ placeholder="—"
326
+ />
327
+ <div class="data-tools-output-label">SHA3-256</div>
328
+ <input
329
+ type="text"
330
+ id="data-tools-sha3-256-output"
331
+ class="data-tools-hash-output"
332
+ readonly
333
+ placeholder="—"
334
+ />
335
+ <div class="data-tools-output-label">SHA3-512</div>
336
+ <input
337
+ type="text"
338
+ id="data-tools-sha3-512-output"
339
+ class="data-tools-hash-output"
340
+ readonly
341
+ placeholder="—"
342
+ />
343
+ <div class="data-tools-output-label">RIPEMD-160</div>
344
+ <input
345
+ type="text"
346
+ id="data-tools-ripemd160-output"
347
+ class="data-tools-hash-output"
348
+ readonly
349
+ placeholder="—"
350
+ />
351
+ <div class="data-tools-output-label">Whirlpool</div>
352
+ <input
353
+ type="text"
354
+ id="data-tools-whirlpool-output"
355
+ class="data-tools-hash-output"
356
+ readonly
357
+ placeholder="—"
358
+ />
359
+ </div>
360
+ </div>
361
+ </div>
362
+
363
+ <div id="conv-decodes-panel" class="crypt-subtab-panel" hidden>
364
+ <div class="data-tools-section data-tools-proto-section">
365
+ <div class="data-tools-title">Protocol Decoder</div>
366
+ <label for="data-tools-proto-select">Protocol</label>
367
+ <select id="data-tools-proto-select">
368
+ <option value="auto" selected>Auto-detect</option>
369
+ <option value="http">HTTP</option>
370
+ <option value="telnet">Telnet</option>
371
+ <option value="ssh">SSH / OpenSSH</option>
372
+ <option value="pop3">POP3</option>
373
+ <option value="imap">IMAP</option>
374
+ <option value="smtp">SMTP</option>
375
+ </select>
376
+ <div id="data-tools-proto-output"></div>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ <div id="crypt_box">
381
+ <div class="crypt-workspace-header">Crypt Workspace</div>
382
+ <div class="crypt-subtab-row">
383
+ <button id="crypt-subtab-ssl" class="crypt-subtab-btn active">
384
+ SSL
385
+ </button>
386
+ <button id="crypt-subtab-pgp" class="crypt-subtab-btn">
387
+ PGP
388
+ </button>
389
+ <button id="crypt-subtab-openssh" class="crypt-subtab-btn">
390
+ OpenSSH
391
+ </button>
392
+ </div>
393
+
394
+ <div id="crypt-ssl-panel" class="crypt-subtab-panel">
395
+ <div class="crypt-grid">
396
+ <div class="crypt-section">
397
+ <div class="crypt-section-title">Encountered SSL/TLS</div>
398
+ <select id="crypt-encountered-list" size="10"></select>
399
+ <div class="crypt-actions-row">
400
+ <button id="crypt-refresh-btn">Refresh</button>
401
+ <button id="crypt-apply-filter-btn">Filter packets</button>
402
+ <button id="crypt-load-encountered-cert-btn">
403
+ Load cert text
404
+ </button>
405
+ </div>
406
+ <div id="crypt-encountered-details"></div>
407
+ </div>
408
+
409
+ <div class="crypt-section">
410
+ <div class="crypt-section-title">Certificate Loader</div>
411
+ <div class="crypt-actions-row">
412
+ <button id="crypt-load-cert-file-btn">
413
+ Load certificate file
414
+ </button>
415
+ <button id="crypt-use-cert-input-btn">
416
+ Use pasted certificate
417
+ </button>
418
+ <button id="crypt-clear-cert-btn">Clear</button>
419
+ </div>
420
+ <input
421
+ type="file"
422
+ id="crypt-cert-file-input"
423
+ accept=".pem,.crt,.cer,.der,.txt"
424
+ hidden
425
+ />
426
+ <textarea
427
+ id="crypt-cert-input"
428
+ placeholder="Paste PEM certificate text here..."
429
+ ></textarea>
430
+ <pre id="crypt-cert-preview">No certificate loaded.</pre>
431
+ </div>
432
+
433
+ <div class="crypt-section">
434
+ <div class="crypt-section-title">Private Key Loader</div>
435
+ <div class="crypt-actions-row">
436
+ <button id="crypt-load-key-file-btn">
437
+ Load private key file
438
+ </button>
439
+ <button id="crypt-use-key-input-btn">Use pasted key</button>
440
+ <button id="crypt-clear-key-btn">Clear</button>
441
+ </div>
442
+ <input
443
+ type="file"
444
+ id="crypt-key-file-input"
445
+ accept=".key,.pem,.txt"
446
+ hidden
447
+ />
448
+ <textarea
449
+ id="crypt-key-input"
450
+ placeholder="Paste PEM private key text here..."
451
+ ></textarea>
452
+ <pre id="crypt-key-preview">No private key loaded.</pre>
453
+ </div>
454
+
455
+ <div class="crypt-section">
456
+ <div class="crypt-section-title">TLS/SSL Decrypt</div>
457
+ <div class="crypt-actions-row">
458
+ <button id="crypt-decrypt-entry-btn">Decrypt selected</button>
459
+ <button id="crypt-send-decrypted-conv-btn" disabled>
460
+ Send to Conv
461
+ </button>
462
+ <button id="crypt-clear-decrypted-btn">Clear</button>
463
+ </div>
464
+ <pre id="crypt-decrypt-preview">
465
+ No decrypted TLS/SSL output yet.</pre
466
+ >
467
+ </div>
468
+ </div>
469
+ </div>
470
+
471
+ <div id="crypt-pgp-panel" class="crypt-subtab-panel" hidden>
472
+ <div class="crypt-placeholder">
473
+ PGP workspace reserved for future import/decrypt tooling.
474
+ </div>
475
+ </div>
476
+
477
+ <div id="crypt-openssh-panel" class="crypt-subtab-panel" hidden>
478
+ <div class="crypt-placeholder">
479
+ OpenSSH workspace reserved for future key/session tooling.
480
+ </div>
481
+ </div>
482
+ </div>
483
+ <div id="keystore_box">
484
+ <div class="keystore-workspace-header">Local Keystore</div>
485
+ <div class="keystore-grid">
486
+ <div class="crypt-section">
487
+ <div class="crypt-section-title">Create / Update Entry</div>
488
+ <div class="keystore-mode-row">
489
+ <label for="crypt-keystore-mode">Keychain:</label>
490
+ <select id="crypt-keystore-mode">
491
+ <option value="session">Session auto keychain</option>
492
+ <option value="persistent">Persistent keychain</option>
493
+ </select>
494
+ </div>
495
+ <div
496
+ id="crypt-keystore-unlock-status"
497
+ role="status"
498
+ aria-live="polite"
499
+ >
500
+ Persistent keychain is unlocked for this app session.
501
+ </div>
502
+ <input
503
+ id="crypt-keystore-label"
504
+ type="text"
505
+ placeholder="Entry label (optional)"
506
+ />
507
+ <textarea
508
+ id="crypt-credential-input"
509
+ placeholder="Paste credentials/secrets/notes to store locally..."
510
+ ></textarea>
511
+ <div class="crypt-actions-row">
512
+ <button id="crypt-save-cert-keystore-btn">Save cert</button>
513
+ <button id="crypt-save-key-keystore-btn">Save key</button>
514
+ <button id="crypt-save-secret-keystore-btn">
515
+ Save secret
516
+ </button>
517
+ </div>
518
+ </div>
519
+
520
+ <div class="crypt-section">
521
+ <div class="crypt-section-title">Saved Entries</div>
522
+ <select id="crypt-keystore-list" size="10"></select>
523
+ <div class="crypt-actions-row">
524
+ <button id="crypt-load-keystore-entry-btn">
525
+ Load selected
526
+ </button>
527
+ <button id="crypt-open-link-btn">Open link</button>
528
+ <button id="crypt-send-to-persistent-btn">
529
+ Send to persistent
530
+ </button>
531
+ <button id="crypt-delete-keystore-entry-btn">
532
+ Delete selected
533
+ </button>
534
+ </div>
535
+ <pre id="crypt-keystore-details">
536
+ No keystore entries saved.</pre
537
+ >
538
+ </div>
539
+ </div>
540
+ </div>
541
+ <div id="save-session-dialog" hidden>
542
+ <div class="crypt-keystore-unlock-content">
543
+ <div class="crypt-section-title">Save Session</div>
544
+ <div id="save-session-dialog-description">
545
+ Do you want to save your PacketSnitch session?
546
+ </div>
547
+ <div class="crypt-actions-row">
548
+ <button id="save-session-save-btn">Save Session</button>
549
+ <button id="save-session-discard-btn">Don't Save</button>
550
+ <button id="save-session-cancel-btn">Cancel</button>
551
+ </div>
552
+ </div>
553
+ </div>
554
+ <div id="crypt-keystore-unlock-dialog" hidden>
555
+ <div class="crypt-keystore-unlock-content">
556
+ <div class="crypt-section-title" id="crypt-keystore-unlock-title">
557
+ Unlock Keychain
558
+ </div>
559
+ <div id="crypt-keystore-unlock-description">
560
+ Enter password to unlock the persistent keychain.
561
+ </div>
562
+ <input
563
+ id="crypt-keystore-unlock-password"
564
+ type="password"
565
+ placeholder="Enter keychain password"
566
+ />
567
+ <input
568
+ id="crypt-keystore-unlock-password-confirm"
569
+ type="password"
570
+ placeholder="Confirm keychain password"
571
+ hidden
572
+ />
573
+ <div class="crypt-actions-row">
574
+ <button id="crypt-keystore-unlock-confirm-btn">Unlock</button>
575
+ <button id="crypt-keystore-unlock-cancel-btn">Cancel</button>
576
+ </div>
577
+ </div>
578
+ </div>
579
+ <div id="crypt-keystore-manual-uri-dialog" hidden>
580
+ <div class="crypt-keystore-unlock-content">
581
+ <div class="crypt-section-title">Add URI/URL to Keystore</div>
582
+ <div id="crypt-keystore-manual-uri-description">
583
+ Enter URI/URL to add to the session keychain.
584
+ </div>
585
+ <input
586
+ id="crypt-keystore-manual-uri-input"
587
+ type="text"
588
+ placeholder="https://example.com/path"
589
+ />
590
+ <div class="crypt-actions-row">
591
+ <button id="crypt-keystore-manual-uri-confirm-btn">Save</button>
592
+ <button id="crypt-keystore-manual-uri-cancel-btn">Cancel</button>
593
+ </div>
594
+ </div>
595
+ </div>
596
+ <div id="list_box">
597
+ <div id="list_search_bar">
598
+ <input
599
+ id="list-search"
600
+ type="text"
601
+ placeholder="Filter list by host, IP, port, or protocol..."
602
+ />
603
+ <label id="list-group-streams-wrap">
604
+ <input id="list-group-streams" type="checkbox" />
605
+ Group by stream
606
+ </label>
607
+ </div>
608
+ <div id="list_content"></div>
609
+ </div>
610
+ <div id="notes_box">
611
+ <div class="notes-header">Selected Note</div>
612
+ <div class="notes-editor-wrap">
613
+ <textarea
614
+ id="notes-editor"
615
+ placeholder="Select a note from the right panel..."
616
+ ></textarea>
617
+ </div>
618
+ </div>
619
+ <div id="packetInfoPane">
620
+ <div id="timestamp"></div>
621
+
622
+ <div id="welcome">Processing packets...</div>
623
+ <div id="ip2ip"></div>
624
+ <div id="moredata"></div>
625
+ <div id="protoInfo">
626
+ <div id="protoInfoHead" class="PHead">Network Information</div>
627
+ <div id="protoInfoProto" class="infop">
628
+ <div id="protoInfoSrc" class="infop"></div>
629
+ <div id="protoInfoDest" class="infop"></div>
630
+ </div>
631
+ </div>
632
+ <div id="data-types">
633
+ <div id="dataTypesHead" class="PHead">Data Type List</div>
634
+
635
+ <div id="dataTypesPane">
636
+ <div id="type-head" class="infop">
637
+ <div id="mime-type"></div>
638
+ <div id="charset"></div>
639
+ <div id="encoding"></div>
640
+ <div id="language"></div>
641
+ </div>
642
+ <ul id="types-list"></ul>
643
+ </div>
644
+ </div>
645
+ <div id="active-recon">
646
+ <div id="protcols-head" class="PHead">Protcols Used</div>
647
+ <div id="protocols" class="active">Unavilable</div>
648
+ <div id="comp-head" class="PHead">Compression Information</div>
649
+ <div id="comp" class="active">Unavailable for datatype</div>
650
+ <div id="crypt-head" class="PHead">Encryption Details</div>
651
+ <div id="crypt" class="active">Unavailable for datatype</div>
652
+ <div id="website-head" class="PHead">Website Title</div>
653
+ <div id="website" class="active">Unavailable</div>
654
+ <div id="dns-head" class="PHead">DNS</div>
655
+ <div id="dns" class="active">Unavailable</div>
656
+ </div>
657
+ </div>
658
+ <div id="packetPayloadPane" class="main_panel">
659
+ <div id="payloadascii">
660
+ <div id="asciiText"></div>
661
+ <div id="asciiOffset"></div>
662
+ </div>
663
+ <div id="hexg" class="hexGrid"></div>
664
+ </div>
665
+ </div>
666
+ <div class="sidebar" id="sidedata">
667
+ <div id="rightside">
668
+ <div id="rightside-data">
669
+ <div class="sidebar-header">Datagram Frame</div>
670
+ <div id="sidedatatable" class="sidetable"></div>
671
+ <div class="sidebar-header">Location</div>
672
+ <div id="locationtable" class="sidetable"></div>
673
+ <div id="sideloctable" class="sidetable"></div>
674
+ <div class="sidebar-header">Payload Entropy</div>
675
+ <div id="entropybox"></div>
676
+ </div>
677
+ <div id="rightside-notes" hidden>
678
+ <div class="sidebar-header">Notes</div>
679
+ <select id="notes-select" size="10"></select>
680
+ <div class="notes-controls-row notes-sidebar-actions">
681
+ <label for="notes-new-color">Color</label>
682
+ <input type="color" id="notes-new-color" value="#4caf50" />
683
+ </div>
684
+ <textarea
685
+ id="notes-new-input"
686
+ placeholder="Write a new note..."
687
+ ></textarea>
688
+ <div class="notes-controls-row notes-sidebar-actions">
689
+ <button id="notes-add-btn">Add note</button>
690
+ <button id="notes-remove-btn">Remove selected</button>
691
+ </div>
692
+ <div class="notes-controls-row notes-sidebar-actions">
693
+ <button id="notes-save-btn">Save notes file</button>
694
+ </div>
695
+ </div>
696
+ </div>
697
+ </div>
698
+ </div>
699
+ <div class="footer">
700
+ <div id="status" class="footer">Status: Ready</div>
701
+ <div id="copyright" class="footer">oxasploits, llc (&copy; 2026)</div>
702
+ </div>
703
+ </div>
704
+
705
+ <div id="activity-log-panel">
706
+ <div id="activity-log-header">
707
+ <span>Activity Log</span>
708
+ <button id="close-log-btn" aria-label="Close log">×</button>
709
+ </div>
710
+ <div id="activity-log-path"></div>
711
+ <div id="activity-log-entries"></div>
712
+ <div id="activity-log-search-bar">
713
+ <input
714
+ id="activity-log-search"
715
+ type="text"
716
+ placeholder="Search log entries..."
717
+ />
718
+ </div>
719
+ </div>
720
+
721
+ <div id="convert-context-menu" role="menu" aria-label="Context menu" hidden>
722
+ <div id="ctx-copy-submenu" class="ctx-submenu">
723
+ <button id="ctx-copy-branch" class="ctx-branch" type="button">
724
+ Copy...
725
+ </button>
726
+ <div class="ctx-submenu-panel">
727
+ <button id="ctx-copy" role="menuitem">Copy</button>
728
+ <button id="convert-context-copy-hex" type="button">Copy Hex</button>
729
+ <button id="convert-context-copy-ascii" type="button">
730
+ Copy ASCII
731
+ </button>
732
+ <button id="convert-context-copy-raw" type="button">
733
+ Copy Raw payload
734
+ </button>
735
+ <button id="ctx-copy-cookie-jar" role="menuitem">
736
+ Copy Cookie Jar
737
+ </button>
738
+ </div>
739
+ </div>
740
+ <button id="ctx-paste" role="menuitem">Paste</button>
741
+ <hr id="convert-context-divider" class="ctx-divider" />
742
+ <div id="ctx-convert-submenu" class="ctx-submenu">
743
+ <button id="ctx-convert-branch" class="ctx-branch" type="button">
744
+ Convert to...
745
+ </button>
746
+ <div class="ctx-submenu-panel">
747
+ <button id="convert-context-hex" type="button">Load as Hex</button>
748
+ <button id="convert-context-binary" type="button">
749
+ Load as Binary
750
+ </button>
751
+ <button id="convert-context-base64" type="button">
752
+ Load as Base64
753
+ </button>
754
+ <button id="convert-context-decimal" type="button">
755
+ Load as Decimal bytes
756
+ </button>
757
+ <button id="convert-context-ascii" type="button">
758
+ Load as ASCII / UTF-8
759
+ </button>
760
+ <button id="convert-context-load-cursor-ascii" type="button">
761
+ Load Cursor ASCII into Conv tab
762
+ </button>
763
+ <button id="convert-context-load-payload" type="button">
764
+ Load Raw Payload into Conv tab
765
+ </button>
766
+ </div>
767
+ </div>
768
+ <div id="ctx-notes-submenu" class="ctx-submenu">
769
+ <button id="ctx-notes-branch" class="ctx-branch" type="button">
770
+ Send to Notes...
771
+ </button>
772
+ <div class="ctx-submenu-panel">
773
+ <button id="ctx-notes-send-data" type="button">
774
+ Send selected/context data
775
+ </button>
776
+ <button id="ctx-notes-send-conv-output" type="button">
777
+ Send Conv converted output
778
+ </button>
779
+ <button id="ctx-notes-send-conv-hashes" type="button">
780
+ Send Conv hashes
781
+ </button>
782
+ </div>
783
+ </div>
784
+ <div id="ctx-filter-submenu" class="ctx-submenu">
785
+ <button id="ctx-filter-branch" class="ctx-branch" type="button">
786
+ Add to filter...
787
+ </button>
788
+ <div class="ctx-submenu-panel">
789
+ <div id="ctx-filter-and-submenu" class="ctx-submenu">
790
+ <button id="ctx-filter-and-branch" class="ctx-branch" type="button">
791
+ Add with &&...
792
+ </button>
793
+ <div class="ctx-submenu-panel">
794
+ <button id="ctx-filter-ip" type="button">Add IP to Filter</button>
795
+ <button id="ctx-filter-port" type="button">
796
+ Add Port to Filter
797
+ </button>
798
+ <button id="ctx-filter-mac" type="button">
799
+ Add MAC to Filter
800
+ </button>
801
+ <button id="ctx-filter-protocol" type="button">
802
+ Add Protocol to Filter
803
+ </button>
804
+ <button id="ctx-filter-mime" type="button">
805
+ Add MIME Type to Filter
806
+ </button>
807
+ </div>
808
+ </div>
809
+ <div id="ctx-filter-or-submenu" class="ctx-submenu">
810
+ <button id="ctx-filter-or-branch" class="ctx-branch" type="button">
811
+ Add with ||...
812
+ </button>
813
+ <div class="ctx-submenu-panel">
814
+ <button id="ctx-filter-or-ip" type="button">
815
+ Add IP to Filter
816
+ </button>
817
+ <button id="ctx-filter-or-port" type="button">
818
+ Add Port to Filter
819
+ </button>
820
+ <button id="ctx-filter-or-mac" type="button">
821
+ Add MAC to Filter
822
+ </button>
823
+ <button id="ctx-filter-or-protocol" type="button">
824
+ Add Protocol to Filter
825
+ </button>
826
+ <button id="ctx-filter-or-mime" type="button">
827
+ Add MIME Type to Filter
828
+ </button>
829
+ </div>
830
+ </div>
831
+ <div id="ctx-filter-not-submenu" class="ctx-submenu">
832
+ <button id="ctx-filter-not-branch" class="ctx-branch" type="button">
833
+ is not...
834
+ </button>
835
+ <div class="ctx-submenu-panel">
836
+ <button id="ctx-filter-not-ip" type="button">
837
+ Add IP to Filter
838
+ </button>
839
+ <button id="ctx-filter-not-port" type="button">
840
+ Add Port to Filter
841
+ </button>
842
+ <button id="ctx-filter-not-mac" type="button">
843
+ Add MAC to Filter
844
+ </button>
845
+ <button id="ctx-filter-not-protocol" type="button">
846
+ Add Protocol to Filter
847
+ </button>
848
+ <button id="ctx-filter-not-mime" type="button">
849
+ Add MIME Type to Filter
850
+ </button>
851
+ </div>
852
+ </div>
853
+ <div id="ctx-filter-parentheses-submenu" class="ctx-submenu">
854
+ <button
855
+ id="ctx-filter-parentheses-branch"
856
+ class="ctx-branch"
857
+ type="button"
858
+ >
859
+ Parentheses...
860
+ </button>
861
+ <div class="ctx-submenu-panel">
862
+ <button id="ctx-filter-paren-open" type="button">Append (</button>
863
+ <button id="ctx-filter-paren-close" type="button">
864
+ Append )
865
+ </button>
866
+ <button id="ctx-filter-paren-wrap" type="button">
867
+ Wrap current query with (...)
868
+ </button>
869
+ </div>
870
+ </div>
871
+ <hr class="ctx-divider" />
872
+ <div id="ctx-filter-clear-submenu" class="ctx-submenu">
873
+ <button
874
+ id="ctx-filter-clear-branch"
875
+ class="ctx-branch"
876
+ type="button"
877
+ >
878
+ Clear and...
879
+ </button>
880
+ <div class="ctx-submenu-panel">
881
+ <button id="ctx-filter-clear-ip" type="button">
882
+ Add IP to Filter
883
+ </button>
884
+ <button id="ctx-filter-clear-port" type="button">
885
+ Add Port to Filter
886
+ </button>
887
+ <button id="ctx-filter-clear-mac" type="button">
888
+ Add MAC to Filter
889
+ </button>
890
+ <button id="ctx-filter-clear-protocol" type="button">
891
+ Add Protocol to Filter
892
+ </button>
893
+ <button id="ctx-filter-clear-mime" type="button">
894
+ Add MIME Type to Filter
895
+ </button>
896
+ </div>
897
+ </div>
898
+ </div>
899
+ </div>
900
+ <div id="ctx-keystore-submenu" class="ctx-submenu">
901
+ <button id="ctx-keystore-branch" class="ctx-branch" type="button">
902
+ Add to Keystore...
903
+ </button>
904
+ <div class="ctx-submenu-panel">
905
+ <div id="ctx-keystore-password-submenu" class="ctx-submenu">
906
+ <button
907
+ id="ctx-keystore-password-branch"
908
+ class="ctx-branch"
909
+ type="button"
910
+ >
911
+ As Password
912
+ </button>
913
+ <div class="ctx-submenu-panel">
914
+ <button id="ctx-keystore-password-session" type="button">
915
+ Session keychain
916
+ </button>
917
+ <button id="ctx-keystore-password-persistent" type="button">
918
+ Persistent keychain
919
+ </button>
920
+ </div>
921
+ </div>
922
+ <div id="ctx-keystore-key-submenu" class="ctx-submenu">
923
+ <button
924
+ id="ctx-keystore-key-branch"
925
+ class="ctx-branch"
926
+ type="button"
927
+ >
928
+ As Private Key
929
+ </button>
930
+ <div class="ctx-submenu-panel">
931
+ <button id="ctx-keystore-key-session" type="button">
932
+ Session keychain
933
+ </button>
934
+ <button id="ctx-keystore-key-persistent" type="button">
935
+ Persistent keychain
936
+ </button>
937
+ </div>
938
+ </div>
939
+ <div id="ctx-keystore-cert-submenu" class="ctx-submenu">
940
+ <button
941
+ id="ctx-keystore-cert-branch"
942
+ class="ctx-branch"
943
+ type="button"
944
+ >
945
+ As Certificate
946
+ </button>
947
+ <div class="ctx-submenu-panel">
948
+ <button id="ctx-keystore-cert-session" type="button">
949
+ Session keychain
950
+ </button>
951
+ <button id="ctx-keystore-cert-persistent" type="button">
952
+ Persistent keychain
953
+ </button>
954
+ </div>
955
+ </div>
956
+ <div id="ctx-keystore-cookie-submenu" class="ctx-submenu">
957
+ <button
958
+ id="ctx-keystore-cookie-branch"
959
+ class="ctx-branch"
960
+ type="button"
961
+ >
962
+ As Session Cookie
963
+ </button>
964
+ <div class="ctx-submenu-panel">
965
+ <button id="ctx-keystore-cookie-session" type="button">
966
+ Session keychain
967
+ </button>
968
+ <button id="ctx-keystore-cookie-persistent" type="button">
969
+ Persistent keychain
970
+ </button>
971
+ </div>
972
+ </div>
973
+ <div id="ctx-keystore-uri-submenu" class="ctx-submenu">
974
+ <button id="ctx-keystore-uri-branch" class="ctx-branch" type="button">
975
+ As URI / URL (Manual)
976
+ </button>
977
+ <div class="ctx-submenu-panel">
978
+ <button id="ctx-keystore-uri-session" type="button">
979
+ Session keychain
980
+ </button>
981
+ <button id="ctx-keystore-uri-persistent" type="button">
982
+ Persistent keychain
983
+ </button>
984
+ </div>
985
+ </div>
986
+ </div>
987
+ </div>
988
+ <hr id="convert-context-save-divider" class="ctx-divider" />
989
+ <div id="ctx-export-submenu" class="ctx-submenu">
990
+ <button id="ctx-export-branch" class="ctx-branch" type="button">
991
+ Export...
992
+ </button>
993
+ <div class="ctx-submenu-panel">
994
+ <button id="ctx-save-json" role="menuitem">Save Session</button>
995
+ <button id="ctx-export-packet" role="menuitem">Export Packet</button>
996
+ <button id="ctx-export-payload" role="menuitem">
997
+ Export Payload
998
+ </button>
999
+ <button id="ctx-save-cookie-jar" role="menuitem">
1000
+ Save to cookie_jar.txt
1001
+ </button>
1002
+ </div>
1003
+ </div>
1004
+ <div id="ctx-http-file-submenu" class="ctx-submenu">
1005
+ <button id="ctx-http-file-branch" class="ctx-branch" type="button">
1006
+ HTTP File...
1007
+ </button>
1008
+ <div class="ctx-submenu-panel">
1009
+ <button id="ctx-http-file-save" type="button">
1010
+ Save body to file
1011
+ </button>
1012
+ <button id="ctx-http-file-load" type="button">
1013
+ Load body into Conv tab
1014
+ </button>
1015
+ <button id="ctx-http-file-preview" type="button">
1016
+ Preview in browser
1017
+ </button>
1018
+ </div>
1019
+ </div>
1020
+ </div>
1021
+
1022
+ <!-- Installation complete screen – shown only on first run after a new version install -->
1023
+ <div id="install-screen">
1024
+ <div id="install-screen-inner">
1025
+ <div id="install-title">PacketSnitch Installation Complete</div>
1026
+ <div id="install-version"></div>
1027
+ <hr class="install-divider" />
1028
+ <div id="install-files-heading">Installed Files</div>
1029
+ <ul id="install-file-list"></ul>
1030
+ <hr class="install-divider" />
1031
+ <div id="install-ollama-status"></div>
1032
+ <button id="install-continue-btn">Continue</button>
1033
+ </div>
1034
+ </div>
1035
+ </body>
1036
+ </html>