why2-chat 1.6.0

Lightweight, fast and secure chat application powered by WHY2 encryption.
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
WHY2 (Chat) Changelog
=====================

v1.6.0:
- 9b4b4ea6: remove PQ keys migration
- 63b19a8b: fix p521 breaking changes
- 79888373: upgrade chat dependencies
- b04e4f48: add config test to configure_device fn
- b2dc12e1: move options Mutex import to client_voice feature
- 125e78e3: fix client_base compilation error in fileshare
- f70814d7: move audio device setup to client binary
- c0d2eafd: remove redundant LazyLock & Arc usage
- 42c8dc85: replace OnceLock usage with RwLock
- 2aeed734: move INPUT_READ to client binary
- 7b2baa1b: use crossterm for message coloring
- 205ba4ad: use default RexStream dims on chat
- 8812c190: encrypt downloaded files on server disk
- 8eaa4acd: serialize key grid properly in disk_stream init
- 257fae5d: store nonce in AvailableFile
- 99db50a8: implement chat i64 to/from u8 conversion helper fns
- 678f3384: implement Zeroizing radically
- b18365bd: do not push password to INPUT_HISTORY
- 7854f21c: add from_flat & to_flat methods to Grid
- da28785e: remove redundant server conditional compilation from ActiveFileshare client_id field
- 5c4bfe36: fix possible screen reattach rexstream mismatch issues
- 535505d9: use auxiliary tokens for rexstream init
- de596f6e: use correct MB definition
- ee533649: remove CONNECTIONS iteration from server deattach fn
- ad0d0298: implement streaming encryption for screenshares
- 81ffb5ef: implement key_exchange nonce usage in fileshares
- c8d48371: store nonce in client global var
- aee58cde: generate unique nonce on every rekey
- 5180f984: implement streaming encryption for fileshares
- a7c8a898: implement EncryptionMode in send_tcp & read_tcp fns
- f7eae386: send nonce during file upload init
- fa53c619: add possible ToFU skip
- b7f8c549: remove screen & voice commands from base feature
- 06272ce5: separate client on client_base, client_voice, client_screen features
- 9b7318f3: update dependencies
- 9a9909d5: add 5s write timeout to all connected streams
- 35891c90: parallelize send_to_all server fn
- 30a63658: fix auxiliary SEQ poisoning
- 2b191aa1: upgrade chat dependencies
- da2bb83f: store false in running on screenshare-related thread shutdown
- 2513678b: send Deattach MessageCode on deattach fn on server
- 20496938: properly shutdown attach threads on client
- e5fe7c3f: fix screen audio double-threading
- 038d17f5: properly shutdown screenshare threads on client
- ea982450: move voice::options to client only
- b657f4bb: simplify packet default implementations
- 434b50f2: fix voice Alsa backend Windows & macOS compilation problems
- ca529294: fix voice chat latency
- 0d0ae40a: fix screen connection IO bottleneck
- bb8cade1: use ScreenPacket in screenshare auxiliary connections
- e3740794: fix client uresolved import
- f2f78869: harden server auxiliary connection handling
- 1753fda2: use FilePacket in file auxiliary connection
- 11a493cb: implement SequencedPacket trait for send_tcp fn
- d1557c15: split receive on read_tcp helper & receive fn
- 7ba4f11b: do not send frames on static screen
- 26c6f982: replace CompressedFrame with direct frame vector
- cd84866c: revert "increase target FPS to 60"
- 5e0f86b7: replace custom screen compression with OopenH264
- 7fc7cf9f: increase target FPS to 60
- ca3cd3f5: remove duplicite capture code
- b8209fd1: parallelize capture via pipelining
- 43bb6a23: allow big packets on auxiliary streams
- ca6bb63a: removed redundant audio import
- ebccbe77: cleanup screen code
- c38be396: fix another winit recycle race condition
- 271fd7b5: move screen constants to global consts
- b2dfb331: add screen attach feedback protection
- 5a612364: implement audio share to screenshare
- f91dcea7: add pulseaudio feature for cpal dependency
- 38cc0d90: fix winit recycle race condition
- 6e8353db: deattach screenshare on winit close
- 1294d296: implement Deattach command
- 381be245: recycle window on attach swap
- 04bb1cb8: deattach clients on sharer disconnect
- 5fbcb230: deattach all clients on screenshare disable
- 1a334a6c: harden screen stream cleaning
- 9e164eb6: add screen attach message
- 47e549cd: make screen-related identifiers make sense
- 27e91729: implement rendering HW acceleration
- 7055c901: replace softbuffer chat dependency with pixels
- d5a434d8: remove conditional xcap usage
- df6f75c8: optimize screen resouce usage
- a0680681: add turbojpeg dependency
- b4983def: fix enormous client screen RAM usage
- dcbfd4a3: move screen EventLoop to main thread
- a62f887a: optimize screensharing CPU usage
- aecf5195: display received screenshare frames in dedicated window
- 297432ed: add screenshare client display
- df63a5ca: add softbuffer chat dependency
- 7727af84: forward screen frame packets
- 98b3f2d1: start new connection branch on Attach command
- 1e870fb2: change Connection screen_download to structure
- 5a5000cb: open new branch on Attach command on server
- 2fcb1925: add attach command
- ccbc45be: allow attaching only one screenshare at a time
- 374c320d: add screen_download_streams into Connection
- 7a85feee: add screens command
- a5af17bc: send screenshare frames to server
- 77e22502: fix screen UI formatting
- dc4da1dd: start screen share branch on screen command
- 99fd9fde: add server stream upload handler
- bcccffd2: init screenupload connection on server
- 27850b72: prepare server screen init
- 17dd9da5: add screen sharing command & code
- 6e75cb2e: reorganize chat network structure
- 0673adfe: use conditional compilation for wayland backend
- 3cf6b94a: add missing libegl-dev dependency to chat pipelines
- 9e0e28cf: disable default features for libwayshot chat dependency
- cd46ec45: move chat libwayshot dependency to linux only
- c35f6ecb: add screenshare client sender part
- b67ad3a7: add screen capture chat dependencies
- d0ecf934: upgrade dependencies
- 72791858: remove Prompt ClientEvent message parameter
- c4d395fd: fix input bar vanishing on client shortcut

v1.5.3:
- d8090c46: update chat dependencies
- 267bbba0: remove end-to-end inaccuracy from chat readme
- 4e71fc34: remove unnecessary unwrap allocations
- 9c1255b6: use old symkey for rekeying instead of obfuscation
- 695bc88d: move ACTIVE_FILESHARES to server-side file transfer backend
- 92d403a6: remove ACTIVE_FILESHARES usage from client-side file downloads
- 4efaf670: add 5s read timeout to server-side file uploads
- cd62c8fc: remove old pending tokens
- ea167997: fix client prompt bar formatting on file transfers
- 01e4ca12: move client channel to global context
- b41a5a57: log main peer_addr in file transfers
- a79bf1c8: simplify server file upload error handling
- d950d753: remove junk files on failed upload
- 082c14e7: fix dangling file streams bug
- ebdc1f27: close all file streams on disconnect_all
- 4786bcd2: shutdown file stream on remove_file_stream
- b3761912: add FileTransferGuard to remove file streams
- d5984f19: add file streams to hashmap on init
- f7c3d9c8: add file stream handler functions
- f1581008: add file_streams map to Authenticated Connection
- 1394e7e7: add uid to FileUpload
- 0e3f2e44: prevent from replay attacks on file upload
- 6ae24a2d: move file downloads to separate connection
- 5656a686: add server token generator helper
- 920dbee8: rename PENDING_HEADERS to PENDING_TOKENS
- 5419859f: move ConnectionType to server internals
- 14556683: rename File ConnectionType to FileUpload
- 9945287d: remove redundant client upload thread
- 6ad70c04: fix server uploader lookup
- 3bd92711: move server file upload logic to file connection
- 3df29338: rename file::listen_server to upload
- cf2b33c8: move client-side file upload to file connection
- 4411f5bf: add server connection helper fn
- f75cd664: add token field to FilePayload
- 03fa26a5: fix mute voice connection bug
- 9050742b: remove pending headers in server accept loop
- b02321b0: pass peer_addr to listen_server from accept loop
- 9d9bc003: remove unwrap from send obfuscation
- 3ca6034b: use header as key-exchange obfuscation key
- 24afeaa0: replace opcodes with token header
- 49adaf6c: move rand dependency to shared chat feature
- 87c39abc: send ConnectionType on listen_server init
- 452914f8: check ConnectionType on new server connections
- aa20dad0: add ConnectionType enum
- 7afed479: add file sharing backend files
- 2adac2c0: move client & server to separate network subdirectories
- 56b54623: implement VersionMismatch frontend
- 595364ad: implement hash version checking on client backend
- 2cf14427: add VersionMismatch ClientEvent
- ba491d62: send git_hash in welcome packet
- 077d5c18: compile git commit hash into env
- bb2cd50c: fix client UploadLimit formatting
- 914e4458: add UploadLimit frontend on client
- 4e057644: check for concurrent uploads on server
- 99c3814a: add max_client_parallel_uploads server config entry

v1.5.2:
- f7cf9d6f: add PQ key auto migration code
- 2a3e09ab: fix breaking changes
- d7cfdd64: update core & chat dependencies
- 070e0511: drop screen sharing support indefinitely
- cdeebeb6: start screen capture on screen approval
- bcafdbc7: update dependencies
- 5b019f50: prevent from enabling screen without voice
- 761b4fe7: pair screen command to code
- dae06e18: add screen command
- acae9b7f: fix non-linux build dependency problems
- 8d21020a: move wayland backend to wayland feature
- c4f63d25: remove chat feature usage check from build script
- aa9b7bcc: rename chat feature to _chat
- 9f53a7ac: add screen backend code
- 74f9d625: add memmap2 & wayland client dependencies (linux only)
- 8e50a4e5: add scrap client dependency
- b5fb8f89: add zstd client dependency
- ac46b220: add client screen files

v1.5.1:
- 821d08af: update chat dependencies
- dd6d0085: exclude keyexchange from spam (length) filter
- fd5a5ca7: reset spam violations on rekey
- ef493f84: fix spam warning on voice packets
- 835c3dc4: shutdown stream on connection limit
- b73524f7: block connections from same ip
- 094a55fc: add max_ip_clients server config entry
- 007839fb: remove commands from server
- d269fbb9: separate auth slots from non-auth
- 61e802f1: add max_unauth_clients server config entry
- 152e6fca: exclude keyexchange from spam filter
- aeb1dba3: log disconnect cause
- 6a3d0b05: implement max authentication time
- 8c540fe4: add max_auth_time server config entry
- 9c46d3be: add connect field to NonAuthenticated Connection
- 1224be8d: prevent from rekeying on file upload
- b8154dbc: send keepalives only to authenticated clients
- c12a4c00: set connection to alive on channel update
- 1f63599c: fix passworld length check
- d62ad0eb: prevent from spam warning on file upload
- a516636f: prevent from spam warning on KeepAlive
- 5f3eabde: fix upload list formatting
- a196782c: echo client keepalive before formatting checks
- d44d02ab: set connection to alive on auth
- 4496d897: ignore keepalives on auth
- f7959d55: update dependencies
- a15208c5: add why2 image to docker-compose example
- 798b76fe: revert "send empty packet to server on connection"
- f485b217: remove keepalive debug print
- 10ca3df0: prevent client from responding to keepalive during auth
- b11c4589: optimize send_keepalive fn
- 2bfefd5c: disconnect dead connections
- 5e09420a: set connection to alive on received keepalive
- 53e4dcf6: add alive field to Connection
- 1283138c: echo keepalives on client
- d9bce8fe: implement custom keepalive on server
- 48ce23e3: add KeepAlive code
- c974db45: remove socket2 dependency
- 12ed89fe: remove keepalive packets
- b5b7eec1: handle invalid packets on client
- 448e269b: decrease keepalive probe time to 25s
- 4e33f5d6: exclude AltGr from client shortcuts
- 3cb14211: implement keepalive on server
- c6bcf724: move socket2 dependency to chat feature
- e946ae75: prevent zombie connections on invalid read_exact
- cccb3fe8: implement NAT port shift handling
- 414e69db: run server container as unprivileged user
- ae01f26e: use /data dir in docker compose
- a8976e76: merge USER_CONFIG_DIR & CONFIG_DIR
- f1a1a47d: merge get_config_dir & get_why2_dir
- a3fec3fc: use custom WHY2_USER_CONFIG_DIR in docker build
- bc0e75de: remove opus dependency from docker build
- 1f140b51: make build script initialize USER_CONFIG_DIR
- 77789938: send empty packet to server on connection
- 2771d195: revert "add tty to docker-compose"
- f82e0e52: add chat gitignore
- 51775bec: check for command errors on server
- 0ef7afd3: add tty to docker-compose
- 0c732ab6: create chat server docker compose
- a4f1ebc0: create chat server dockerfile
- 164bb005: prevent from sending blank messages to server
- c9a56ba2: move colors to client binary
- d55f9b4e: move colors to client feature
- a2ab341a: replace SerColor with u8 color codes
- e88f9265: remove redundant Info & Warn ClientEvents
- 329c0ae3: implement DisabledFeature ClientEvent
- 49293883: implement Socks5Voice ClientEvent
- 86ae807b: implement SpamWarning ClientEvent
- 9c54bcb5: implement auth ClientEvents
- 53567d02: implement IncompatibleVersion ClientEvent
- d0ebb16d: implement file share ClientEvents
- d5315e3a: implement List ClientEvent
- b4a292b1: implement voice toggle ClientEvents
- d2b2d773: implement Username ClientEvent
- 2ec64fe7: implement UnsafeVersion ClientEvent
- 1fb5e047: implement VersionFailed ClientEvent
- 1c2111d3: implement InvalidUsage ClientEvent
- a0b050be: implement PM ClientEvents
- 8f290e13: implement login ClientEvents
- f2a6beb9: implement Join & Leave ClientEvent
- b39e1494: set server_uname globally on client

v1.5.0:
- 889b83de: use why2-chat crate for version checking
- 5737ed94: split changelog on chat & core
- 04a5c9f8: prepare workspace for version split
- 86d50983: add server upload client_id check
- ed9fd998: prevent from storing malicious chunks on server
- 7e83a566: prevent from path traversal on client
- 9f50ce42: use binary MB definition for max_upload_size
- 5ec7f592: update dependencies
- ecda04bc: use read_stream & write_stream instead of single shared TcpStream
- bf15accb: prevent client from crashing on duplicate download
- 8d2fd5d0: remove ActiveFileshare on client download finish
- 9af47855: log downloads on server
- ee87c4f3: harden client download stream handling
- f2e3585c: move dashmap dependency to chat feature
- 5782489f: move server::ACTIVE_UPLOADS to network::ACTIVE_FILESHARES
- d5f26528: move server::ActiveUpload to network::ActiveFileshare
- 79a94549: send metadata first on server download
- 41b63283: replace network::send_file payload parameter with uid
- b14d97d9: add size field to AvailableFile
- d303d3e4: make server file structs private
- 5834b099: log download finish
- 77600a9d: add FilePayload parameter to network::send_file
- de9a317a: handle download file stream on client
- 90abd6d4: add download_directory to client config
- 21df65f4: add filename parameter to network::send_file fn
- 5bd57d25: implement download code on server
- f3db1437: add code parameter to send_file
- cc549a0f: add download command
- 488c4393: reject same login as server_username
- 0eb91733: send uploads as Vec instead of BTreeMap
- e44ccf1b: send user id along with their uploads
- ca94959b: cache server_username config on server startup
- 8314ebfb: move file chunking & upload to network module
- 1802ed6e: display upload id in file command output
- 9fba440c: prevent from duplicate available files
- 4e0a267a: implement Files command output on client
- 0b13450f: serialize uploads on user level
- 537a4c02: serialize uploaded files into json on server file command
- 41ddc09a: change AVAILABLE_FILES key type to String
- 3ead8c2b: add Files command
- b4dfeb26: add Files code
- 0287b695: add filename field to AvailableFile
- 8b88264a: add uploaded file to AVAILABLE_FILES map
- 70f27957: removed redundant server_username sharing
- e507f1f9: display uploaded file announcements on client
- 1f477efa: add server username to welcome packet
- 8a968c1f: announce file uploads to clients
- e069c472: add Uploaded code
- a9fb9187: compare file hashes on upload complete
- 65520335: use array for upload file hash instead of string
- 6d6c37b3: feed each upload data chunk to hasher on server
- bd18a6b9: remove active upload on disconnect
- 674fb8c4: remove client upload files on disconnect
- b7f74ac9: implement message size check for authenticated users
- 6e0cf215: separate message length and packet size in server config
- 3bc6e355: remove junk upload file on failed rename
- f2f60ad4: fix max_packet_size check indentation
- 6d174159: log file uploads on server
- fcef0e0c: implement uploaded file renaming
- 5d5550a8: remove username field from ActiveUpload
- 7477e74d: create get_upload_dir helper fn
- 5838c2ba: print uploading file log to chat window
- 356236c6: avoid spam warnings on file uploads
- d1ce6d0c: remove last_activity field from FilePayload
- df01e7f0: implement upload chunk storing on server
- 4064e42b: remove chunk_index field from FilePayload
- 74c55447: implement file chunking & upload on client-side
- 0c193865: implement UPLOAD_CHUNK_SIZE on upload request init hash
- 28794013: add UPLOAD_CHUNK_SIZE const
- a8d8ed0c: send upload hash on upload accept
- 77c9d3fb: store requested uploads on client-side ACTIVE_UPLOADS
- 1ac257a0: add ACTIVE_UPLOADS list on client-side
- 875a7751: use uid for temp filenames
- 7f7a2a1d: create upload file in tmpdir on server
- 0a0be7e4: add UPLOADS_DIR const
- c9c55b40: add rand dependency for server
- 1452c4f4: debug log upload approval on client
- f481c2d5: approve new file uploads on server
- e140f3e9: create server list for active file upload
- a00b40fc: add max_upload_size entry to server config
- 8d451fe5: send upload request to server
- 8cbba5ba: implement Default trait for FilePayload
- 5c6250ed: add FilePayload struct to MessagePacket
- 569076fa: use Path for file upload check instead of File
- dda48740: calculate file sha256 hash on upload command
- 91c44475: simplify client invalid messages
- 15852e3c: add upload command & code
- c2a4d147: revert "optimize send_to_all channel member lookup"
- 5dc8a74d: implement Info command
- 5996f974: add Info command
- f2e0d52f: implement automatical command shortcut handling
- 56d5bf94: add shortcut field to CommandInfo
- d08a3b2b: clear voice buffers on mute
- de98cfe0: remove redundant obfuscate_data allocation
- f9b83bd0: optimize send_to_all channel member lookup
- 5991634a: add gentoo GURU link to chat readme
- a1df85a1: bind local mute to C-s
- 32486615: accept unmute as mute alias
- 17b7580d: implement chat client muting
- 70400ea4: implement local voice client muting
- 47183876: accept None in is_muted for local client
- 2d72b69c: implement peer voice client muting
- 1e4ae5cd: add is_muted check fn
- d76f2349: implement mute command on frontend
- d8f4f379: fix toggle_mute bool logic
- d33c241d: separate voice chat constants to const module
- af22d2ea: smartify voice::swap_use_voice
- beb50f44: add options::toggle_mute function
- 86c15537: separate chat constants to const module
- c5aec513: add mute command

v1.4.11:
- 4ad32c82: fix dependency update breaking changes
- 1a4deadd: update dependencies
- 58377187: implement configured audio device usage
- 8953f379: add default device note
- 775acefb: implement audio device selection
- 1bf6e09f: add audio devices into client config
- 1ce3f21b: add audio setup command
- fc4ff478: add help command for client binary
- 9b1b37d5: add voice::device module
- 15ca6ac4: use default audio device natively
- 18dec7be: implement ClientEvent::Warn
- cd9d5409: prevent find_device enumeration failure
- e6e5fb1b: prevent crash on voice-incompatible client
- e5b021f1: update dependencies
- e2e95808: upgrade dependencies & fix breaking changes
- dc8eabdf: include default configuration in binary file
- 9befe94a: merge configs init fns
- 571c478c: merge config::client_config & config::server_config
- cfd7bfb8: implement TCP Keep-Alive on client
- 6db609c8: add socket2 dependency

v1.4.10:
- 0d9a0eb7: fix chat readme license link
- 11672bd2: link chat readme in Cargo
- 104a6724: add chat readme

v1.4.9:
- abdf4d59: update dependencies

v1.4.8:
- db4fc59b: use valid 4x4 keys on voice
- f89cfecc: use 4x4 Grid for voice packets

v1.4.7:
- 5284c89e: fix invalid CONFIG_URL const

v1.4.6:
- e46d4e93: move Grid to grid module
- d32d650b: rename options module to types
- 1029ab43: move core constants to consts module
- df4abc67: trim messages on client
- a4cdbdfd: trim messages on server
- cb45eace: add untrusted_read helper for server

v1.4.5:
- dbb9e065: implement default Grid size on server
- 8900a9bc: fix options formatting
- 2d1f66fe: obfuscate unencrypted chat data
- 60f04635: add homepage to package metadata

v1.4.3:
- 23ac8b74: disable documentation generation for chat workspace
- a56a9fdb: use readme in workspaces

v1.4.3:
- 94195048: use why-chat instead of why2_chat
- cf78e481: use client feature defaultly on chat
- 6fe799d3: move build script to chat workspace
- 13e3d076: split repository on workspaces

v1.4.2:
- b4183144: disable default features for nnnoiseless dependency
- 458a518e: update dependencies
- 891d5903: fix 'invalid' message flushing
- 9a3cd262: remove base91 dependency
- 51f02309: send tcp packets with length prefix
- f30d0af4: move Argon2 helper functions to crypto::password module
- 93c50015: move key exchange functions to crypto::kex module
- 165f4c73: move crypto to chat::crypto module
- 88bd4092: implement serialization for AuthenticatedData
- fb5b3e9a: create auth feature
- 31b3b89b: force constant-time feature for chat
- fc3d75c8: change encryption key to slice instead of owned vector
- 22085dd1: implement counter mode in shared symkey derivation
- f57fb882: display address on server binding fail
- b9f10007: spawn client printer thread before configuration
- 7635f792: prevent crash on version fetch timeout
- 5a69766b: print error message on binding fail
- 9f4151f0: send ping packet every second
- 54f3fc30: forward ping codes
- 50d00537: send ping packets on client
- 8881ac04: add code field to VoicePacket
- 93c10d48: fix error typo
- 4170898a: remove unwrap from PQ decapsulation fn
- d9bfbc65: harden server on key exchange
- 6dc9c16b: raise max_packet_size to 4096
- 097e1580: implement hybrid (ecc + ml-kem) key derivation on chat
- bb776f9a: implement hybrid key derivation
- 40a30bb5: generate MK-KEM keys on server startup
- 963c8aed: add mk-kem dependency
- 28c48959: move send_command_code fn to chat::command
- c0bbc55d: implement COMMAND_LIST on tui client
- b7b800ca: create COMMAND_LIST constant in chat::Command
- 0cfcff95: move connect message to ClientEvent::Connected
- b4fa36ed: remove raw mode disabling from network::client to client::ui
- 712827f3: flush stdout after each draw_event call
- 4e850662: clear vad window fully on voice leave
- 8bb6a67a: fix server send crashes
- 8020f365: update dependencies
- 3b503abd: remove misc::clear_lines
- 4b48fcdc: fix voice peer users is_local while sending
- f128c9ae: move voice vad window to voice::ui
- 1a4e5492: fix server check_version error
- b26ff645: move sqc to client::ui
- 494d1f75: move check_version client print to mpsc::Sender
- 4a61ae53: move clears & info prints to client::ui
- 340b414a: move extra_space to client::ui
- d76c27a2: move TOFU errors to client::ui
- e8ce4614: separate client-side message printing from library
- 70cbbdcb: move client binary to separate module
- e6c782a2: fix vad window ping formatting
- 4721fd62: display avg latency in vad window
- 5765f709: calculate average latency on client
- 7f5c21b0: add timestamp to VoicePacket
- 637d0116: decrease SOUND_EFFECT_VOLUME to 10%
- 1029d38b: play join sound effect on channel change
- cda28c18: fix remove_consumer implicit leave sound
- e825229d: wait for sound effects to stop playing before dropping audio streams
- df31a478: implement voice generation guards
- c6d91b46: play sound effects on voice state change
- ddf66aaf: add lewton dependency
- 148a64b0: add connection sound effects
- 167d7a02: move voice::client to separate submodule
- ff601f95: support SOCKS5 on client
- e2752a58: use port 9150 for SOCKS5
- e6b60403: add socks5 dependency
- 8368b119: rename auto_connect_ip to auto_connect_addr in client config
- 36c7900b: add SOCKS5 config entries to client config

v1.4.1:
- b4170373: sort clients in vad window by id
- 31930c09: change DISPLAY_HOLD to 200ms
- 5302ff06: move voice::client constants to voice::options
- 35ddc5ab: prioritize release profile speed over binary size
- 3fdb5931: remove network::send redundant mutability
- 77cdd54c: fix ChannelLeave sending bug
- 94d00bdf: merge CONSUMERS and peers
- 5fc62dd0: add clients automatically on voice join
- a8234a59: fix ChannelJoin ghost client bug
- 369267f8: implement opus packet verification on server
- 7014fe9a: implement ChannelJoin code
- 6a099141: send hello packet on voice connect
- 6f60f58d: fix active speakers sorting
- 5fe7f1cc: display all users in active users window
- 04fb9952: implement ChannelLeave on Voice and Leave code
- d9f3fe64: revert sound effects
- 3a4aff6a: add voice channel sound effects
- 293810cc: move voice_client to separate module
- 65195efa: call voice_client::remove_consumer on ChannelLeave code
- e1f62fe9: display local client in active speakers window
- c3c01d79: implement display_hold for vad window
- 1190d040: use usernames for active speakers window
- 0276fc90: kill active speakers thread on voice disconnect
- 46f03def: display active speakers with left text align
- 2518d02a: display active speakers on client
- cfe46787: map client ids with usernames on client
- 2a4ddfc2: make consumers private
- 2fc58949: remove consumer from map on Leave code
- 5d241199: move consumers HashMap to global context
- 1cf6b0d2: reset server activity timer on voice

v1.4.0:
- 4e7c740f: use Relaxed Ordering instead of SeqCst
- 47eb0cf8: use server config to enable chat
- b5e97bcb: add enable_voice_chat server config entry
- 173ad3de: make voice chat default on client
- c0012c49: add helper function for removing voice connection
- 2e4b73a7: simplify server enabled info log
- 6c6d48f4: ignore ureq & rustls info logs
- edcf54de: implement logger on chat servers
- fd9e1307: add logging dependencies
- 6f02fb41: specify registration on max_auth_tries config entry
- 9d10140c: implement channels to voice chat
- ecadba62: lower gate tresholds
- a901fc4e: fix noise reduction
- 7185e1a4: fix active speaker bug
- 326baaa9: use global sample rate for voice processing
- 2c852bc3: implement noise reduction
- 38536da7: add nnnoiseless dependency
- 480a6446: update dependencies
- a5a54467: fix fluctuating normalization
- 3249c7f6: implement audio normalization & soft clipping
- 7b94b9d2: implement voice activity detection
- a7259c6c: remove cpal config duplicity
- 6313d039: implement client output audio mixing
- ad2539ef: print server voice log
- a69e26d3: use proper recipient_id for server-seq in send fn
- 614fa439: fix client input resampling
- c4f781ad: update license year
- b7d802ff: use voice SAMPLE_RATE const for constructing SampleRate
- 8d24fa1c: resample input stream
- 2beb10ed: resample output stream
- fadf5de6: allow multi-channel output device
- 952865a4: fix client voice reconnection seq problems
- c152f18d: implement voice disconnection
- ab794c9c: fix client rekey hmac failure
- ff63ca0b: verify hmac on voice receive
- 2ed2ced1: use updated client keys on voice
- 9e3fb184: implement voice packet encryption
- a2dab2fc: collect keys for voice encryption
- 95aa8bf1: move chat packet encryption to chat::crypto
- e091eb38: implement seq
- f6e47f11: verify server seq on client
- 3bc0a424: implement server_seq
- d15a7cef: implement Default trait for VoicePacket
- c2c0d1da: implement VoicePacket & Connection structs on voice chat
- 5c5e56f6: use voice::send on server & client
- 8bbf91f5: fix client underrun code formatting
- ec27ac49: correct client help output formatting
- 5460a338: verify voice packet id on server properly
- 2b2e012e: increase jitter buffer to ~400ms
- 5c577f51: include id len in client voice packets
- 5d5441ce: fix voice client crash on non-voice server auth
- a4bc15de: fix non-voice server build error
- 906b90c2: prepend id to voice packet
- 312e18ab: implement receive section on client
- f68976e5: use gag for supressing alsa errors
- a934048b: add voice options warning
- 0e4741f4: send client voice to server
- 5916bbf7: segment client voice input & encode to opus
- 50ada252: send test UDP message from client to server
- f076ae3c: create simple udp server handler
- e88732f5: allow voice on server
- e93ba7b3: add voice command
- 1a93bc0c: add voice chat dependencies

v1.3.5:
- f44732de: implement new Grid::from_bytes on chat
- d23e58ff: add rayon dependency

v1.3.4:
- f165f8bc: move serde_json dependency to chat only
- 3dd39858: implement Display & FromStr traits for SerColor
- a64b5013: replace bincode with wincode
- e2522dbc: use legacy feature in docs
- a919e296: disable legacy modules by default
- a7ea3d77: use new structure on chat
- aaedd93f: implement CTR on server
- ca613591: use LaTeX syntax in rustdoc

v1.3.3:
- ec2aae25: create SharedKeys type
- 1d427867: implement Zeroize for chat shared keys
- 29a64d03: implement zeroize on whole REX
- c325f7ab: add constant-time eq default feature
- 2f89495c: add zeroize dependency
- 1dd81b2c: use read timeout on ask_version

v1.3.2:
- 112f1909: update dependencies
- abc980e0: use TCP_NODELAY
- da22dfd1: replace reqwest with ureq
- fa3d2b1f: fix invalid CONFIG_URL
- 4240bbc2: optimize release builds
- a20f7869: remove default client feature
- f20664e1: remove chat module lib

v1.3.1:
- 191903a3: fix PM server deadlock
- 43bbc05b: prevent peer_addr unwrapping
- 556b31ee: add stream shutdown to remove_connection fn

v0.3.0-rex:
- cd4b9168: fix crates.io problems caused by rust workspaces

v0.3.0-rex:
- 2dd1a626: update dependencies
- ca244318: implement rekeying
- 7ee70f91: use looser seq verification
- 07a50ca0: decrease max_packet_size to 2048
- b3c88c4e: implement persistent buffer on receive fn
- 9098c6cf: use output parameter for key_exchange fns
- 4acf5c0f: modify keys variable directly from key_exchange fns
- 66b347e1: use unified identifier across chat
- 36614d83: replace key derivation seeding with HKDF
- 8063a3e4: implement sequence numbers on server packets
- eb57e767: add channels alias for list command
- c88d1974: implement sequence numbers on client packets
- f97480d2: use big endian instead of native endian
- 2b81e599: verify hmac on receive fn
- b7e7c0ad: prepend hmac to ciphertext on send
- 20fc606d: add hmac dependency for chat
- 7ef594f1: simplify send fn
- 537ff3e8: optimize user search
- 18ff11b4: fix last_activity iterations
- b6354d27: prevent stream poisoning on thread crash
- da7f0622: remove unused Arc from CONNECTIONS list
- 1c9228de: use DashMap instead of RwLock<Vec> on CONNECTIONS list
- fd96ddd4: update dependencies
- ecd31fbc: add raw mode guard for client
- f5a64b9c: remove unwrap from receive fn
- 3467fa89: optimize packet encoding
- 8857910b: implement random initialization vector for cipher block chaining mode
- f0c4f29e: raise max_packet_size to 4096
- 5bfa4326: fix channel name condition logic
- 173fc4c0: add build.rs bypass env variable
- 8eb67a73: update dependencies
- 5f98acc1: return trimmed parameters
- 9de1e327: move core/tests to separate workspace
- cbd748a2: fix url for chat configuration templates
- fa379e62: add why2_core alias
- f5faa9ce: split on core & chat workspaces
- f1984be3: update dependencies

v0.2.9-rex:
- 8bfeb2f8: add changelog to cargo build
- f682e7c0: add binary optimization for release profile
- 2a7a7981: add argon2 dependency for chat::server
- 3ed5561a: add colored dependency for chat

v0.2.8-rex:
- 6d42f8ac: prevent from incorrect feature usage

v0.2.7-rex:
- 082b68e0: use reqwest only in chat module
- af4b239d: remove chat feature from docs

v0.2.6-rex:
- 7b0b3ec4: use markdown readme instead of plaintext

v0.2.5-rex:
- fb4acc3e: enable docs for all features

v0.2.3-rex:
- 4404541d: rename chat binaries to have why2 prefix

v0.2.2-rex:
- 75e4295a: add semver dependency
- fcc8b455: use valid license expression
- 3b724f95: make chat dependencies optional
- 5aea26b3: replace openssl crate with r521 crate
- faaee7a8: add compile condition to chat module
- fd9c55e5: replace once_cell crate with std

v0.2.1-rex:
- d205a469: update repository url to private mirror
- 8d1ebdde: auto-update configuration files
- 08f6818e: use crossterm dependency only on client
- 904b1694: feature typo fix
- 97218c36: create client feature
- 29fbd866: replace is_server with feature conditional compilation
- e7560cbb: version typo fix

v0.2.0-rex:
- ef5e07d1: replace StdRng with ChaCha20Rng in rex
- 49ac88d8: replace termios with own crossterm implementation
- 745c018e: add crossterm dependency
- 80ec17d7: add ctrl+c handler to server
- a375b33b: replace hex with base91
- c948d94b: replace rpassword with termios
- 61620142: add rpassword dependency
- 2bdb90fe: replace lazy_static with once_cell
- dd838d53: add serde & bincode dependency
- 0fc425d8: add hex dependency
- a454e430: add openssl dependency
- 391283ca: add cargo dependency
- 5c2c5823: add more info to Cargo.toml
- 1c487104: create chat modules
- 6e039920: use sha2 crate
- 8f998ee5: replace curl with reqwest
- b6c3c5ae: use dirs crate as replacement for env
- 5845a996: add rust crate
- 8e6c624e: swap json crate for serde_json
- 05bda93c: add json crate
- 4948726d: add curl dependency
- aa2b9987: use lazy_static dependency
- 51ad286a: create very basic rust project