why2-chat 2.3.2

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
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
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
WHY2 (Chat) Changelog
=====================

v2.3.2:
- 5b60de82: upgrade dependencies
- c31939d4: implement screen w/o audio on client
- ef06f79d: add screen sound translations
- 1d49d5a3: add sound parameter to Screen command
- 69e3d703: add event.screen.muted & event.screen.unmuted to locales
- 3cfa4f07: wire screenshare muting on client
- b75edbd2: simplify server screenshare muting
- 003d6070: send MuteScreen ack to client
- 17eae3b8: implement screenshare muting on server
- 0752ae4c: add command.mutescreen.description to locales
- cfadb09f: add MuteScreen command & code

v2.3.1:
- 3ecb2c5b: fall back to the portal where wayland has no screencopy
- 6e189645: draw the cursor into portal screen shares
- 6e6f5fa9: accept a portal stream once it is streaming, not on its first frame
- 0d4d5b82: increase H264_BITRATE to 8 Mbps
- 922aafbf: read wayshot frames from a reused memfd
- aa7b8cc2: capture wayland through our own screencast portal recorder
- bf3c8058: encode screen shares in camera mode
- 2d9d2c9b: convert screen capture on the cpu with openh264's simd path

v2.3.0:
- d485d407: draw server icon in sidebar
- 2ce03fb0: implement server icons
- ae39e182: add server icon command
- b4eb0ea3: split PacketCode::Colors on ColorRequest & Color
- ab1cd528: tell client their colors in Accept packet
- 2f3914fe: add machine-translated locales
- 6de78bed: add polish plural rule
- ec89c616: shorten czech time format
- 84ba89e5: add language selection into settings
- 90e6661f: add language entry to locales
- cb669219: fix czech locale typos
- a9df4bfa: add czech translation
- 191c8518: implement i18n across client code
- 53b4f8a1: add i18n handler
- dee85ce3: add english locale file
- d9b1875d: add language field to client config

v2.2.7:
- 922f28b3: upgrade chat dependencies
- 3b30f96c: display role change notification only on target user
- 08fcaec6: wire new role change announcements on client
- ebc7ecc1: announce role change to all online users
- e4951967: wire profile roles on TUI
- e8fc74f6: add role into UserProfile
- 8f2f18ff: separate user per role in user sidebar
- ebd8b45a: add role field to OfflineUser & OnlineUser
- 53038947: add role field to PacketCode::Join
- 57035cab: add minimal contrast treshold
- 3879224f: unite WHY2 theme across all terminals
- f74d5b96: add theme setting to client
- 72690189: paint theme backgrounds in TUI
- fd04bbc8: use theme accessors across TUI
- 0caf5030: add color theme palettes to TUI
- 0d36ecb2: decrease voice buffer sizes
- abde13e5: remove history migration code for edits
- 2a4166a5: change default docker image tag to release
- 0d16de1c: fix pre-release versions in CHANGELOGs

v2.2.6:
- c5473591: wire message edits on client
- ad6df3cf: handle message edits on server
- 0591bfe5: edited field to message history
- 2e93de44: fix mention higlights covering logo
- 615153f3: remove SWITCH trigger from Command::Logout
- 1ba0f96f: improve TUI PMs rendering
- aa5ea180: make usernames bold on TUI
- fbed9a41: remove reply/reaction migration code

v2.2.5:
- f32f04b3: upgrade chat dependencies
- 19718f35: implement Hearts command
- a3839052: render message hearts on client
- 2cc8fd24: forward heart updates to client events
- 5988388f: send all 'hearters' in PacketCode::Heart
- b21c7f09: add Heart command
- b8018fc2: forward heart reaction to all users
- 935cb0cd: implement HeartRequest on server
- 0e95b855: add PacketCode::HeartRequest
- 0767e310: add hearts to message history
- 1db06655: render message replies on client
- 20a8c7af: store replies in message history
- 607f07de: wire message replies on client
- 43a10a89: wire message replies on server
- 294ab8a5: add messages::exists helper
- 8becc248: add reply field to message structs
- c4e62492: remove migration code

v2.2.4:
- 36a6b54f: add option to disable message stripes
- 784f0330: stripe every other message
- 8ec039e5: move message id to the end of the line
- 6430a5dd: disable "everyone" username
- 8be4517f: implement user mentions
- ecf34a13: move MID to the left of timestamp
- 4e77218b: hide timestamps when turned off on server
- c9f17966: handle timestamps on client
- 82d9253a: implement timestamps on server
- 214145bf: add chrono client dependency
- e8869dff: implement account deletion
- 7712cddc: handle password changes on client
- a10883ed: handle password changes on server
- 99a49675: add account commands
- ce5822d7: revert username trigger for BanIP

v2.2.4-rc.1:
- 29a5c204: add possibility to reference user in Ban & Role commands by username

v2.2.3:
- 5cb93b30: use why2 v1.5.3 on chat
- 90fd22f4: filter channel on client, not server
- 5e6c4f20: render images before scrolling to them
- 4952b06e: fix image rendering on scroll
- 91eea11b: remove messages from client-side message history on server delete
- 26f5b897: display message IDs
- bc73ddd4: implement message deleting
- 0210d65b: add message_id to PacketCode::Message
- 433cfff4: add message ids to message history
- 8d534dde: remove server_users.toml migration
- 34c884e1: wire PMs MessageColors
- 7669e25f: adjust MessageColors on PrivateMessageBack to use recipient uname color
- 01642fb9: add MessageColors to PacketCode::PrivateMessage & PacketCode::PrivateMessageBack

v2.2.2:
- 8f370812: upgrade dependencies
- f5c0af64: load history pages and pictures as they scroll into view
- be35788b: page the lobby history on the server
- 1e11001a: implement avatar cropping to square dims
- 8db810df: implement avatars in user profiles
- 5c8f88e1: fix TUI overlay rendering
- ebb01c09: add website, pronouns & status to profiles
- 1a540ee7: implement user profile bios
- 344c2641: implement typing indicator
- 8c332d67: implement upload progress bar

v2.2.1:
- cb83b5ae: unset last_pm on disconnect
- 7dd7d076: apply spam limits to PM replies
- 7dbca761: implement PM replies on server
- 7a79a6c4: add Re Command
- 261090f9: add Re PacketCode
- 12062407: implement URL opening
- 3663d99c: render markdown in the message pane
- a4eff219: implement config cache stamping

v2.2.0:
- cdaba92f: load pictures only while they are on screen
- b1abfb72: rename Password PacketCodes to Login & Register
- 05588d9e: split remaining PacketCodes on request & reply packets
- 58147d92: split fileshare packets on request & reply packets
- 9bf42732: split PacketCode::PrivateMessage on request & reply packets
- f630a676: split PacketCode::Username on request & reply packets
- 910093c3: limit /images path helper only to valid images
- 688a091e: drop TIFF & OpenEXR support
- 590ceb6f: removed unused dependency features
- a6aa0328: remove offline users from /list output
- 1b4672c9: display username_color in panels
- 3dcce81b: send uname color in PacketCode::Join
- 6b12a28f: send uname colors in List packet
- e611726b: add username_color to User listing
- 98e7e4c0: align TUI block counters to the right
- af9fe2c6: display offline users on client
- 01fc807e: serialize offline users on server
- 6afce80c: add OfflineUser to PacketCode::List
- b57a5a2d: add show_offline_users entry to server config
- 10aaced9: move misc::expand_home to TUI code
- 4a2daca8: add path helper to upload & image commands
- dd7f106b: add ArgValues::Paths to image & upload commands
- db0d3cdc: anchor the device to the right of the online panel
- de19956c: drop the silent roster request
- d9b42b21: send List packet to client on auth
- 61cffc35: maintain the online list from Join
- 2e8fe0ea: add ID field to PacketCode::Join
- a1018656: prevent reconnecting on graceful quit
- da1609d1: display client device in TUI
- 884598f4: forward device in Join packet
- d101dbaf: add Device field to PacketCode::Join
- 4fb39618: share device on client
- c4e1d867: add device field to PacketCode::Username
- 62eaabf3: split network::client into submodules
- b27a05c6: add share_device client setting
- c9c50d0a: strip control characters in network::receive

v2.1.4:
- 11438aae: overlap screen capture with the encode
- dddef45c: reconnect automatically after a lost session
- 2b5eb09d: display incompatible version message in login screen
- e89edc02: do not bake WHY2 version into HKDF info
- ca44b557: move the remaining chat consts into their consts modules
- b601ca62: move the client TUI consts into a consts module
- 7f453bd2: prevent resource exhaustion on EMFILE/ENFILE
- 5c058a97: apply spam limits to PMs
- a7da4bdc: prevent client-triggerable panics
- 8c05030c: prevent voice server panic
- bcd81ae0: use env for git hash in Dockerfile
- 0e344146: prevent false git hash mismatch
- ff359db6: use MessageRequest PacketCode on client
- 4ed9d120: upgrade chat dependencies
- 089829e2: shorten server and config comments
- 25fe1eab: shorten networking comments
- 28192bb7: shorten client comments
- c39424bd: move chat colors handling to server
- 88f67a3d: do not log server hash on missing WHY2_GIT_HASH

v2.1.3:
- 938b0682: fix history cycling on multi-line input
- 05a9a919: show the last keyframe when a viewer attaches
- ca92ab16: fix voice capture not starting mid-sentence
- e14d2ec4: implement token bucket rate limiting for voice connections
- a7a99a80: implement token bucket rate limiting on server
- 98b3f8a7: apply SpamWarning only to regular Message packets

v2.1.2:
- 495a0a67: animate GIFs in the chat pane
- c415434f: upgrade chat dependencies
- 45c40470: fix TeX rendering config entry
- db10946d: render code blocks and math in chat messages
- 9f26ffe4: send username_color with images

v2.1.1:
- 0cf08812: make the server's log level configurable
- 82d4972e: say when the message history is discarded
- 45181b1d: log auxiliary connections as their main connection
- 503cf552: log every step of a connection's life
- 80850da8: give PacketCode a name that carries none of its fields
- 4660be22: mention auto_show_images in prose files
- 55f2270d: add client config entry to disable auto image loading
- dd5d3fa2: authenticate cached images
- 85d64f8a: offer stored images instead of pushing them
- 56a56451: cache images on the client
- 5e07e535: move at-rest keys to the config root

v2.1.0:
- 0b00801a: add limits to image sharing
- 740ed677: cache image uploads
- bfdb4b38: add drag selection to the message pane
- 63e7e2ac: prevent orphan images on non-lobby upload
- 42062b8c: add images to message history
- 6671dc02: crop image instead of resizing
- 60c3a92a: display images in TUI after upload
- c09c9942: use custom wincode config to allow large packets
- 5f3615ad: add client image dependencies
- c31d5344: check for valid image on Image upload
- 29047c2e: display ClientEvent::Image on image upload
- 2e608428: handle image uploads on server
- cbb99c8c: generate server image_key file
- f08b33ee: implement client image upload
- 36ce6b2c: open file connection on server on Image code
- 72a841a5: add client image command
- d43c264b: move history_key body into helper fn
- 134d45b2: remove server_users migration code
- 0834912b: update outdated chat README

v2.0.1:
- a415718f: preserve lobby messages when switching channels
- 1e57d9a0: make voice users visible to all clients
- 938cf211: add screenshare start/end global notification
- da683844: notify client on peer client attach
- 0cc4f3c4: prohibit attaching same screenshare twice
- 8873f605: fix active_speakers blinking
- b79250c9: mention windows_resources in prose files
- 881aa033: use windows_resources feature in pipeline server builds
- c146de6a: embed windows executable info to chat binaries
- 369631a3: add WHY2 chat binary icon
- 602d6ef2: add winresource chat build dependency
- 98388e6e: send History packet before Accept
- 159018c3: implement custom SCREEN_FRAME_SINK

v2.0.0:
- fcc12634: add screenshare audio volume control to client settings
- 64b99556: spawn one forward task for each attached client
- b4fc409c: shed the viewer's audio backlog instead of playing through it
- 5a95d041: cap the screen share's socket buffers
- 70e0653d: search for the echo delay coarse-to-fine
- 60cf5733: put the best filter back instead of giving up the echo lock
- 573c8e29: scale the echo canceller's step by how much of the capture is its own echo
- 5f6751dd: keep the echo canceller aligned through dropped chunks and drift
- 08b1ad65: use random history key instead of Sha256(ECC || ML-KEM)
- 561d801b: end the session when a rekey fails to verify
- 66effe7a: sign ephemeral exchange keys with the static server identity
- 2158f101: add wire adapters for the key exchange key types
- 3cb63a82: replace role constants with a role enum
- 777eb785: implement chaning user roles
- ec37cc0d: add prefix-based history on client
- b1e74f55: encrypt message history on disk
- 59d6f259: replay message history on login
- 42eeb857: store lobby messages on server
- 957e3e70: add History packet code
- 86df54d8: shorten send_bans comment
- 8935c897: authorize streamed packets
- 7f75195a: add hmac dependency to chat
- 766d2176: split config & server into multiple files
- a4aaf5ee: add ServerSay command
- bf268293: implement pardoning
- 755eab0a: implement IP banning
- f2b55a6b: update dependencies
- 637730fe: store banned users as an array
- bcbae5ca: move server bans to separate config file
- 3056ae02: paint the viewer letterbox black
- a9be63e6: implement monitor picker on Screen command
- f99cad5f: fail password verification on banned users
- c35f5249: implement banning
- 765ef2da: prepare ban command
- 80894e42: add banned field to server_users
- 24ab4ddb: disallow muting/kicking same or higher roles
- f86ca460: display very serious message on screenshare when server-muted
- c339c57c: implement ServerMute command
- 7a17b437: fix spam warning on ServerKick
- ec31c149: implement ServerKick command
- 11b0516a: fix chat default feature
- 1ca30b49: add Logout command
- 6d5ee7ed: improve settings scrolling
- 05405f6b: implement ServerRestart
- 9c1d0bbb: move server config entry description to separate block
- c4900ad0: add restart required note to server settings
- 007d1b5f: rename server config voice chat category to features
- 9b388ef3: move role definitions to consts module
- 533e1bee: implement server settings command
- 84094783: add scrollbar to TUI windows
- 50c22482: sort color menu alphabetically
- 2758ea26: implement color helper on color & ucolor command
- 8cb08ae2: prepare admin mute, kick & settings commands
- a7925a77: hide unprivileged commands on client
- a54fa295: add minimal_role requirement to commands
- 0ab272ac: add role field to Accept code
- 30c1bac0: notice first user they have been granted owner role
- 60e956d1: set role to 0 on migration
- 0c1efbdb: add role field to new users
- 96d40462: change set_user_field value parameter type to Value
- 952a1480: prepare server_users for roles
- 25753992: simplify user storing
- 96d112ce: store users as sub-tables
- f0938ca5: yet another macOS compilation fix
- 636b79f8: fix macOS screenshare compilation
- 8d1f4124: change panic strategy to unwind
- eb7c945c: implement stricter packet size ceiling
- 32f29b6f: remove redundant screenshare test code
- 63f7c510: fix possible voice connection hijacking
- 9d765b0a: fix possible server DoS
- fbcd8a2c: remove share aec test code
- 0c15f5eb: find the echo delay under a loud share
- 8c23c936: recycle the wayland capture connection
- 242ceea7: implement screen sharing AEC
- 10d0e0ab: render the screen share viewer on the gpu
- b6242d55: convert rgba to i420 on the gpu
- 30c2fbfc: prefer the os-native screen recorder
- 36ca63f0: replace pixels with wgpu
- 7c18e0ef: add disable logo option to settings
- 1368fef7: display rexlogo in the center of chat window
- 0a581235: add text rexlogo
- 35f6773b: implement 3s server dial timeout
- cd5f62e0: return to login screen on server-side disconnect
- 297ffa00: dynamicaly grow address input box on errors
- d2f13fd6: move auth into login box
- 4613f618: move server address prompt to TUI
- 7e0b09df: hide command palette & user list during auth
- d2e7c0ef: reconnect on ToFU match
- 472d4c53: move ToFU verification to TUI
- d223ec19: fix non-default audio device crash
- 550a0c7f: remove audio-setup client flag
- 9c472491: bind settings to C-,
- 80005717: add settings overlay behind /settings
- 0c45153a: render chat messages through the theme
- 3a813864: rebuild voice streams on device change
- e9066154: add audio preferences to voice chat
- e9bb3f92: add typed config writers
- 462abbb5: implement CommandArg description on TUI command palette
- 1e9830f1: add description field to CommandArg
- 89cb93a6: remove restart note from configuration files
- c6606567: clear message history on channel switch
- 5134659a: simplify tui::draw imports
- 95cbd65c: fix TUI color palette
- 306c2ed5: reformat TUI code
- 551b276b: replace the client ui with a full-screen tui
- 03532240: add ratatui to the client
- bc122def: optimize screenshare cpu overhead
- b8f5f5aa: fix audio normalization bugs
- 673ba7ad: notify client on screenshare fail
- 964bb58e: fix fileshare download key mismatch
- fb402225: fix extra space leaking into the next printed output
- 77121fae: run both binaries on a tokio runtime
- fe86b30d: port file, screen and voice subsystems to async
- 4c5795f3: port client networking to tokio
- b8c5c300: port server to tokio tasks and abort handles
- 59e71625: drop sync TCP handlers in favour of async
- fa54272a: implement async client listen_server
- 12d1fc76: add client::connect_async fn
- cc9e0f9d: fix server compilation errors in async net handlers
- 6ac48101: create async cousins of TCP handlers
- 72174433: add async version on Streams type
- 0bab88e9: implement tokio runtime for chat binaries
- c64d3733: add tokio dependency
- 7bc2d3f5: cache chat configs
- 7866dae2: implement agc voice normalization
- 80292794: implement dynamic voice gating
- eef8bb92: implement VoicePacketCode on voice connections
- 38dcf8fb: implement ScreenPacketCode on screen connections
- a825494d: implement FilePacketCode on file connections
- 0ad86285: fix attach code server deadlock
- 17fb0fe7: fix lobby channel broadcast bug
- 1f5c31e1: run client file upload preparation on separate thread
- 9927fdac: implement LoginState on client
- f99f0058: implement PacketCode on server-side
- 80da1a4c: add missing PacketCode parameters
- 166f6174: fix Attach command parameters
- 5303e0a5: implement PacketCode on client-side chat
- f102cf5a: implement PacketCode in network module
- 9a214f66: recreate MessageCodes as codes::PacketCodes
- 7b4d99e6: add network::codes module
- e6eeb9a7: enforce strict server key-file permissions
- 0e3819f2: add ChannelCreated & ChannelDestroyed ClientEvents
- a6078ab5: send ChannelCreated & ChannelDestroyed codes on client channel switch
- b842c2e2: add filter_channel bool to send_to_all fn

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-sync:
- 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.1:
- 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