Compare commits
1,853 commits
master
...
refactor/r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b989d8d41 | ||
|
|
8f191372c4 | ||
|
|
20d368a700 | ||
|
|
8eaed8c5f6 |
||
|
|
eacc8a0a20 |
||
|
|
1a5c6dceee |
||
|
|
52d0b30549 | ||
|
|
e999741e9b |
||
|
|
bbc4e532c4 |
||
|
|
e01d0feb22 | ||
|
|
4097aa363b |
||
|
|
716507b488 |
||
|
|
18a9d79446 | ||
|
|
208639b5c7 | ||
|
|
b498907629 | ||
|
|
59cadb7aa0 | ||
|
|
09b57a21c4 |
||
|
|
5dc3e21699 |
||
|
|
bb92e82663 | ||
|
|
247ce87fe7 |
||
|
|
7f2b5b7a6f |
||
|
|
30ffbba060 |
||
|
|
c0d2c1e237 |
||
|
|
801acd01df |
||
|
|
0143928943 | ||
|
|
cef60037fd | ||
|
|
7128231708 | ||
|
|
9f87e52731 |
||
|
|
1f45359485 |
||
|
|
db01b66c6b |
||
|
|
e34cee0087 | ||
|
|
a572244e62 |
||
|
|
37e57f679d |
||
|
|
04d99e376c |
||
|
|
5d0dd30685 |
||
|
|
8b99993faa | ||
|
|
fa06d48497 |
||
|
|
470c929b42 |
||
|
|
f4ff0c0fde | ||
|
|
b16458f121 | ||
|
|
19b2ec7fbe |
||
|
|
77cb9866a2 | ||
|
|
05cbe108de | ||
|
|
9d6c03ca57 | ||
|
|
79159a0605 |
||
|
|
284c67d037 | ||
|
|
c0862bf6d4 |
||
|
|
2db6a1c427 |
||
|
|
7e74a5d9d0 | ||
|
|
d9348686dc | ||
|
|
e6bf084197 | ||
|
|
985ce8deed | ||
|
|
d5cd33d4fb | ||
|
|
259c33dfda | ||
|
|
513669bf13 | ||
|
|
4af09b43a8 | ||
|
|
72fcf2fa1c | ||
|
|
fb0f10ca70 | ||
|
|
46d27c526b | ||
|
|
df2175b950 | ||
|
|
403be215a2 | ||
|
|
cf42f57592 | ||
|
|
9742aec9af | ||
|
|
1aaa50ab42 | ||
|
|
679e4843d2 |
||
|
|
ec78af1fee | ||
|
|
c8b4d8534b | ||
|
|
bc13f7377a | ||
|
|
c8fc68a66b | ||
|
|
2f534f0a5e | ||
|
|
282854a964 | ||
|
|
65b1b838f2 | ||
|
|
7bbfc52ca7 | ||
|
|
39e5d47477 | ||
|
|
7b7c27271d | ||
|
|
ee2dbd289f |
||
|
|
6592db81cb | ||
|
|
70c969bf3b | ||
|
|
3bdd10d2ca | ||
|
|
3c8f80ce09 | ||
|
|
371418ecd6 |
||
|
|
f91b8cfeb1 | ||
|
|
279eea9799 | ||
|
|
a23c3c4e87 | ||
|
|
9a363d7be5 |
||
|
|
103ff347e0 | ||
|
|
537c74327d |
||
|
|
9a131a049d | ||
|
|
fd7b7cd50c | ||
|
|
10816dd1c2 | ||
|
|
8d28e2d06b |
||
|
|
a0d2e03f64 | ||
|
|
8598034942 |
||
|
|
9158c49e30 |
||
|
|
d7d6720d54 | ||
|
|
37fb9b9ba5 |
||
|
|
9db2f74c44 | ||
|
|
897479d52b |
||
|
|
be0e9bab9b | ||
|
|
0abad1ffb2 |
||
|
|
1fb60abdc9 |
||
|
|
862e2e8d6c | ||
|
|
93c307b4b2 |
||
|
|
4dce80d887 |
||
|
|
23b3424415 |
||
|
|
ee7e95af52 |
||
|
|
9039051fd3 |
||
|
|
a1dd1f4d19 | ||
|
|
d0aa2a6e1f |
||
|
|
f1a4ffe72d |
||
|
|
722717a11e | ||
|
|
53c2275fea |
||
|
|
53cd30acc7 | ||
|
|
0b6dfe032c |
||
|
|
a06d55804c |
||
|
|
3256041d8b | ||
|
|
cee729dd85 |
||
|
|
0de429b8fc |
||
|
|
7bc6501a84 |
||
|
|
9ebdf229bb | ||
|
|
2604ecc0f8 |
||
|
|
ab33eb594e |
||
|
|
3b055efcae | ||
|
|
f30c888c5b |
||
|
|
e34c172f0c | ||
|
|
9174be76f2 |
||
|
|
0271c9e10c | ||
|
|
618489800c |
||
|
|
6b8c8d495f | ||
|
|
a81cb18f0c |
||
|
|
a13a426bcc | ||
|
|
6eb9415d37 |
||
|
|
84b9021ea9 |
||
|
|
f3af37be72 |
||
|
|
531f9e0c5b |
||
|
|
9b03981d06 |
||
|
|
698d950add |
||
|
|
c5af373c43 | ||
|
|
35500c891e |
||
|
|
3da9b0a8de | ||
|
|
2c9d23b040 |
||
|
|
780568b030 | ||
|
|
4fbe0353f7 | ||
|
|
b1dd5a437b | ||
|
|
f0a8bcad34 |
||
|
|
bf1173c831 | ||
|
|
4607913b67 |
||
|
|
41ba4e7d11 |
||
|
|
657ca6b2c4 |
||
|
|
404b49e3f4 | ||
|
|
9ad954b8d8 | ||
|
|
2b8baf0751 | ||
|
|
17bce06c58 | ||
|
|
acae20950f |
||
|
|
e0cd24272c |
||
|
|
38c89e06b5 | ||
|
|
3d46f4867d | ||
|
|
b35ee41073 | ||
|
|
54942d4f34 |
||
|
|
e80cf28578 |
||
|
|
726c7546ce | ||
|
|
c4b614cb10 |
||
|
|
2e396bd48f | ||
|
|
a878b2c1af |
||
|
|
47d827c394 | ||
|
|
f2c90b00f2 | ||
|
|
6f4df3206d | ||
|
|
04a5e4d768 | ||
|
|
d1a7299e27 | ||
|
|
29f751931a | ||
|
|
637713fae6 | ||
|
|
c62a094b9a | ||
|
|
96dff3885d | ||
|
|
873848a077 | ||
|
|
7c8cc6c0e1 |
||
|
|
9d9d67984f |
||
|
|
89f9365c3d |
||
|
|
f4d1a5db5d | ||
|
|
7545701088 |
||
|
|
c863d2ce87 | ||
|
|
dc20ce1fd6 |
||
|
|
7d0016bbbe |
||
|
|
9336875969 |
||
|
|
f50061f7c9 | ||
|
|
e989d0d248 | ||
|
|
561473d992 |
||
|
|
d16371b119 | ||
|
|
f3ad34f475 | ||
|
|
db4385faed | ||
|
|
d813202159 | ||
|
|
efa82ec5f3 | ||
|
|
431869bf84 | ||
|
|
46176d32e4 | ||
|
|
ab42b12628 | ||
|
|
96aa27eb9b | ||
|
|
b8630ca7b5 | ||
|
|
5bac6d7d19 | ||
|
|
3594b77666 | ||
|
|
f8175363cf | ||
|
|
ea2e0ec891 | ||
|
|
4d8ec29feb | ||
|
|
3f0091aba9 | ||
|
|
55f2782559 | ||
|
|
0d02db8ce6 | ||
|
|
7e21ce614a | ||
|
|
af2f054813 | ||
|
|
3c78e45426 | ||
|
|
c42b84f2e2 | ||
|
|
11b63088fb | ||
|
|
c8c5bd15e7 | ||
|
|
fc510586df | ||
|
|
c84506a8a8 | ||
|
|
986efc7e7f | ||
|
|
b652e61e2c |
||
|
|
c36618c2ac | ||
|
|
54d5b989bb |
||
|
|
c3b169f0d3 | ||
|
|
0ed4e05946 | ||
|
|
bbd5d99667 |
||
|
|
6e4e340ade | ||
|
|
a3a5d25d90 |
||
|
|
d58d4ba758 |
||
|
|
8ac5984dfd | ||
|
|
11751beb8a |
||
|
|
57d55643bc | ||
|
|
f091eee98b |
||
|
|
8cd89fc5ef | ||
|
|
0f23972fed |
||
|
|
ca594c5919 | ||
|
|
f1037c8e22 |
||
|
|
e2c95ba292 | ||
|
|
84fcd705cc |
||
|
|
f5fa1158dc | ||
|
|
6023f8ba5b |
||
|
|
a72bc5039c | ||
|
|
6665a3a4b3 |
||
|
|
4d888a3df6 |
||
|
|
f70b9bf229 | ||
|
|
3d1dc86079 | ||
|
|
cb76ef8c60 | ||
|
|
4a9d693e93 | ||
|
|
cbf70499c3 | ||
|
|
751e4afe3f |
||
|
|
966e3d5fbc | ||
|
|
bb53fcbfac |
||
|
|
386034e1ef | ||
|
|
c6f6b0d054 | ||
|
|
91ee276115 | ||
|
|
bfd7a6279c | ||
|
|
335fa0bcc5 |
||
|
|
ff6a333621 |
||
|
|
da9fd9690d |
||
|
|
c179893911 |
||
|
|
a937780218 | ||
|
|
afbbcc9521 |
||
|
|
c567263f56 |
||
|
|
9d51280ec6 |
||
|
|
f4b9677bdc | ||
|
|
04ebc69fc6 | ||
|
|
1993ae3d8f | ||
|
|
f7326d8fef | ||
|
|
89ef7f7c55 |
||
|
|
91f4906908 |
||
|
|
043c4a0d94 | ||
|
|
4bfc52f0b5 |
||
|
|
8115b88a71 | ||
|
|
15812b4f80 |
||
|
|
47af2d2d48 | ||
|
|
fb664a7c48 |
||
|
|
b7414a4303 |
||
|
|
fdff7e7b21 | ||
|
|
bf805b4152 |
||
|
|
c2ba85663f |
||
|
|
3f11d4e3fa |
||
|
|
fe717c42b5 |
||
|
|
1a03404983 | ||
|
|
b3c01f4c67 |
||
|
|
26a18ef7a0 |
||
|
|
69929c2c37 | ||
|
|
c02ba8f5d6 |
||
|
|
1cf9042063 | ||
|
|
d863e525e3 |
||
|
|
10447e6fcd |
||
|
|
ca449a7706 |
||
|
|
9fe9c6647e |
||
|
|
1227f140b7 | ||
|
|
4c70d4501e |
||
|
|
ed81ab01e7 |
||
|
|
a9222b538d |
||
|
|
b0871c19e1 |
||
|
|
55277fd695 |
||
|
|
6539c80ba2 |
||
|
|
68c14d711b | ||
|
|
afcdb15503 | ||
|
|
48e3bd3dd4 |
||
|
|
8d999ba34d | ||
|
|
5f1c2ff6dc | ||
|
|
d9a003b56c |
||
|
|
4721add9b8 |
||
|
|
09e71d82b5 | ||
|
|
c2f25131d7 |
||
|
|
a412b70be5 |
||
|
|
81d1459b68 |
||
|
|
db5b0dcd4b |
||
|
|
67058c0923 |
||
|
|
6dc51420ac |
||
|
|
7bd1b4911c | ||
|
|
33a9c05213 |
||
|
|
9d6e6232d6 |
||
|
|
23bf36d36f |
||
|
|
906cd7003d |
||
|
|
f8e4eeb405 |
||
|
|
9f2b992d36 |
||
|
|
c08d2d72c3 |
||
|
|
bf762699bd |
||
|
|
a29b4f0861 |
||
|
|
b5ef00fd42 |
||
|
|
cc5b46cba1 |
||
|
|
b566b1830d | ||
|
|
12022e4947 | ||
|
|
4e2a3505bb |
||
|
|
fd89187c2f | ||
|
|
7a71836224 | ||
|
|
23e1f8923c | ||
|
|
101b09676d | ||
|
|
810dfbb11b | ||
|
|
e018ad6b92 | ||
|
|
234aea19bd | ||
|
|
5b88b485a9 |
||
|
|
112ba7ad4e | ||
|
|
584872eb9a |
||
|
|
1481b30610 |
||
|
|
e11479170a |
||
|
|
919524f287 |
||
|
|
cd06965b1a | ||
|
|
c15155b29b | ||
|
|
426b9fc61e | ||
|
|
fb8f12aca9 | ||
|
|
6857fb840a | ||
|
|
9668e348d8 | ||
|
|
b029a84fe4 | ||
|
|
4532b625c9 | ||
|
|
89cafbab55 | ||
|
|
50fe8cb855 | ||
|
|
425c3469b2 | ||
|
|
6a91656914 | ||
|
|
a3affdc963 | ||
|
|
b8fdee2a3a | ||
|
|
cad1fae3e4 | ||
|
|
52cd0d4cc7 | ||
|
|
a25ea74d5c | ||
|
|
d3d95e07d1 | ||
|
|
a5c43da52f | ||
|
|
cbfbf4699a | ||
|
|
e8765607ff |
||
|
|
9f96439ba1 |
||
|
|
568aa6602f |
||
|
|
b635b8eef5 |
||
|
|
504d456dea |
||
|
|
0bb90b421f | ||
|
|
859e843d02 | ||
|
|
71d11c9469 | ||
|
|
9b0c653948 | ||
|
|
67edf873be |
||
|
|
0fc13fee63 | ||
|
|
4b98ffd590 | ||
|
|
c244eeb21f |
||
|
|
3087ba0bdc |
||
|
|
66ad93d9d5 |
||
|
|
7b7f3cd754 |
||
|
|
0b7d1f4f67 |
||
|
|
a55c1fedcb | ||
|
|
01ed7affc9 |
||
|
|
fbd39c24f4 | ||
|
|
edfa223e2f | ||
|
|
5452135dcb | ||
|
|
3e9f7fce4e | ||
|
|
a8c8417d16 |
||
|
|
1bdeda8530 |
||
|
|
4cc8d1cc2f |
||
|
|
16ea4c72fe |
||
|
|
86f891673a | ||
|
|
d03a63e1b7 | ||
|
|
d126a3196c | ||
|
|
1d75dd030f | ||
|
|
fe29d1405e | ||
|
|
2da5955db7 |
||
|
|
ae4ed4fe31 |
||
|
|
2c99f9e43c |
||
|
|
371e05cb1f |
||
|
|
471ea9350b |
||
|
|
323327b53f |
||
|
|
83005be066 |
||
|
|
2134bc6e0d | ||
|
|
9ebc82afbb | ||
|
|
f143bd6866 | ||
|
|
a1c26a3fd9 | ||
|
|
47f264d010 | ||
|
|
b7c6c82cf3 | ||
|
|
6e93efcdc1 | ||
|
|
a49285bc21 | ||
|
|
dd206c4b67 | ||
|
|
3716acaae4 |
||
|
|
fe4e6c766b |
||
|
|
fa5b486966 |
||
|
|
44fcdf9ad7 |
||
|
|
582ad826b8 |
||
|
|
45d9bbcfae |
||
|
|
cbbba79340 |
||
|
|
2abd05f783 |
||
|
|
191ce6bba3 |
||
|
|
934d8c8871 | ||
|
|
b942293823 |
||
|
|
900da01ad7 | ||
|
|
51c0d1dcdc | ||
|
|
af3c6afb3b | ||
|
|
c922a7e685 | ||
|
|
40117e6565 | ||
|
|
ce8c10247d | ||
|
|
9e3786c9ea | ||
|
|
800810f092 | ||
|
|
2bfbe7f902 |
||
|
|
1618d53967 | ||
|
|
dabc18f663 | ||
|
|
73705dc56a | ||
|
|
754a41537a | ||
|
|
8d9dc19e17 |
||
|
|
e9916158c0 |
||
|
|
52df4837e0 |
||
|
|
f7aaf848ba |
||
|
|
5154f0b60f |
||
|
|
9fa596780b |
||
|
|
59cc71bdbb | ||
|
|
c0a83efe6d |
||
|
|
7287c1eb5c | ||
|
|
d1d57c132c | ||
|
|
f311a33bdd | ||
|
|
b55f4ea8e3 | ||
|
|
be28da26b8 | ||
|
|
94d03d5f13 | ||
|
|
685d8101aa |
||
|
|
833d533ed7 |
||
|
|
da0da5fc69 |
||
|
|
66ba876a65 | ||
|
|
9fcede47f7 | ||
|
|
421b75ef21 |
||
|
|
89a70b94de |
||
|
|
facc47bd30 |
||
|
|
0222bfa728 |
||
|
|
edb90bdaab |
||
|
|
b2a0e2972a |
||
|
|
e973f5ad86 |
||
|
|
f59798ef1d |
||
|
|
eb8a1b53d2 |
||
|
|
2d57b5b1d5 |
||
|
|
29706a4bf8 |
||
|
|
b80ec34550 |
||
|
|
6344a8a553 |
||
|
|
1f5e9852e4 |
||
|
|
e97c390f12 |
||
|
|
7e5edfdfe3 |
||
|
|
81211d56d9 |
||
|
|
7453df5aa1 |
||
|
|
b3cd25cb4a | ||
|
|
a9c031155a | ||
|
|
afb4bd933d |
||
|
|
a8e91e7aec |
||
|
|
f891096d97 |
||
|
|
be1d500974 |
||
|
|
0b546a1856 |
||
|
|
9e2e980e52 |
||
|
|
371e103290 |
||
|
|
0a05348220 |
||
|
|
7977a81606 |
||
|
|
3fba0cfb22 |
||
|
|
c482c85c7b | ||
|
|
dcda263fc8 | ||
|
|
f46352dbe1 | ||
|
|
1d575e3453 |
||
|
|
bd74170fb6 |
||
|
|
1b00dc9ac7 | ||
|
|
e62c0b0b80 | ||
|
|
f6750c3a48 | ||
|
|
3f22e1fe0c |
||
|
|
75dbe85ad6 | ||
|
|
9a41b0ce9f | ||
|
|
5f8a858aa9 | ||
|
|
8c3ee8f1bd | ||
|
|
b313f2cee1 | ||
|
|
bd5c82ef35 | ||
|
|
1022f47f14 | ||
|
|
743882a9b9 | ||
|
|
9db28ec5fd | ||
|
|
38ac5f799b | ||
|
|
1db65a84c3 | ||
|
|
af5abda8b1 | ||
|
|
7d0f7f4652 | ||
|
|
276c653b1d | ||
|
|
d25f923721 | ||
|
|
b102279630 | ||
|
|
1f821667f2 | ||
|
|
7f496c971d | ||
|
|
9a4542347d | ||
|
|
a68391880c | ||
|
|
5ddb27fd3f | ||
|
|
448c78b226 | ||
|
|
ace4f70e3a | ||
|
|
9948cee1f7 | ||
|
|
f870dcc168 | ||
|
|
b2b8f14053 | ||
|
|
f6a5bed582 | ||
|
|
81b40d2afe | ||
|
|
ef3b7d2bc3 | ||
|
|
be1da68dbc | ||
|
|
5dc7bd97f2 | ||
|
|
9adeef2bdf | ||
|
|
e55bf8dffc | ||
|
|
94f245f035 | ||
|
|
88f13369b6 | ||
|
|
b1db2bba12 | ||
|
|
471402556b | ||
|
|
010100456d | ||
|
|
14d6623c13 |
||
|
|
c58709c1a3 | ||
|
|
bd857385d3 | ||
|
|
d98f528734 | ||
|
|
25256f747f | ||
|
|
58b5c105a5 |
||
|
|
4af058bd02 | ||
|
|
ee885fea44 | ||
|
|
b60ef7729e | ||
|
|
e4e24a0f00 | ||
|
|
bccff0f73e | ||
|
|
137bcc5cbb |
||
|
|
4a2dc2875f |
||
|
|
3a3458cff0 |
||
|
|
e810d6a4b0 | ||
|
|
6d15f08db4 |
||
|
|
2cb0dac648 | ||
|
|
e46abdc793 | ||
|
|
1fa68949e6 | ||
|
|
1e67e943df | ||
|
|
e4ec06a9c8 | ||
|
|
bbb3a0389a |
||
|
|
b9e072905a |
||
|
|
5bc94ce400 |
||
|
|
959ce42f26 |
||
|
|
ee9e3973bd |
||
|
|
46dd5ef959 | ||
|
|
0be2efc275 | ||
|
|
8abcd81f30 |
||
|
|
7bd3a1a15c |
||
|
|
3f2db134c2 | ||
|
|
479e22b7c5 | ||
|
|
302c74e90d | ||
|
|
fe6635c1eb |
||
|
|
635ddf5c36 | ||
|
|
d8671de43b |
||
|
|
da99ea47b0 |
||
|
|
b72782c35d |
||
|
|
53a2620860 |
||
|
|
3b101705d5 |
||
|
|
d0d1691004 | ||
|
|
1bb14e16a5 | ||
|
|
d30652a6e6 | ||
|
|
1a0096c169 | ||
|
|
a5eed9a486 | ||
|
|
d1be724f41 | ||
|
|
e4d6e54c63 |
||
|
|
38a4299883 |
||
|
|
15b9118077 |
||
|
|
d95b77ad04 |
||
|
|
742b802cf7 |
||
|
|
bd59b8c724 |
||
|
|
abd27b285e |
||
|
|
fd9c37aa44 |
||
|
|
c8e3ba2d4b |
||
|
|
e07e924519 |
||
|
|
91e9d6abe9 |
||
|
|
866fb36b67 |
||
|
|
b733b1d3c4 |
||
|
|
dc662b561a |
||
|
|
91c9c3f147 |
||
|
|
35cc7fd569 |
||
|
|
5fb1a14c36 |
||
|
|
5e529aed01 |
||
|
|
03c0d4ce6f |
||
|
|
163beb5d58 |
||
|
|
f316b19c2b | ||
|
|
10791fabbd | ||
|
|
0a6a420503 | ||
|
|
a5fdc3a6de | ||
|
|
42c6c2b524 | ||
|
|
39cdd1d1e4 | ||
|
|
fd420bff32 | ||
|
|
d7dec9eda7 | ||
|
|
833d8ec7dc | ||
|
|
d9af6dec32 |
||
|
|
96fa0d25f0 |
||
|
|
f87dce15ea |
||
|
|
d130544b1b | ||
|
|
229dfa8f6f |
||
|
|
2a424f6be5 | ||
|
|
c468af839c | ||
|
|
7c56c4ce00 | ||
|
|
5b6fd04b09 | ||
|
|
69b11109ac | ||
|
|
e64cbd3e66 | ||
|
|
fc0eb760cd | ||
|
|
3aa3e09317 |
||
|
|
73da97053e | ||
|
|
835fcbecc8 |
||
|
|
6423abe630 |
||
|
|
e1a296c68e | ||
|
|
01a51f74e4 |
||
|
|
183abde394 | ||
|
|
9988b7eca8 |
||
|
|
e4f0b64630 | ||
|
|
3b045ada7b |
||
|
|
2dcd35f181 | ||
|
|
9ee2ca51d4 |
||
|
|
151bc6d36b | ||
|
|
cdbe38a30e |
||
|
|
c96b7c693c | ||
|
|
dee22c18ee |
||
|
|
30f0ec4e9c | ||
|
|
0a0592a52e | ||
|
|
da9a9603b9 | ||
|
|
28d22f7bfa | ||
|
|
b2c43c034f |
||
|
|
ad749721e9 | ||
|
|
a807c269cc | ||
|
|
698f9cac39 | ||
|
|
db9e520f08 | ||
|
|
3bdb3ddba3 | ||
|
|
368678ca6b | ||
|
|
5da789c24f | ||
|
|
6c34e74f0a | ||
|
|
207b162544 | ||
|
|
e216b3e513 | ||
|
|
db2cab7b7c | ||
|
|
e86cf68b17 | ||
|
|
5ad3d73001 | ||
|
|
47e5b109c0 | ||
|
|
60ae0c1598 | ||
|
|
acad85e603 | ||
|
|
a4c4ab6c8f | ||
|
|
10ae1f6029 | ||
|
|
ed8cdfa0f6 | ||
|
|
60c1a866f3 | ||
|
|
050e4ef1a8 | ||
|
|
fa498f1c5e | ||
|
|
f769fb3953 | ||
|
|
8dd1b61f1e | ||
|
|
7bbc27594b | ||
|
|
5cf89f362f | ||
|
|
135defc405 | ||
|
|
d74ed5ab54 | ||
|
|
ea98bd2e19 | ||
|
|
af635f02c6 | ||
|
|
5b2c8eba80 | ||
|
|
c774e198ee | ||
|
|
11866ee52f |
||
|
|
b74b9efa8e |
||
|
|
5436ebee71 | ||
|
|
746b38abe5 | ||
|
|
db6295594f | ||
|
|
c0f92d69a0 | ||
|
|
b59f003f61 | ||
|
|
253f67243a | ||
|
|
67adc452cb | ||
|
|
8bbe3816b7 |
||
|
|
e8ad42aa3f | ||
|
|
026ee7fb78 | ||
|
|
5dbd49606b | ||
|
|
55a0c7e605 | ||
|
|
51223f66cd | ||
|
|
ea7660d4b1 | ||
|
|
87ceed05fa | ||
|
|
0dfc2b2a53 | ||
|
|
cdb4045542 | ||
|
|
14fb7ed4f7 | ||
|
|
7b2c04dcb2 | ||
|
|
2c521e63cb | ||
|
|
52f1b595e8 | ||
|
|
95b4bfc253 | ||
|
|
8da998191a | ||
|
|
be716fc0ee | ||
|
|
1dff481199 | ||
|
|
3dbf0589ce | ||
|
|
1e3511c0d3 | ||
|
|
983c25f69f | ||
|
|
c904433ff3 | ||
|
|
bf4222c9cc | ||
|
|
978a982ab7 | ||
|
|
cc760a173a | ||
|
|
9eab58f0d2 | ||
|
|
c1230d4b86 | ||
|
|
f8647ff73c | ||
|
|
27e512d5f1 | ||
|
|
ab9c460088 | ||
|
|
6d44068ede | ||
|
|
a5e2e42a55 |
||
|
|
47a0977ac6 | ||
|
|
9f39577228 | ||
|
|
7757eae745 | ||
|
|
c7d54e2fa9 | ||
|
|
01fa3071f1 | ||
|
|
91f1704f68 | ||
|
|
87f15ced04 | ||
|
|
cc524d78e4 | ||
|
|
f694ad223e | ||
|
|
274511c5cb | ||
|
|
32839bd0d1 | ||
|
|
82ed0e6842 | ||
|
|
d5a8f1e323 | ||
|
|
29c0d15045 |
||
|
|
e7c134de4e |
||
|
|
5059adc561 |
||
|
|
0dc7b3c549 |
||
|
|
1bafc6f22f |
||
|
|
244f32268b |
||
|
|
e75c10d567 |
||
|
|
a49bfcc956 |
||
|
|
69917c2f50 |
||
|
|
8f815e9974 | ||
|
|
fe38cd91c5 | ||
|
|
d314410d01 | ||
|
|
2a6597eece | ||
|
|
23412656de | ||
|
|
ae2936927d | ||
|
|
6edb2b0189 | ||
|
|
63f47bc9ed | ||
|
|
726084fa98 | ||
|
|
2c85b109ac |
||
|
|
2d6db0f27f |
||
|
|
37673eb24d |
||
|
|
d4096868e3 |
||
|
|
d427e9d750 |
||
|
|
2db902ef82 |
||
|
|
36a1b71f93 |
||
|
|
0ecfcee3bf |
||
|
|
b21bb16c08 |
||
|
|
4caf6d6e50 |
||
|
|
ee24099be8 |
||
|
|
6bbac4ad2a | ||
|
|
b4c4cd8ae8 |
||
|
|
c1251e9441 |
||
|
|
3eb3af8c8c |
||
|
|
9ce782be68 | ||
|
|
9bf63b1581 |
||
|
|
c51688499c | ||
|
|
e3ed07997e | ||
|
|
c911e792dc | ||
|
|
95891b8ee1 | ||
|
|
20720ebdad | ||
|
|
cda9184d83 | ||
|
|
5ffdc204f6 | ||
|
|
0f566c5bc8 |
||
|
|
5bd131c929 |
||
|
|
0c771e37f9 |
||
|
|
e31296fe5d |
||
|
|
282b420faf |
||
|
|
b3e81f5cbb |
||
|
|
939e2daff0 |
||
|
|
db61f9f263 |
||
|
|
b4dff607e7 |
||
|
|
46bb4e8414 |
||
|
|
631c8a1cc8 |
||
|
|
31487b5a0c |
||
|
|
3f825823d5 |
||
|
|
16ce1d3448 |
||
|
|
547e30f025 |
||
|
|
b7ab650f36 |
||
|
|
5ccc810999 |
||
|
|
8ba623f5fe |
||
|
|
be8159d410 |
||
|
|
f01b4b9a21 |
||
|
|
e668c81806 |
||
|
|
7387e62a95 |
||
|
|
0e02b07ba3 |
||
|
|
f6ebd6b3de |
||
|
|
51e3a6168c |
||
|
|
33ac88dc2a |
||
|
|
4c59709653 |
||
|
|
9aca915f5c |
||
|
|
9a54f5832d |
||
|
|
7e989b973a |
||
|
|
3f78a3a8ce |
||
|
|
c186917c34 |
||
|
|
8b64705dd6 |
||
|
|
10002d892d |
||
|
|
aa97009c35 |
||
|
|
760b58726a |
||
|
|
9569d487a2 |
||
|
|
20e050b602 |
||
|
|
c6f9ebe22d |
||
|
|
e0c5de6e10 |
||
|
|
a5c32a1504 |
||
|
|
1f9f8dae66 |
||
|
|
88f262b9c2 |
||
|
|
77b8b89130 |
||
|
|
0e239c9771 |
||
|
|
b6b8c18ef5 |
||
|
|
98c4089d15 |
||
|
|
91a99299b1 |
||
|
|
d3d11593bc |
||
|
|
78bde14388 |
||
|
|
60d13880d8 |
||
|
|
59a8ecc5b2 |
||
|
|
773dca77d4 |
||
|
|
7cee957161 |
||
|
|
99b0adfe96 |
||
|
|
97cc4a4b2c |
||
|
|
e794f5d6d8 |
||
|
|
8b53aa39ff |
||
|
|
86f5049d29 |
||
|
|
11cdbd8b83 |
||
|
|
0d4cb4698f |
||
|
|
acd9241819 |
||
|
|
1276ef178b |
||
|
|
27480bc6cb |
||
|
|
6bc6de6d37 |
||
|
|
a90764891f |
||
|
|
65f95b0380 |
||
|
|
8e98d6dd19 |
||
|
|
2ff4e6a080 |
||
|
|
dc598ecf24 |
||
|
|
f61316c18d |
||
|
|
454d170dfb |
||
|
|
01899adef9 |
||
|
|
95a5b926fd |
||
|
|
bcc3ac296d |
||
|
|
37f9f19d6f |
||
|
|
19f60798b3 |
||
|
|
4dd920df0d |
||
|
|
7aa6abfefe |
||
|
|
e75f9c9c7f |
||
|
|
7aa7534852 |
||
|
|
629374698d |
||
|
|
957f759197 |
||
|
|
6e84337898 |
||
|
|
a0b2ab7c0a |
||
|
|
beacf06c7d |
||
|
|
a0ff53b629 |
||
|
|
d03f4ce54a |
||
|
|
8599d7befa |
||
|
|
6be3295205 |
||
|
|
dcb7a7fdfc |
||
|
|
3600f5030a |
||
|
|
8d62a60d60 |
||
|
|
fef7b0827b |
||
|
|
db06fcd087 |
||
|
|
3d4f61419a |
||
|
|
b6c8d9a90a |
||
|
|
2e4fce7c67 |
||
|
|
296b9debd3 |
||
|
|
2a6e3da30a |
||
|
|
5445aebe94 |
||
|
|
e0d788bea9 |
||
|
|
65e7437eed |
||
|
|
797481410c |
||
|
|
424e94542c |
||
|
|
1707cafbbc |
||
|
|
7cbde83f38 |
||
|
|
459b5e1036 |
||
|
|
db00ae8eda |
||
|
|
830f70258e |
||
|
|
7b4befb0b1 | ||
|
|
0466bc6936 | ||
|
|
f2040797d7 |
||
|
|
b37cdf5ba9 |
||
|
|
8444ccf6f2 |
||
|
|
1c34c252cc |
||
|
|
0ebb21f0fb |
||
|
|
9173537ce5 |
||
|
|
43659cc5b3 |
||
|
|
d27e75c57f |
||
|
|
abcc37f9a1 |
||
|
|
76e7654242 |
||
|
|
c54fbdb075 |
||
|
|
eccfd345b5 |
||
|
|
d6866f6317 |
||
|
|
a98bf32b24 |
||
|
|
5f1b1efc66 | ||
|
|
4f9010b024 |
||
|
|
d59ad46a9e |
||
|
|
2417251f02 |
||
|
|
99d538ea97 |
||
|
|
3b7c870a53 |
||
|
|
331097f269 |
||
|
|
0b1ef79a8e |
||
|
|
0f0f9a0262 |
||
|
|
3e00b390c1 |
||
|
|
b4a61e11fa |
||
|
|
35a680632e |
||
|
|
d18b7bc4b8 |
||
|
|
1806aa0d7c |
||
|
|
8b105fc9c3 |
||
|
|
f078ee9f9a |
||
|
|
e4cfae2885 |
||
|
|
bd0c366b2f | ||
|
|
f9d80323dd |
||
|
|
308304b75e |
||
|
|
1cb7a33442 |
||
|
|
4325b06ac4 |
||
|
|
4591fb9b95 | ||
|
|
6870e916bb |
||
|
|
b27aed2497 |
||
|
|
94e8f8b8d7 |
||
|
|
fc6f6bde1d |
||
|
|
f16d1be955 |
||
|
|
77b8132591 |
||
|
|
df091f02ef | ||
|
|
efe0c8d534 |
||
|
|
d5a6d7719c |
||
|
|
5367d056e2 |
||
|
|
860d02d1fe |
||
|
|
9bb5c4f64a |
||
|
|
cfdd612c8d |
||
|
|
40076c6246 |
||
|
|
5670a4d7e7 |
||
|
|
4386f5fcb2 |
||
|
|
2c55110776 |
||
|
|
56494d8d1a |
||
|
|
b30cea0de0 |
||
|
|
6787ce9c40 |
||
|
|
ef8c886b10 |
||
|
|
cc70b98eed | ||
|
|
1c574e79e8 | ||
|
|
5481f3a684 |
||
|
|
7fafee8a6c | ||
|
|
5cde12b42a |
||
|
|
5004aac259 |
||
|
|
2460b570fe |
||
|
|
e316cd0719 |
||
|
|
60c9d1a070 |
||
|
|
46d7f399ff |
||
|
|
88c9017fdc |
||
|
|
46dbbb3b84 |
||
|
|
b756bce67f |
||
|
|
1ed6966cbe |
||
|
|
fbcce0b20c |
||
|
|
96b97b25bf |
||
|
|
cfab21bc81 |
||
|
|
d405bd48f0 |
||
|
|
1cba1416a1 | ||
|
|
cd3b561623 | ||
|
|
170039c1d1 |
||
|
|
38f68f77a0 |
||
|
|
84aa7a879c |
||
|
|
87f51ddbda |
||
|
|
011c9e66fb |
||
|
|
5a61e1007f |
||
|
|
c88f02c5a5 |
||
|
|
212f5c7270 |
||
|
|
7941f00c35 |
||
|
|
ed450c1268 |
||
|
|
76da9e55c9 |
||
|
|
086c7ae32d |
||
|
|
d61bb9c79b |
||
|
|
6c7cd651da | ||
|
|
f94ecaba84 |
||
|
|
f0cec1cf37 |
||
|
|
d7e103de59 |
||
|
|
65b983dcb6 |
||
|
|
d5e289880f |
||
|
|
e51a481219 |
||
|
|
62b795d472 |
||
|
|
8a7057b3b0 |
||
|
|
33a0c9e634 |
||
|
|
5fcebd0274 |
||
|
|
749c433ca6 |
||
|
|
cfe2424f4d |
||
|
|
ed88987308 |
||
|
|
86e43c92b3 |
||
|
|
ae3b92f1ef |
||
|
|
932f1e9161 |
||
|
|
b0ac644e9b |
||
|
|
25cccc32db |
||
|
|
2b5adacbb9 |
||
|
|
ab06920e74 | ||
|
|
c937c3bd8b |
||
|
|
9d488c97e0 |
||
|
|
9d24c039fe | ||
|
|
f738f1e246 | ||
|
|
95c751d4ac | ||
|
|
bf9e17a6c8 |
||
|
|
2baca5d57d | ||
|
|
b0fb67451d | ||
|
|
f454abf45a |
||
|
|
0dd73e249d |
||
|
|
54140e9adb |
||
|
|
45195d5bd6 |
||
|
|
2a056a7855 |
||
|
|
940d0f1906 |
||
|
|
1d2e1b15ea |
||
|
|
e424a85a99 |
||
|
|
939d22d670 |
||
|
|
90b7ea944d |
||
|
|
04a33e2206 |
||
|
|
95956f6362 |
||
|
|
e5d82915dd |
||
|
|
e3f673d9db |
||
|
|
4fd21432c5 |
||
|
|
9c4b412aea |
||
|
|
71b2edc0fe |
||
|
|
7661cd189f |
||
|
|
0833a6d6d3 |
||
|
|
7d851d8434 |
||
|
|
2c29e1ca76 |
||
|
|
5a57ee99ac | ||
|
|
735b6b6c87 | ||
|
|
7ea0601fc6 | ||
|
|
99537f2816 | ||
|
|
b384bb885b |
||
|
|
2255af1c45 |
||
|
|
f55b781d86 |
||
|
|
38d9a9551f |
||
|
|
c38cee0a4a |
||
|
|
0f9c7b1bbf |
||
|
|
32ddbd8e05 |
||
|
|
67c493f1a8 |
||
|
|
69c513e33d |
||
|
|
82b910dd6d |
||
|
|
5d0a58cc6a |
||
|
|
368ca13314 |
||
|
|
2cee1edcb5 |
||
|
|
1b288a0a1a | ||
|
|
81aba310d0 |
||
|
|
b050a07362 |
||
|
|
021efab84d |
||
|
|
0a42a050bd |
||
|
|
9ca1b30da1 |
||
|
|
220d5535f7 |
||
|
|
0895e6a508 |
||
|
|
ed5532a535 |
||
|
|
6f41dbf954 |
||
|
|
c7ed7e72d4 |
||
|
|
a7208f5262 |
||
|
|
09f6680aa9 | ||
|
|
9261130fed | ||
|
|
fec22e0052 | ||
|
|
7c921d6a81 |
||
|
|
16a029754f | ||
|
|
3c9fd67fd0 | ||
|
|
724ca386e7 | ||
|
|
6f75b00463 | ||
|
|
105d9f0d3a | ||
|
|
38f6b1297d | ||
|
|
cf130a6e25 |
||
|
|
e91c30fad0 | ||
|
|
3e3f7b9273 | ||
|
|
88ff84f5a5 |
||
|
|
eee373f15a |
||
|
|
c839c053cb |
||
|
|
238b9ede78 | ||
|
|
c7bd39abc7 | ||
|
|
85b1f909a7 | ||
|
|
675f502802 |
||
|
|
db5553ec75 |
||
|
|
413191411f |
||
|
|
45b2681dfc |
||
|
|
f0986a6441 | ||
|
|
e6645136f9 | ||
|
|
189820135a | ||
|
|
f19cc528d4 | ||
|
|
2b9891da2c |
||
|
|
a5c843f5c6 | ||
|
|
aa8e74539c | ||
|
|
d1968489b7 | ||
|
|
33946a7aac | ||
|
|
ddf74d3793 | ||
|
|
1b3b8178ec | ||
|
|
bf3bdadd90 | ||
|
|
aba82cc527 | ||
|
|
e92994d2e7 |
||
|
|
26d9b3a832 | ||
|
|
bfabaa50bc | ||
|
|
7fcd172387 | ||
|
|
c5bb4c7405 | ||
|
|
98aff7778e | ||
|
|
4ab6352504 | ||
|
|
b325381ca0 | ||
|
|
bc0a9b2e52 | ||
|
|
75c0236a04 |
||
|
|
ec2ce3fcfb |
||
|
|
e9a9420e5c | ||
|
|
209e097ba6 | ||
|
|
8d234cc842 | ||
|
|
e6805707d8 | ||
|
|
acd6f7af5b | ||
|
|
f38532bcf5 |
||
|
|
4b2189ba51 | ||
|
|
fb46cce963 | ||
|
|
eedd5eb7d2 | ||
|
|
716f4af808 | ||
|
|
c21784037d | ||
|
|
0fde6c9922 | ||
|
|
6d90c1678c | ||
|
|
a7fb568aff | ||
|
|
065ca5f6d3 | ||
|
|
ab9eec12eb | ||
|
|
430736a4f2 | ||
|
|
161444107a | ||
|
|
12e2e2101a | ||
|
|
e39097a17e | ||
|
|
be7c723c47 | ||
|
|
a60b198b03 | ||
|
|
e06df85f02 | ||
|
|
288a4757f8 | ||
|
|
29363fc07f | ||
|
|
02a1b540ce | ||
|
|
a048233f4c | ||
|
|
758c4c2c8d | ||
|
|
adae39efee | ||
|
|
84e1bb4d9b | ||
|
|
6b0daf3da9 | ||
|
|
b6c5d90c9d | ||
|
|
a34ccbff33 | ||
|
|
4cd4b46772 | ||
|
|
3d93c83920 | ||
|
|
809863d61a | ||
|
|
4c7b643295 | ||
|
|
05b16f1d63 | ||
|
|
bfa53dfd6c | ||
|
|
4467a1ffa2 | ||
|
|
bfe9a9d015 | ||
|
|
7e687750b2 |
||
|
|
0c3025d695 |
||
|
|
a9c22f0588 |
||
|
|
b8537d1c96 |
||
|
|
12d12a33de | ||
|
|
1956f95f9f | ||
|
|
723dd976b4 | ||
|
|
65251cdafa | ||
|
|
471d626043 |
||
|
|
0b82968c0f |
||
|
|
0584a3929d |
||
|
|
09815e6035 |
||
|
|
9a01650622 |
||
|
|
fb5afbd394 |
||
|
|
fc105cee2b |
||
|
|
1ec3b4ecab |
||
|
|
6e2bbe31ac |
||
|
|
5670c1e655 |
||
|
|
7f5d836916 |
||
|
|
cbaf859103 |
||
|
|
5115b294ee |
||
|
|
c01bc4dbd7 |
||
|
|
7674f8eb2b | ||
|
|
773bdf8ea2 |
||
|
|
b249f0d0ce |
||
|
|
6522657893 |
||
|
|
c82facd6ff |
||
|
|
bcb390f611 |
||
|
|
a805d6c2b1 |
||
|
|
3d08f92705 |
||
|
|
2436229145 |
||
|
|
e5c14d24ae |
||
|
|
23c1a7d1d8 |
||
|
|
44bbce125b |
||
|
|
dff47263d5 | ||
|
|
861ddea1b2 |
||
|
|
ab22ea1f27 |
||
|
|
a6757c352f |
||
|
|
2d97776caa |
||
|
|
3cd26a2220 |
||
|
|
f759162fd1 |
||
|
|
6c3bd124ce |
||
|
|
68b12d4fff |
||
|
|
1195464acb | ||
|
|
68e779d64e |
||
|
|
df0419a7d6 |
||
|
|
3dff6c6875 |
||
|
|
07421ead41 |
||
|
|
b6dc199993 |
||
|
|
6d8a004f4a |
||
|
|
1dae9f613f |
||
|
|
34f7f24e7e |
||
|
|
40bd6125f5 |
||
|
|
012eeab3aa | ||
|
|
2f3eb70a4d | ||
|
|
b37d0f1cf4 | ||
|
|
6262a4fac7 |
||
|
|
c531c714d4 |
||
|
|
d423c1c366 |
||
|
|
5b51e0fad3 |
||
|
|
4151deb9f6 |
||
|
|
d8f9ea7a33 |
||
|
|
46127c8d4d |
||
|
|
8a12a32d31 |
||
|
|
9f567fe2bc |
||
|
|
7f8c1c8a68 |
||
|
|
4a910a7197 |
||
|
|
4c3cbc3535 |
||
|
|
0974a3ad18 |
||
|
|
b08126d745 |
||
|
|
d1255d3a9d |
||
|
|
cf7537df01 |
||
|
|
3e419de86b |
||
|
|
2bb25b12ff |
||
|
|
cdf4bdd2ba |
||
|
|
e0b8da86ed |
||
|
|
472288b2e3 |
||
|
|
51afac4f22 |
||
|
|
daed4141f5 |
||
|
|
157c5e91fc |
||
|
|
e51e184cca |
||
|
|
2b3c96ab3d |
||
|
|
371e57588f |
||
|
|
182f43004a |
||
|
|
23c2660fb0 |
||
|
|
ea409a2cb2 |
||
|
|
984db8620a |
||
|
|
995d9fdc9b |
||
|
|
4b04c10f14 |
||
|
|
43c4966873 |
||
|
|
85fc3a3af6 |
||
|
|
85d68cec55 |
||
|
|
89b5f0af20 |
||
|
|
659f3fa8e2 |
||
|
|
8242834fbd |
||
|
|
814e1ec059 |
||
|
|
12efb8b981 |
||
|
|
b9558cc3cb |
||
|
|
022baad9e5 |
||
|
|
9629b1414e | ||
|
|
ea44cf850c | ||
|
|
61c8c9eac0 | ||
|
|
c89f59dc7c |
||
|
|
1fed110afd |
||
|
|
4ea6a2d120 |
||
|
|
f84bb6a287 | ||
|
|
869a6f761a | ||
|
|
2d3029482d | ||
|
|
250e9f91ba | ||
|
|
df49f49c60 |
||
|
|
3e0ff5edbd | ||
|
|
1142e81348 | ||
|
|
ae38d1e020 |
||
|
|
eefeadc018 | ||
|
|
4593b52863 |
||
|
|
7333ca6c61 |
||
|
|
5b5a4ba4cc |
||
|
|
9af14015e4 | ||
|
|
ef80562a0f | ||
|
|
0b48c3456b |
||
|
|
1f16655769 |
||
|
|
b8d780ba4a |
||
|
|
965460edb7 | ||
|
|
53ea6511fc | ||
|
|
eae73dfa18 |
||
|
|
27c4c5e6f6 | ||
|
|
6f197f67f1 | ||
|
|
412c3a5ed1 |
||
|
|
385b1dbfd4 | ||
|
|
0a4c596ecb | ||
|
|
d2e0e0ed81 | ||
|
|
f787cf4bc2 | ||
|
|
ca21a3b79d | ||
|
|
a773da2651 | ||
|
|
1a90b45f18 | ||
|
|
9f6cd35155 | ||
|
|
f122db2e7b | ||
|
|
d65f1b1647 | ||
|
|
0fc535f2f1 | ||
|
|
e420900e55 | ||
|
|
0cd64d1fbc | ||
|
|
46a0030387 | ||
|
|
495da9b292 | ||
|
|
efb300c9f0 | ||
|
|
7f1706fc74 | ||
|
|
8dbbdc4bf2 | ||
|
|
7c15f9098c |
||
|
|
36a3e90b1d |
||
|
|
3882201434 |
||
|
|
857bf40072 |
||
|
|
075eb1fa3f |
||
|
|
dbb7c6e7d0 |
||
|
|
947d429688 |
||
|
|
f49d42678b |
||
|
|
f28c9515ad |
||
|
|
c6ecbd56e5 | ||
|
|
144567410d | ||
|
|
1b850662ed | ||
|
|
c7c4cacc29 | ||
|
|
7e63355353 | ||
|
|
01652c7940 | ||
|
|
b379e3b0eb | ||
|
|
a2fde7f2c3 | ||
|
|
2beb452207 | ||
|
|
73384a562b | ||
|
|
985c5bf8e2 | ||
|
|
daec8a9a64 |
||
|
|
f88a7a6f99 |
||
|
|
dc16d145c2 |
||
|
|
8432ddc2a8 |
||
|
|
d072393149 |
||
|
|
a8e95bf7f1 |
||
|
|
1735bdc9a2 |
||
|
|
f00685d592 |
||
|
|
ee194f3e46 |
||
|
|
82a9c5b1dd |
||
|
|
fdd8875986 |
||
|
|
3b50e0cbc5 |
||
|
|
fb7fda2256 |
||
|
|
d9beb6126e |
||
|
|
a81581129a | ||
|
|
e95a91861a | ||
|
|
fa5948f40e | ||
|
|
ad4c8aacfb | ||
|
|
afbc09f1e7 | ||
|
|
1a1e5b743a | ||
|
|
24853a7e3b |
||
|
|
1ce83913bd |
||
|
|
1650e26da7 |
||
|
|
bc01fd8ea3 | ||
|
|
3422c40e19 |
||
|
|
e661052c89 |
||
|
|
ff08a5ca2b |
||
|
|
f8250fb0d8 |
||
|
|
d1c3f8af7a | ||
|
|
36b4b3695b |
||
|
|
fb17ec8064 |
||
|
|
51f52656cc |
||
|
|
18746c7819 |
||
|
|
8463c01123 |
||
|
|
8e0671306a |
||
|
|
131a6da554 |
||
|
|
59273fcdab |
||
|
|
7795a2a46f |
||
|
|
2269f64b0a |
||
|
|
439da97573 |
||
|
|
2b478a4608 |
||
|
|
3b95725f09 |
||
|
|
3a23ad1382 |
||
|
|
61a7f1fba5 |
||
|
|
a8641672cd |
||
|
|
320fc20461 |
||
|
|
69f05c39ec |
||
|
|
e55ffedc35 |
||
|
|
0577fefd75 |
||
|
|
02713670c9 |
||
|
|
e6de878395 |
||
|
|
4c75b288bb |
||
|
|
263e1b527a | ||
|
|
3d88bf8795 |
||
|
|
740b2b0979 |
||
|
|
2b843fc12e |
||
|
|
473cf1cae3 |
||
|
|
65d4266400 |
||
|
|
8d5b86fff7 |
||
|
|
92843c8237 |
||
|
|
13b588b555 |
||
|
|
839a9ff498 |
||
|
|
ef8c16d773 |
||
|
|
602fafafea |
||
|
|
83ed7fd2df |
||
|
|
f07e4093be |
||
|
|
bf13afd895 |
||
|
|
9ffc06d42e |
||
|
|
ebe91ba11d | ||
|
|
48aef46f57 | ||
|
|
c77c823c3c | ||
|
|
ccccea1e50 | ||
|
|
a6163849c6 | ||
|
|
130aab3598 | ||
|
|
78b85ce0cc | ||
|
|
dbcf65b2d6 | ||
|
|
d8e27aa5f9 |
||
|
|
ce6d587771 |
||
|
|
81d7bc2d68 |
||
|
|
a49350f300 |
||
|
|
9ac6359e56 |
||
|
|
5958d9c646 |
||
|
|
9b88c8afda |
||
|
|
1b71fef89f |
||
|
|
8ddd29d285 |
||
|
|
dc8cbcf410 |
||
|
|
757a4383e6 | ||
|
|
7c98ee329a | ||
|
|
9d615463f4 |
||
|
|
aea0db5919 |
||
|
|
fc593d90cf |
||
|
|
2524f7b5a0 |
||
|
|
5a0cb1baef |
||
|
|
255690eee0 | ||
|
|
86b6e10620 |
||
|
|
b757292211 | ||
|
|
af54419a0b | ||
|
|
7b84b1c79c | ||
|
|
d047c22526 | ||
|
|
6feab70a72 | ||
|
|
5e1b5ca4e8 | ||
|
|
1726cdb0ad | ||
|
|
2b2828ea41 | ||
|
|
29859ceedf | ||
|
|
8e2527ad35 | ||
|
|
92b26488da | ||
|
|
efa67cb01c | ||
|
|
71fc222059 | ||
|
|
fa6adad4ab | ||
|
|
1c48d567e1 | ||
|
|
2c3216ba36 | ||
|
|
74e2a7e225 | ||
|
|
ff2c92451d | ||
|
|
2a83402d4a | ||
|
|
2449b473c0 | ||
|
|
60c44c44ff | ||
|
|
7e1d685167 | ||
|
|
a9d4a393ba | ||
|
|
a0953fea93 | ||
|
|
02d76835c9 | ||
|
|
dfe03f1347 | ||
|
|
c87489adf3 | ||
|
|
a428a730d5 | ||
|
|
7f7c642339 | ||
|
|
03b79e9a67 | ||
|
|
56b0fcebba | ||
|
|
d9a5130311 |
||
|
|
4663a45e59 |
||
|
|
fb820bcdad |
||
|
|
31c167b412 |
||
|
|
7cdab16ba9 |
||
|
|
05262134ca | ||
|
|
fe48b9d03d |
||
|
|
013ec1d726 |
||
|
|
27b4a984d5 | ||
|
|
d6b6111395 | ||
|
|
af8ee6703e | ||
|
|
793191a479 |
||
|
|
efc86c1056 |
||
|
|
39d44d2644 |
||
|
|
9584a2ce5a |
||
|
|
95b8ceb87a |
||
|
|
37b99b9cb8 |
||
|
|
86354e9fc0 | ||
|
|
b49f135e31 |
||
|
|
fff266f50d | ||
|
|
7cfea7c22c | ||
|
|
6141e5a8ce | ||
|
|
ed58949d24 |
||
|
|
c1d85bd3d9 |
||
|
|
8d3324465e |
||
|
|
8c72746edb |
||
|
|
ea3509d2e7 |
||
|
|
bb3a0cc54f |
||
|
|
d808654d99 | ||
|
|
a6cfdbb403 | ||
|
|
2f7c6834d0 | ||
|
|
ebdd57a7c4 | ||
|
|
4ff6d74054 |
||
|
|
0d8b4aafd5 |
||
|
|
0cca7e9189 |
||
|
|
a5812578c5 |
||
|
|
350b411afe |
||
|
|
9ca86c6093 |
||
|
|
01729ae22a |
||
|
|
9196dc2216 |
||
|
|
b925335bbb |
||
|
|
965f939967 |
||
|
|
00feccbb77 |
||
|
|
b6fc66ba0d |
||
|
|
c40debc0e9 |
||
|
|
3b31d70865 |
||
|
|
afa8b62de7 |
||
|
|
70fd15de2d |
||
|
|
c54d330f89 |
||
|
|
4028560d12 |
||
|
|
3c28c28623 |
||
|
|
a958fa06e7 |
||
|
|
4d39e9e15a |
||
|
|
679ec49e64 |
||
|
|
d98e1d3693 | ||
|
|
be3b7d754e |
||
|
|
ae524c4f84 |
||
|
|
d390cac8db |
||
|
|
17e20ab029 |
||
|
|
34b9b9b508 |
||
|
|
47fd06a445 |
||
|
|
b140ce546f | ||
|
|
08ec2beb7c |
||
|
|
5833f0f109 |
||
|
|
eb2ad258ed |
||
|
|
708aef53e4 |
||
|
|
e893c1c205 |
||
|
|
3e74255127 |
||
|
|
b8d7eed607 |
||
|
|
8eb62fb483 |
||
|
|
ee67bff9e3 |
||
|
|
21e47dcccf |
||
|
|
38ddcf59f8 |
||
|
|
4a62b6a5c7 | ||
|
|
6afbcb69f3 |
||
|
|
4bb522d303 |
||
|
|
f107173a73 |
||
|
|
eb5aff755f |
||
|
|
2384ae0819 |
||
|
|
4a5663c1cb |
||
|
|
9416e01042 | ||
|
|
54fcacfed1 | ||
|
|
69ac5caa4b |
||
|
|
cecbc156d5 |
||
|
|
8ca550cc9e |
||
|
|
d44c8eba1c |
||
|
|
6edd667bdf |
||
|
|
499ff50903 |
||
|
|
5e1f29eda3 |
||
|
|
e5571defb7 |
||
|
|
125d8a6f78 |
||
|
|
21790dc3ee |
||
|
|
cdf48e0589 |
||
|
|
2f9f63771b | ||
|
|
93335b3843 |
||
|
|
f50c8f447e | ||
|
|
bd9f7deb98 | ||
|
|
2171192934 | ||
|
|
3352ebef6e |
||
|
|
2a51ddadfc |
||
|
|
0745aea4d6 |
||
|
|
4804b34208 |
||
|
|
841289f1d1 |
||
|
|
c367ef461e |
||
|
|
ffed41553a | ||
|
|
79deb37675 |
||
|
|
77ca8fe9e6 |
||
|
|
25e58edf28 | ||
|
|
0f2d19c56e | ||
|
|
8bde3d7522 | ||
|
|
c169d26d95 | ||
|
|
946a4c56a0 | ||
|
|
23e87e0ad7 |
||
|
|
7d678154c6 |
||
|
|
0b9fec3f87 |
||
|
|
763c7708f4 |
||
|
|
5f2c1f4534 |
||
|
|
3ac557ccb1 |
||
|
|
e6c691a376 |
||
|
|
ee8eb001c2 |
||
|
|
db836b7a48 |
||
|
|
543b18dd54 |
||
|
|
ec0731d5d8 |
||
|
|
cc5c7d1d29 |
||
|
|
e79c1b7ea3 | ||
|
|
6cbead5bfe |
||
|
|
429bb2bf17 |
||
|
|
c03c41cb21 |
||
|
|
ee29faecbf |
||
|
|
d1d0105276 |
||
|
|
1059e36b52 |
||
|
|
15f602f867 |
||
|
|
13be4a333f |
||
|
|
2553fa1f74 |
||
|
|
f0f5011484 |
||
|
|
5671f3527b |
||
|
|
adb26fa99f |
||
|
|
805429a7c6 |
||
|
|
39af86e59d |
||
|
|
ecf970d6fe | ||
|
|
c9ce17a4d5 |
||
|
|
a6e279f0d3 | ||
|
|
842bc3733e | ||
|
|
5e76a5e76a | ||
|
|
52c3c49f25 |
||
|
|
705239ad7d |
||
|
|
dc865404a9 |
||
|
|
ba7ab2e607 |
||
|
|
d6cfe4414d |
||
|
|
ecbb135949 |
||
|
|
fcb98e6523 |
||
|
|
e7e5597c95 | ||
|
|
7f0479d8b4 | ||
|
|
f5c78f365d |
||
|
|
1fc5f9b12d |
||
|
|
3f55ce6dfc |
||
|
|
1d562d3c27 |
||
|
|
f3974deb88 |
||
|
|
1945616328 |
||
|
|
7db6604227 |
||
|
|
12ce6c5ac3 |
||
|
|
5d9bc4ca81 | ||
|
|
c0b4a3ff35 |
||
|
|
f0bf8cd827 |
||
|
|
10144adf61 |
||
|
|
3efab5ba23 |
||
|
|
3d323ab9d2 | ||
|
|
16ce9e562f | ||
|
|
90e66a7ad4 |
||
|
|
6b59216b32 |
||
|
|
9764ba6334 |
||
|
|
da5929ff34 |
||
|
|
e419822c77 |
||
|
|
b62ce4440e |
||
|
|
3c81fb06e8 |
||
|
|
c27366a270 |
||
|
|
5b6f6c1bff |
||
|
|
3fcac435b2 |
||
|
|
03a3edcdc9 |
||
|
|
5737b3cc7b | ||
|
|
b898b79aaf |
||
|
|
3827ca2d78 |
||
|
|
4de5e1b9f1 |
||
|
|
eb18f02fd2 | ||
|
|
1a7d105917 | ||
|
|
de5cff799e | ||
|
|
67cada78f6 | ||
|
|
5a40f25d03 | ||
|
|
1a09a8a4c8 | ||
|
|
daa0cf83d9 | ||
|
|
e92858f64d | ||
|
|
d52c26e82f | ||
|
|
83900b03d4 | ||
|
|
c123430f22 | ||
|
|
33e20cbc77 | ||
|
|
e942312c4c | ||
|
|
de2e78b507 | ||
|
|
da4a7ac64b | ||
|
|
e44fbc26ba | ||
|
|
bef454f950 | ||
|
|
94e1ec91ad | ||
|
|
56d11ab419 |
||
|
|
c96cccab2e |
||
|
|
989ef1b4a8 |
||
|
|
45cfbe917e |
||
|
|
2e313005e0 |
||
|
|
722c3a653c |
||
|
|
76672facfe |
||
|
|
8f075b5d8d | ||
|
|
b317efaf2c | ||
|
|
29b9c5200f |
||
|
|
4d2b4b4ee7 |
||
|
|
9f8f095a78 |
||
|
|
59c09ebee1 |
||
|
|
5f81a87912 |
||
|
|
7f6151d573 |
||
|
|
9816960995 |
||
|
|
3355d5f0af |
||
|
|
ab38b20444 |
||
|
|
f278229179 | ||
|
|
552390fb84 | ||
|
|
68573cdc48 |
||
|
|
cdf397aaa9 | ||
|
|
ed27558011 |
||
|
|
50387948df | ||
|
|
9b48cc1799 | ||
|
|
86f2ac0e96 | ||
|
|
1537a002cc |
||
|
|
ae9b158b04 |
||
|
|
72ec10b181 | ||
|
|
eed4002a4a | ||
|
|
155e34c7a8 | ||
|
|
22cc649e81 |
||
|
|
367ca745c3 |
||
|
|
01e2e46e0d |
||
|
|
c03078ca16 |
||
|
|
49e62aebe3 |
||
|
|
dc4daaebac |
||
|
|
f855b30c9f | ||
|
|
b614e2b100 | ||
|
|
eafbbab233 | ||
|
|
72a4e9cf6e |
||
|
|
1dbe100a43 |
||
|
|
287d3d066c |
||
|
|
9387d18e88 |
||
|
|
1600bcb1d0 |
||
|
|
2b2defb7c0 |
||
|
|
6d786902eb |
||
|
|
286ce206f0 |
||
|
|
7535f098bd |
||
|
|
b517461fbe |
||
|
|
ffbe67e21f |
||
|
|
833671d30c |
||
|
|
ae691b8e52 |
||
|
|
2b56b7b6b9 |
||
|
|
81a5380f67 |
||
|
|
7c45e3ac13 |
||
|
|
d1932c36ce |
||
|
|
adb7ddf8d2 |
||
|
|
3b0a57ca6d |
||
|
|
4ee75e93c9 |
||
|
|
ff218e5323 |
||
|
|
df0969d1c6 |
||
|
|
23d7ac0e58 |
||
|
|
f9a87944cf |
||
|
|
eff456aa1a |
||
|
|
1ce07cd67c |
||
|
|
fc7952ff3b |
||
|
|
bb28bdf565 |
||
|
|
04d5842124 |
||
|
|
1a12890556 |
||
|
|
d021d885ca |
||
|
|
3433b8ce8f |
||
|
|
6092730acc |
||
|
|
ba4ffe4ecc |
||
|
|
55b3e2d35a |
||
|
|
6b926ec463 |
||
|
|
9b686b5417 |
||
|
|
82ec56bc7d |
||
|
|
798e51d4d3 |
||
|
|
35c41552de |
||
|
|
19be7f61ac | ||
|
|
bbf0e8cdad | ||
|
|
7e2d2a29a1 | ||
|
|
671dc2aa3a | ||
|
|
294a2c701e | ||
|
|
01f03c552d | ||
|
|
dc46154d94 | ||
|
|
87737c23eb | ||
|
|
6e6f099a99 | ||
|
|
4cb3321c39 | ||
|
|
6a2343a1a0 | ||
|
|
f2d6dba2cf | ||
|
|
dd1ef7fae9 | ||
|
|
527cff9ec3 | ||
|
|
ba150eccae | ||
|
|
fa74986f1e | ||
|
|
d1085b5bea | ||
|
|
4d0a14d2eb | ||
|
|
8c3439b733 | ||
|
|
a0534d527a | ||
|
|
a5b52f2795 | ||
|
|
b526ebd679 | ||
|
|
51b9315ae9 | ||
|
|
8edf44dc31 | ||
|
|
9b7626e59e | ||
|
|
6dd092c7a9 | ||
|
|
46a0d467c0 | ||
|
|
e3b164ae93 | ||
|
|
d8f58ab20f | ||
|
|
0de2bccd28 | ||
|
|
2eaf724710 | ||
|
|
58138ac09b | ||
|
|
143f090422 | ||
|
|
f8f466ba7e | ||
|
|
cb28de47f8 | ||
|
|
4ad2475ed6 | ||
|
|
0172078536 | ||
|
|
0bb1fb512a | ||
|
|
b6940d95a2 | ||
|
|
75f0457375 | ||
|
|
ffe31b6265 | ||
|
|
8963610722 | ||
|
|
66bfcf0e36 | ||
|
|
0b3559abfe | ||
|
|
773389ee5e | ||
|
|
4c04991d4d | ||
|
|
d56bb59b72 | ||
|
|
6e92a4f71e | ||
|
|
1f6217c0d8 | ||
|
|
17204bebd0 | ||
|
|
728e2019d8 | ||
|
|
7f3fdd6977 | ||
|
|
e8798f8371 | ||
|
|
402b743553 | ||
|
|
f08ae2fc62 | ||
|
|
178ea9c8c5 | ||
|
|
7c63cee9e8 | ||
|
|
4a60dfc373 | ||
|
|
829a829cb4 | ||
|
|
34896ccb4e | ||
|
|
5df5eb6a04 | ||
|
|
31ba36baf3 | ||
|
|
bf10f71760 | ||
|
|
8aa61fff6d | ||
|
|
f645b530da |
||
|
|
27573d191e | ||
|
|
d6b4fdf979 |
||
|
|
39c834b83f |
||
|
|
f210357bfe |
||
|
|
3094c19cf3 | ||
|
|
225437f1e8 | ||
|
|
a23bb1e350 |
||
|
|
2fbb21a84e | ||
|
|
5c08fcb43e | ||
|
|
cc59655cb1 | ||
|
|
8ff0a2b0ff | ||
|
|
fe549af784 | ||
|
|
a4549c94c1 | ||
|
|
706256d3f0 | ||
|
|
3049773e7f | ||
|
|
9da5df354e | ||
|
|
54ba6d47f4 | ||
|
|
17647e2c2f | ||
|
|
9da5cea88d | ||
|
|
3784746ddb | ||
|
|
281f6335c1 | ||
|
|
5129c0f4e2 | ||
|
|
5078e89a71 | ||
|
|
41aef27631 | ||
|
|
754d0934bf | ||
|
|
be2d616190 | ||
|
|
ba34e47c4b | ||
|
|
a485b188b3 | ||
|
|
718e89ad1e | ||
|
|
9453a60254 | ||
|
|
f87ec9d401 | ||
|
|
cb1859a710 | ||
|
|
1ed95164db | ||
|
|
ac5d0e54f0 | ||
|
|
b1e79411e7 | ||
|
|
a9d834d715 | ||
|
|
68cfd130d3 | ||
|
|
93a4b823c8 | ||
|
|
769662d77a | ||
|
|
7fd627f169 |
||
|
|
b91468b6f2 | ||
|
|
0b9cd4be5d |
||
|
|
4c587ee1b8 |
||
|
|
19e1e8b8a6 |
||
|
|
67e9522c67 |
||
|
|
a829b38a34 |
||
|
|
c8dae94b5b |
||
|
|
87267758ac | ||
|
|
5f72df81fb | ||
|
|
1ed270fe05 |
||
|
|
19a654a2b1 |
||
|
|
f9bbc11711 |
||
|
|
42b1807c36 |
||
|
|
647982de1a |
||
|
|
f5557c612a |
||
|
|
f4749db8b3 | ||
|
|
86a1de6788 | ||
|
|
792c5e2d95 | ||
|
|
6758580be9 |
||
|
|
6f246eed4a | ||
|
|
fc3725d3f4 | ||
|
|
00c6f0dfdb |
||
|
|
cf7b4e2458 |
||
|
|
f682e44367 |
||
|
|
9d1f86c410 |
||
|
|
dac281ac32 |
||
|
|
29a58086a3 |
||
|
|
cb8eb755a7 |
||
|
|
1e8fc29ee4 |
||
|
|
9a05b49e3d |
||
|
|
79f8d92084 |
||
|
|
6e56542586 |
||
|
|
c53443b62b |
||
|
|
1128662c89 |
||
|
|
676787417f |
||
|
|
57422dccf3 |
||
|
|
7f3f51e36b |
||
|
|
ef184ec8bf | ||
|
|
9bfe3094dd |
||
|
|
3547b4d010 |
||
|
|
1222e3aa1b |
||
|
|
cff3ee5079 |
||
|
|
c91aa462aa |
||
|
|
62b3775e2f |
||
|
|
54bf8c1142 |
||
|
|
c4f613e4c5 |
||
|
|
a66d9ab0b1 |
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
"files": [
|
"files": [
|
||||||
"website/src/pages/credits.mdx"
|
"website/src/pages/credits.mdx",
|
||||||
|
"docs/src/assets/contributors.html"
|
||||||
],
|
],
|
||||||
"imageSize": 75,
|
"imageSize": 75,
|
||||||
"commit": false,
|
"commit": false,
|
||||||
|
|
|
||||||
55
.beads/issues.jsonl
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
{"id":"wails-webview2gtk6-0mc","title":"GTK4: Drag and drop not working - needs manual testing","description":"Native file drag-and-drop from file managers works in GTK3 but NOT in GTK4.\n\n**Symptoms:**\n- Dragging files onto GTK4 app causes WebKit to open file like a browser\n- GtkDropTarget signals (enter, leave, motion, drop) never fire\n- Debug logging shows no [DND-GTK4] messages during drag operations\n\n**Investigation Done:**\n- Added GtkDropControllerMotion with GTK_PHASE_CAPTURE for motion tracking\n- Added GtkDropTarget with GTK_PHASE_CAPTURE and accept handler for file drops\n- Both controllers added to WebKitWebView\n- WebKitGTK uses GtkDropTargetAsync internally in bubble phase\n\n**Key Finding:**\n- WebKitGTK 2.50.3 disabled file access (CVE-2025-13947) but this should not affect native GTK drops\n- Capture phase should run before WebKit's bubble phase handlers\n\n**Files Modified:**\n- v3/pkg/application/linux_cgo_gtk4.c - DND handlers with debug logging\n- v3/pkg/application/linux_cgo_gtk4.go - enableDND/disableDND\n\n**Testing Required:**\n1. Build: cd v3/examples/drag-n-drop \u0026\u0026 go build -a -o drag-n-drop-gtk4 .\n2. Run: ./drag-n-drop-gtk4\n3. Drag file from file manager to window\n4. Watch for [DND-GTK4] messages in console\n\n**If DropControllerMotion fires but GtkDropTarget doesn't:**\n- WebKit intercepts at lower level, may need GtkDropTargetAsync approach\n\n**If nothing fires:**\n- Issue with controller attachment to WebKitWebView","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-08T15:26:58.12691099+11:00","updated_at":"2026-01-08T15:50:34.104083842+11:00","closed_at":"2026-01-08T15:50:34.104083842+11:00","close_reason":"Fixed - implemented GtkDropControllerMotion + GtkDropTarget with GTK_PHASE_CAPTURE"}
|
||||||
|
{"id":"wails-webview2gtk6-588","title":"doctor-ng: New TUI doctor package","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-06T15:53:57.74361022+11:00","updated_at":"2026-01-06T15:54:05.035250923+11:00","closed_at":"2026-01-06T15:54:05.035250923+11:00","close_reason":"Implemented: pkg/doctor-ng with modern bubbletea TUI, public API for GUI reuse, CLI command wails3 doctor-ng"}
|
||||||
|
{"id":"wails-webview2gtk6-95s","title":"Window not found warning on application quit","description":"When quitting a systray application, a warning is logged: 'Window #1 not found'. This happens during cleanup when trying to access windows that have already been destroyed.\n\nReproduction:\n1. Run any systray test (e.g., custom-handlers-gtk4)\n2. Use the menu to quit\n3. Observe warning in console\n\nExpected: Clean shutdown without warnings\nActual: WRN Window #1 not found","status":"open","priority":2,"issue_type":"bug","created_at":"2026-01-06T14:35:05.897126324+11:00","updated_at":"2026-01-06T14:35:05.897126324+11:00"}
|
||||||
|
{"id":"wails-webview2gtk6-e8m","title":"Cursor warps to window center on second systray click (Hyprland)","description":"On Hyprland, when using window-menu systray configuration:\n\n1. Click systray icon -\u003e window shows, cursor stays in place\n2. Click systray icon again -\u003e window hides then shows, cursor warps to window center\n\nThis only happens when toggling via systray icon click. Using menu 'Show Window' doesn't cause the warp.\n\nLikely related to PositionWindow() interaction with Hyprland's focus handling.\n\nEnvironment: Hyprland, GTK4\nPriority: Low (cosmetic issue)","status":"open","priority":3,"issue_type":"bug","created_at":"2026-01-06T14:49:45.489579343+11:00","updated_at":"2026-01-06T14:49:45.489579343+11:00"}
|
||||||
|
{"id":"wails-webview2gtk6-m4c","title":"Systray API v2: Refactor for cleaner separation of concerns","description":"Redesign systray API for cleaner separation of concerns:\n\n## Core Principles\n1. Registration separate from behavior - AttachWindow/SetMenu only register resources\n2. Smart defaults with explicit overrides - Works out of the box, customizable when needed\n3. Window behavior belongs on window - HideOnFocusLost, HideOnEscape are window options\n4. Platform differences handled internally - User expresses intent, implementation adapts\n\n## Smart Defaults\n| Configuration | Left-Click | Right-Click |\n|--------------|------------|-------------|\n| Window only | ToggleWindow | Nothing |\n| Menu only | Nothing | ShowMenu |\n| Window + Menu | ToggleWindow | ShowMenu |\n\n## Scope\n- Window options: HideOnFocusLost, HideOnEscape\n- Systray smart defaults\n- GTK3 \u0026 GTK4 compatibility\n- Documentation, tests, examples","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-06T12:41:49.962413423+11:00","updated_at":"2026-01-06T15:33:03.609804696+11:00","closed_at":"2026-01-06T15:33:03.609804696+11:00","close_reason":"All implementation tasks complete. Systray API v2 implemented with smart defaults, HideOnEscape, HideOnFocusLost, and comprehensive manual tests. GTK3/GTK4 verified."}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.1","title":"Add HideOnFocusLost window option","description":"Add HideOnFocusLost option to WebviewWindowOptions.\n\nFiles to modify:\n- webview_window_options.go: Add HideOnFocusLost bool field\n- webview_window.go: Implement focus-lost handler in setupBehaviorOptions()\n- linux_cgo.go: GTK3 focus-lost signal (focus-out-event)\n- linux_cgo_gtk4.go: GTK4 focus-lost signal (notify::is-active)\n- webview_window_darwin.go: macOS focus-lost handling\n- webview_window_windows.go: Windows focus-lost handling\n\nPlatform behavior:\n- Standard WMs: Hide on focus lost\n- Focus-follows-mouse WMs (Hyprland, Sway, i3): Silently disabled\n\nImplementation:\nif options.HideOnFocusLost {\n if runtime.GOOS == \"linux\" \u0026\u0026 isFocusFollowsMouse() {\n return // Skip - would cause immediate hide\n }\n w.OnWindowEvent(events.Common.WindowLostFocus, func(e *WindowEvent) {\n w.Hide()\n })\n}","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:42:15.123041365+11:00","updated_at":"2026-01-06T13:02:45.845914238+11:00","closed_at":"2026-01-06T13:02:45.845914238+11:00","close_reason":"Implemented HideOnFocusLost option","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.1","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:42:15.128286221+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.2","title":"Add HideOnEscape window option","description":"Add HideOnEscape option to WebviewWindowOptions.\n\nFiles to modify:\n- webview_window_options.go: Add HideOnEscape bool field\n- webview_window.go: Register Escape keybinding in setupBehaviorOptions()\n\nImplementation:\nif options.HideOnEscape {\n w.registerKeyBinding(\"escape\", func() {\n w.Hide()\n })\n}\n\nNotes:\n- Should work on all platforms (GTK3, GTK4, macOS, Windows)\n- Uses existing keybinding infrastructure","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:42:23.973789683+11:00","updated_at":"2026-01-06T13:02:46.561848535+11:00","closed_at":"2026-01-06T13:02:46.561848535+11:00","close_reason":"Implemented HideOnEscape option","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.2","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:42:23.978484152+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.3","title":"Implement systray smart defaults","description":"Implement smart defaults for systray click behavior.\n\nSmart Defaults:\n| Configuration | Left-Click | Right-Click |\n|--------------|------------|-------------|\n| Window only | ToggleWindow | Nothing |\n| Menu only | Nothing | ShowMenu |\n| Window + Menu | ToggleWindow | ShowMenu |\n| Neither | Nothing | Nothing |\n\nFiles to modify:\n- systemtray.go: Add applySmartDefaults() method, call from Run()\n\nImplementation:\nfunc (s *SystemTray) applySmartDefaults() {\n hasWindow := s.attachedWindow.Window != nil\n hasMenu := s.menu != nil\n \n if s.clickHandler == nil {\n if hasWindow {\n s.clickHandler = s.ToggleWindow\n }\n }\n \n if s.rightClickHandler == nil {\n if hasMenu {\n s.rightClickHandler = s.ShowMenu\n }\n }\n}\n\nUser-specified OnLeftClick/OnRightClick handlers override these defaults.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:42:34.796175422+11:00","updated_at":"2026-01-06T13:02:47.607457075+11:00","closed_at":"2026-01-06T13:02:47.607457075+11:00","close_reason":"Implemented smart defaults in applySmartDefaults()","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.3","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:42:34.801495751+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.4","title":"Fix Linux systray Activate/SecondaryActivate handlers","description":"Fix Linux systray DBus handlers to call correct click handlers.\n\nCurrent issues:\n- Activate calls doubleClickHandler instead of clickHandler\n- ItemIsMenu is always true, causing host to intercept left-click\n- Menu property registered even when no menu\n\nFiles to modify:\n- systemtray_linux.go\n\nChanges:\n1. Activate() should call s.parent.clickHandler (not doubleClickHandler)\n2. SecondaryActivate() should call s.parent.rightClickHandler\n3. ItemIsMenu = false when window attached (let our code handle clicks)\n4. Only register Menu property when s.menu != nil\n\nImplementation already partially done in this session - verify and clean up.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:42:47.726574187+11:00","updated_at":"2026-01-06T13:02:48.48112849+11:00","closed_at":"2026-01-06T13:02:48.48112849+11:00","close_reason":"Fixed Activate/SecondaryActivate handlers","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.4","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:42:47.731830675+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.5","title":"Add systray API v2 unit tests","description":"Add unit tests for new systray behavior.\n\nTest cases:\n- TestSystraySmartDefaults_WindowOnly: Left=toggle, Right=nothing\n- TestSystraySmartDefaults_MenuOnly: Left=nothing, Right=menu\n- TestSystraySmartDefaults_WindowAndMenu: Left=toggle, Right=menu\n- TestSystraySmartDefaults_Neither: Left=nothing, Right=nothing\n- TestSystrayOverride_LeftClick: Custom handler overrides default\n- TestSystrayOverride_RightClick: Custom handler overrides default\n- TestWindowOption_HideOnFocusLost: Window hides on focus lost\n- TestWindowOption_HideOnEscape: Window hides on Escape\n- TestWindowOption_FocusFollowsMouse: HideOnFocusLost disabled on tiling WMs\n\nFiles:\n- systemtray_test.go\n- webview_window_test.go","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-06T12:42:58.128530198+11:00","updated_at":"2026-01-06T12:42:58.128530198+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.5","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:42:58.133914168+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.6","title":"Update systray documentation","description":"Update documentation for new systray API.\n\nFiles to update:\n- mkdocs-website/docs/learn/systray.md: Full rewrite\n- mkdocs-website/docs/learn/windows.md: Document HideOnFocusLost, HideOnEscape\n- mkdocs-website/docs/api/systray.md: API reference\n\nDocumentation structure:\n1. Basic Usage\n - Window-based systray (popup)\n - Menu-based systray\n - Window + Menu\n2. Smart Defaults explanation\n3. Customizing Behavior\n - OnLeftClick/OnRightClick overrides\n4. Window auto-hide options\n - HideOnFocusLost\n - HideOnEscape\n - Platform considerations (focus-follows-mouse)\n5. Platform Notes (Linux, macOS, Windows)","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-06T12:43:08.693794811+11:00","updated_at":"2026-01-06T12:43:08.693794811+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.6","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:43:08.699255848+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.7","title":"Update systray examples","description":"Update and create systray examples.\n\nUpdate:\n- examples/systray-basic/main.go: Show HideOnFocusLost, HideOnEscape options\n\nCreate:\n- examples/systray-menu/main.go: Menu-only example\n- examples/systray-window-menu/main.go: Window + Menu example\n\nEach example should demonstrate:\n- Minimal setup\n- Smart defaults in action\n- How to customize if needed\n\nExample for systray-basic:\nwindow := app.NewWindow(WebviewWindowOptions{\n Hidden: true,\n Frameless: true,\n AlwaysOnTop: true,\n HideOnFocusLost: true, // NEW\n HideOnEscape: true, // NEW\n})\nsystray.AttachWindow(window)","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T12:43:19.315995474+11:00","updated_at":"2026-01-06T13:02:49.08857561+11:00","closed_at":"2026-01-06T13:02:49.08857561+11:00","close_reason":"Updated systray-basic example","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.7","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:43:19.323424534+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.8","title":"Verify GTK3 and GTK4 compatibility","description":"Verify all systray changes work on both GTK3 and GTK4.\n\nTest matrix:\n| Feature | GTK3 | GTK4 |\n|---------|------|------|\n| Left-click toggle window | Test | Test |\n| Right-click show menu | Test | Test |\n| HideOnFocusLost | Test | Test |\n| HideOnEscape | Test | Test |\n| ItemIsMenu property | Test | Test |\n| Menu property conditional | Test | Test |\n\nBuild commands:\n- GTK4: go build ./pkg/application/...\n- GTK3: go build -tags gtk3 ./pkg/application/...\n\nTest on:\n- Hyprland (tiling, focus-follows-mouse)\n- GNOME (standard WM)\n\nDocument any GTK3/GTK4 differences in behavior.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:43:30.274572191+11:00","updated_at":"2026-01-06T15:32:18.160668676+11:00","closed_at":"2026-01-06T15:32:18.160668676+11:00","close_reason":"Verified GTK3/GTK4 compatibility - all tests pass","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.8","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:43:30.279370657+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-m4c.9","title":"Clean up current session systray changes","description":"Clean up partial implementation from current session.\n\nChanges made in this session that need review/cleanup:\n1. systemtray_linux.go:\n - Activate() now calls clickHandler (correct)\n - SecondaryActivate() calls rightClickHandler or OpenMenu (correct)\n - ItemIsMenu conditional on window/menu presence (correct)\n - Menu property only registered when menu exists (correct)\n - Removed 'Open window' menu item injection (correct)\n\n2. environment_linux.go:\n - Added isTilingWM() helper (keep)\n - Removed unused Hyprland IPC functions (keep)\n - Cleaned up debug output (keep)\n\n3. linux_cgo.go / linux_cgo_gtk4.go:\n - Added setOpacity() - keep for future use\n\n4. webview_window_linux.go:\n - Removed unused compositorWindowID field (keep)\n\n5. examples/systray-basic/main.go:\n - Added Escape keybinding manually (will be replaced by HideOnEscape option)\n\nReview all changes, ensure they align with spec, commit clean state.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T12:43:44.358797107+11:00","updated_at":"2026-01-06T13:02:50.19506054+11:00","closed_at":"2026-01-06T13:02:50.19506054+11:00","close_reason":"Cleanup complete","dependencies":[{"issue_id":"wails-webview2gtk6-m4c.9","depends_on_id":"wails-webview2gtk6-m4c","type":"parent-child","created_at":"2026-01-06T12:43:44.36368827+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e","title":"WebKitGTK 6.0 / GTK4 Support for Wails v3","description":"Add WebKitGTK 6.0 (GTK4) support to Wails v3 as the DEFAULT target. GTK3/WebKit4.1 available via -tags gtk3 for legacy systems.\n\nArchitecture:\n- Default (no tag): GTK4 + WebKitGTK 6.0\n- Legacy (-tags gtk3): GTK3 + WebKit2GTK 4.1\n\nDocker container provides BOTH library sets for cross-compilation:\n- task build:linux → GTK4/WebKit6 (modern, default)\n- task build:linux:gtk3 → GTK3/WebKit4.1 (legacy backport)\n\nSame pattern as macOS/Windows cross-compilation from Linux.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-01-04T12:06:52.983769501+11:00","updated_at":"2026-01-04T12:52:12.372486756+11:00"}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.1","title":"Phase 1: Add gtk3 build constraint to existing GTK3/WebKit4.1 files","description":"Rename/constrain existing GTK3 files to require -tags gtk3:\n- linux_cgo.go → add //go:build linux \u0026\u0026 gtk3\n- clipboard_linux.go → add //go:build linux \u0026\u0026 gtk3\n- menu_linux.go → add //go:build linux \u0026\u0026 gtk3\n- menuitem_linux.go → add //go:build linux \u0026\u0026 gtk3\n- screen_linux.go → add //go:build linux \u0026\u0026 gtk3\n- dialogs_linux.go → add //go:build linux \u0026\u0026 gtk3\n- webkit2.go → add //go:build linux \u0026\u0026 gtk3\n\nThese become the LEGACY path, only built with -tags gtk3","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:40.301322984+11:00","updated_at":"2026-01-06T15:34:36.338594373+11:00","closed_at":"2026-01-06T15:34:36.338594373+11:00","close_reason":"GTK3 files have gtk3 build tag","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.1","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:40.306919353+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.10","title":"Phase 4: Implement webkit6 asset server","description":"webkit6.go, request_linux_webkit6.go, responsewriter_linux_webkit6.go - URI scheme handling with WebKitGTK 6.0 API (webkit_uri_scheme_response_new).","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:08:08.383542838+11:00","updated_at":"2026-01-06T15:34:41.942498525+11:00","closed_at":"2026-01-06T15:34:41.942498525+11:00","close_reason":"WebKit6 asset server implemented - URI scheme handling works","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.10","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:08.389188642+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.11","title":"Phase 5: Implement GMenu/GAction menu system","description":"Complete rewrite from GtkMenu/GtkMenuItem to GMenu/GAction/GtkPopoverMenuBar. Most significant GTK4 change. Reference v2 PR #4570 menu_webkit6.go but fix race conditions.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:08:40.990519767+11:00","updated_at":"2026-01-06T20:27:18.582723928+11:00","closed_at":"2026-01-06T20:27:18.582723928+11:00","close_reason":"Completed - GMenu/GAction implemented in menu_linux_gtk4.go and linux_cgo_gtk4.c","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.11","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:40.995669687+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.12","title":"Phase 5: Implement menu item state handling","description":"GSimpleAction for text/checkbox/radio items. Stateful actions with g_simple_action_new_stateful. Proper checked state sync. Fix nil checks from v2 PR issues.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:08:45.52200628+11:00","updated_at":"2026-01-06T20:27:20.311243355+11:00","closed_at":"2026-01-06T20:27:20.311243355+11:00","close_reason":"Completed - GSimpleAction with stateful actions for checkbox/radio implemented","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.12","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:45.526654215+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.13","title":"Phase 5: Implement GTK4 keyboard accelerators","description":"gtk_application_set_accels_for_action for menu shortcuts. Map existing accelerator format to GTK4 format.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:08:49.061335186+11:00","updated_at":"2026-01-06T20:27:20.562596782+11:00","closed_at":"2026-01-06T20:27:20.562596782+11:00","close_reason":"Completed - gtk_application_set_accels_for_action() implemented in Phase 9","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.13","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:49.066422576+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.14","title":"Phase 6: Implement GTK4 clipboard API","description":"Replace gtk_clipboard_get with gdk_display_get_clipboard/gdk_display_get_primary_clipboard. Use GdkContentProvider for setting text.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:08:53.275247028+11:00","updated_at":"2026-01-06T20:27:22.183597579+11:00","closed_at":"2026-01-06T20:27:22.183597579+11:00","close_reason":"Completed - GdkClipboard implemented in linux_cgo_gtk4.go","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.14","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:53.279707286+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.15","title":"Phase 6: Implement GTK4 dialogs","description":"File chooser and message dialogs. Use deprecated-but-functional APIs (gtk_file_chooser_dialog_new deprecated 4.10 but works). Consider GtkFileDialog for future.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:08:59.838538142+11:00","updated_at":"2026-01-06T20:27:22.294219031+11:00","closed_at":"2026-01-06T20:27:22.294219031+11:00","close_reason":"Completed - GtkFileDialog and GtkAlertDialog implemented in Phase 8","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.15","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:59.843372832+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.16","title":"Phase 6: Implement GTK4 screen/monitor handling","description":"GdkMonitor/GdkDisplay GTK4 changes. Note: gdk_monitor_is_primary removed - handle gracefully or use alternative detection.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:09:08.402102924+11:00","updated_at":"2026-01-06T20:27:35.337382837+11:00","closed_at":"2026-01-06T20:27:35.337382837+11:00","close_reason":"N/A - GTK4 uses GdkDisplay/GdkMonitor which are mostly backwards compatible; no special handling needed","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.16","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:08.406691355+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.17","title":"Phase 6: Implement GTK4 event controllers","description":"Replace GTK3 signals with GTK4 event controllers: GtkGestureClick for button-press, GtkEventControllerKey for key events, GtkEventControllerMotion for motion.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:09:11.122143159+11:00","updated_at":"2026-01-06T20:27:23.251573875+11:00","closed_at":"2026-01-06T20:27:23.251573875+11:00","close_reason":"Completed - GtkEventControllerFocus/GtkGestureClick/GtkEventControllerKey implemented in Phase 3","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.17","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:11.127168452+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.18","title":"Phase 7: Create webkit6 test matrix","description":"Test on Ubuntu 24.04, Fedora 40+, Arch Linux. Both X11 and Wayland sessions. Verify window lifecycle, menus, dialogs, clipboard, asset serving.","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:09:14.440029393+11:00","updated_at":"2026-01-04T12:09:14.440029393+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.18","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:14.444560094+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.19","title":"Phase 7: Update UNRELEASED_CHANGELOG.md","description":"Document: webkit_6 build flag, auto-detection via capabilities command, Taskfile integration, known limitations (window positioning on Wayland).","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:09:17.821748561+11:00","updated_at":"2026-01-04T12:09:17.821748561+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.19","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:17.826107005+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.2","title":"Phase 1: Create GTK4/WebKit6 files as DEFAULT (no build tag)","description":"Create new GTK4/WebKit6 implementation files as the default (no tag required):\n- linux_cgo.go → //go:build linux \u0026\u0026 !gtk3 with pkg-config: gtk4 webkitgtk-6.0\n- clipboard_linux.go → //go:build linux \u0026\u0026 !gtk3\n- menu_linux.go → //go:build linux \u0026\u0026 !gtk3 (GMenu/GAction)\n- menuitem_linux.go → //go:build linux \u0026\u0026 !gtk3\n- screen_linux.go → //go:build linux \u0026\u0026 !gtk3\n- dialogs_linux.go → //go:build linux \u0026\u0026 !gtk3\n- webkit6.go → //go:build linux \u0026\u0026 !gtk3\n\nGTK4 is now the DEFAULT path, built without any tags","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:41.961703449+11:00","updated_at":"2026-01-06T15:34:38.035912813+11:00","closed_at":"2026-01-06T15:34:38.035912813+11:00","close_reason":"GTK4 files exist as default (linux_cgo_gtk4.go, menu_linux_gtk4.go, etc.)","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.2","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:41.966174608+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.20","title":"Phase 7: Write GTK4/WebKit6 documentation","description":"Migration guide covering: distro requirements, build flags, window positioning limitations, menu system changes, API differences from GTK3.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-04T12:09:20.269607376+11:00","updated_at":"2026-01-04T12:09:20.269607376+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.20","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:20.274078494+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.21","title":"Phase 8: V2 PR #4570 Fixes Tracker","description":"Track issues to backport to v2 PR after v3 port complete. Current known issues:\n- Race conditions: menu maps accessed without sync (menu_webkit6.go)\n- Nil checks missing: gActionIdToMenuItem.Load ignores ok bool (gtk_webkit6.go:18,22,34,45)\n- Memory leak: C.CString(title) not freed (window_webkit6.go:384)\n- Header mismatch: sendShowInspectorMessage signature wrong (window_webkit6.h:127)\n- Wrong cast: GtkWindow passed as GdkToplevel (window_webkit6.c:672,699)\n- Broken logic: IsMinimised returns wrong value (window_webkit6.c:383-387)\n- Incomplete: drag-drop just prints paths (window_webkit6.c:574-585)\n- Missing: separator handling in menus\nUPDATE THIS AS MORE ISSUES FOUND DURING V3 PORT","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-04T12:09:35.71638895+11:00","updated_at":"2026-01-04T12:09:35.71638895+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.21","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:09:35.720786909+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.22","title":"Test Strategy: Build tag verification","description":"Verify build constraints work correctly:\n\nDefault build (no tags):\n- Uses GTK4/WebKitGTK 6.0 files\n- Compiles cleanly with gtk4 and webkitgtk-6.0 pkg-config\n\nLegacy build (-tags gtk3):\n- Uses GTK3/WebKit2GTK 4.1 files\n- Compiles cleanly with gtk+-3.0 and webkit2gtk-4.1 pkg-config\n\nVerify:\n- No file conflicts or duplicate symbols in either config\n- Both builds produce working binaries\n- CI matrix tests both configurations\n- Docker cross-compilation works for both targets","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:40:55.065828451+11:00","updated_at":"2026-01-04T12:53:15.945916832+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.22","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:40:55.071357519+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.23","title":"Test Strategy: GTK3 legacy build regression tests","description":"Ensure GTK3 legacy path (-tags gtk3) still works:\n- All existing Linux tests pass WITH -tags gtk3\n- Window lifecycle (create, show, hide, destroy)\n- Menu system (items, checkboxes, radio, separators, accelerators)\n- Dialogs (file open/save, message dialogs)\n- Clipboard operations\n- Asset serving via wails:// scheme\n- JavaScript execution and callbacks\n\nRun via Docker on systems without GTK3 dev libs locally.\nThis is the LEGACY path for older distros.","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:40:57.736554584+11:00","updated_at":"2026-01-04T12:53:21.402683536+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.23","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:40:57.74152021+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.24","title":"Test Strategy: GTK4 default build tests","description":"Verify GTK4 (default, no tags) works correctly:\n- Window lifecycle identical to GTK3 behavior\n- Menu system: GMenu/GAction produces same UX as GtkMenu\n- Dialogs: same file filters, default paths work\n- Clipboard: copy/paste text works identically \n- Asset serving: wails:// scheme works\n- JS execution: evaluate_javascript produces same results\n\nDocument intentional differences:\n- Window positioning is no-op on Wayland (expected)\n- Minor visual differences due to GTK4 theming","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:01.206249936+11:00","updated_at":"2026-01-04T12:53:26.644766099+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.24","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:01.21075179+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.25","title":"Test Strategy: Cross-distro matrix","description":"Test on multiple distributions:\n| Distro | GTK4/WebKit6 | GTK3/WebKit4.1 | Priority |\n|--------|--------------|----------------|----------|\n| Ubuntu 24.04 | ✓ test | ✓ test | HIGH |\n| Ubuntu 22.04 | N/A | ✓ test | HIGH |\n| Fedora 40+ | ✓ test | ✓ test | HIGH |\n| Arch Linux | ✓ test | ✓ test | MEDIUM |\n| Debian 12 | ✓ backports | ✓ test | MEDIUM |\n\nUse Docker containers or VMs for reproducible testing.","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:11.624965746+11:00","updated_at":"2026-01-04T12:41:11.624965746+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.25","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:11.62962541+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.26","title":"Test Strategy: X11 vs Wayland session testing","description":"Test both display servers:\nX11 Session:\n- Window positioning should work (GTK3) or no-op gracefully (GTK4)\n- All features functional\n- Performance baseline\n\nWayland Session:\n- Window positioning confirmed as no-op (expected)\n- No crashes or errors from positioning attempts\n- Native Wayland rendering (GTK4 benefits)\n- Verify GDK_BACKEND handling\n\nTest with: GDK_BACKEND=x11 and GDK_BACKEND=wayland","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:15.327289032+11:00","updated_at":"2026-01-04T12:41:15.327289032+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.26","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:15.331938707+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.27","title":"Test Strategy: Doctor and capabilities command tests","description":"Test tooling works correctly:\n- wails3 doctor shows GTK3/4 and WebKit4.1/6.0 availability\n- wails3 doctor only shows 'installed' for actual dev packages (not runtime)\n- wails3 capabilities --json returns correct structure\n- wails3 capabilities --linux-tags returns 'webkit_6' when available, empty when not\n- Taskfile integration works (auto-selects correct tags)\n- Test on system WITH gtk4/webkit6 dev packages\n- Test on system WITHOUT gtk4/webkit6 (only gtk3)","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:19.283226161+11:00","updated_at":"2026-01-04T12:41:19.283226161+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.27","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:19.287996887+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.28","title":"Test Strategy: Auto-detection fallback behavior","description":"Test the smart default behavior:\nScenario 1: System has GTK4 + WebKit6\n- capabilities recommends webkit_6\n- Taskfile uses webkit_6 automatically\n- Build succeeds with GTK4 features\n\nScenario 2: System has only GTK3 + WebKit4.1\n- capabilities recommends default (no tag)\n- Taskfile uses no extra tags\n- Build succeeds with GTK3\n\nScenario 3: Neither available\n- Doctor shows clear error\n- Install commands displayed per distro\n- Build fails with helpful message","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:22.845473972+11:00","updated_at":"2026-01-04T12:41:22.845473972+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.28","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:22.850043685+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.29","title":"Test Strategy: Docker test containers","description":"Update Docker containers to support both GTK versions:\n\nSingle container with both library sets:\n- Ubuntu 24.04 base (has both GTK3 and GTK4)\n- libgtk-4-dev + libwebkitgtk-6.0-dev (default)\n- libgtk-3-dev + libwebkit2gtk-4.1-dev (legacy)\n\nBuild script parameters:\n- docker run wails-linux ./build.sh # GTK4 default\n- docker run wails-linux ./build.sh --gtk3 # GTK3 legacy\n\nArchitecture variants:\n- Dockerfile.linux-x86_64 (amd64)\n- Dockerfile.linux-arm64 (aarch64)\n\nStore in v3/test/docker/ directory","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:52.701057271+11:00","updated_at":"2026-01-04T12:53:38.599341789+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.29","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:52.706373965+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.3","title":"Phase 2: Update wails doctor for GTK4 as default","description":"Update doctor to check for GTK4/WebKit6 as primary requirement:\n\nPrimary checks (required for default build):\n- pkg-config --exists gtk4\n- pkg-config --exists webkitgtk-6.0\n\nSecondary checks (for legacy builds):\n- pkg-config --exists gtk+-3.0\n- pkg-config --exists webkit2gtk-4.1\n\nOutput example:\n GTK4 (gtk4) ✓ 4.14.1 [required for default build]\n WebKitGTK 6.0 ✓ 2.44.1 [required for default build]\n GTK3 (gtk+-3.0) ✓ 3.24.38 [for -tags gtk3 builds]\n WebKit2GTK 4.1 ✓ 2.44.1 [for -tags gtk3 builds]\n\nIf GTK4 missing: suggest Docker build or install commands","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:43.111264576+11:00","updated_at":"2026-01-06T15:38:15.173987437+11:00","closed_at":"2026-01-06T15:38:15.173987437+11:00","close_reason":"Doctor already correctly shows GTK4 as primary and GTK3 as legacy. Verified output shows gtk4 4.20.3, webkitgtk-6.0 2.50.3 as required, gtk3/webkit2gtk marked (legacy) as optional.","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.3","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:43.11571264+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.30","title":"Test Strategy: Docker-based doctor/capabilities tests","description":"Test both GTK versions via Docker:\n\nTest matrix for Docker builds:\n| Command | Expected Result |\n|---------|-----------------|\n| task build:linux | GTK4/WebKit6 binary |\n| task build:linux:gtk3 | GTK3/WebKit4.1 binary |\n\nVerify in Docker container:\n- Default build links against libgtk-4.so, libwebkitgtk-6.0.so\n- GTK3 build links against libgtk-3.so, libwebkit2gtk-4.1.so\n\nCross-compilation test:\n- Build from macOS → Linux GTK4 (Docker)\n- Build from macOS → Linux GTK3 (Docker)\n- Build from Windows → Linux GTK4 (Docker)","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:41:56.664141365+11:00","updated_at":"2026-01-04T12:53:44.010563993+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.30","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:41:56.668983135+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.31","title":"Test Strategy: Docker-based build verification","description":"Verify Docker builds produce correct binaries:\n\nDefault (GTK4) builds:\n- docker run wails-linux ./build.sh\n- Binary requires libgtk-4, libwebkitgtk-6.0 at runtime\n- Runs on Ubuntu 22.04+, Fedora 38+, Arch, Debian 12+\n\nLegacy (GTK3) builds:\n- docker run wails-linux ./build.sh --gtk3\n- Binary requires libgtk-3, libwebkit2gtk-4.1 at runtime\n- Runs on older distros (Ubuntu 20.04, Debian 11, RHEL 8)\n\nTest both binaries actually run on target systems (not just compile)","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:42:00.581467132+11:00","updated_at":"2026-01-04T12:53:49.143142805+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.31","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:42:00.586144259+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.32","title":"Test Strategy: CI workflow for multi-distro testing","description":"Add GitHub Actions workflow for automated testing:\n\n.github/workflows/linux-webkit6-tests.yml:\n- Trigger on PRs touching v3/pkg/application/*linux*, v3/internal/doctor/*\n- Matrix strategy with Docker containers\n- Jobs:\n 1. Build verification (both tag configs)\n 2. Doctor command output validation\n 3. Capabilities command JSON validation\n \nCache Docker images for faster CI runs.\nFail CI if any distro/config combination breaks.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-04T12:42:04.299112575+11:00","updated_at":"2026-01-04T12:42:04.299112575+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.32","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:42:04.30363047+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.33","title":"Test Strategy: Unit tests for new Go code","description":"Add unit tests for new functionality:\n\n- capabilities command parsing and JSON output\n- pkg-config detection wrapper functions\n- Build tag detection logic\n- DevPackageInstalled() / DevPackageVersion() functions\n- Taskfile tag generation logic\n\nTests should be runnable without GTK installed (mock pkg-config calls).\nLocation: v3/internal/doctor/*_test.go, v3/cmd/wails3/*_test.go","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:42:59.917988736+11:00","updated_at":"2026-01-04T12:42:59.917988736+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.33","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:42:59.91880054+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.34","title":"Test Strategy: Edge cases and error handling","description":"Test edge cases for webkit_6 implementation:\n\nMenu edge cases:\n- Empty menu\n- Deeply nested submenus (5+ levels)\n- Menu items with special characters (unicode, \u0026, \u003c, \u003e)\n- Rapid menu updates\n- Menu with 100+ items\n\nWindow edge cases:\n- Multiple windows simultaneously\n- Window close during JS execution\n- Rapid show/hide cycles\n\nError handling:\n- Graceful handling when WebKit crashes\n- Clear error messages for missing dependencies\n- Proper cleanup on application exit","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-04T12:43:02.108202689+11:00","updated_at":"2026-01-04T12:43:02.108202689+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.34","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:43:02.114118944+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.35","title":"Test Strategy: Memory and resource leak testing","description":"Verify no memory leaks in webkit_6 implementation:\n\nCritical areas (from v2 PR issues):\n- C.CString allocations must be freed\n- GObject ref counting (g_object_unref calls)\n- Menu rebuilds don't leak\n- Window create/destroy cycles don't leak\n\nTesting approach:\n- Use valgrind or AddressSanitizer\n- Create/destroy 1000 windows, measure memory\n- Rebuild menus 1000 times, measure memory\n- Long-running test (1 hour) with periodic operations\n\nCompare memory behavior between GTK3 and GTK4 builds.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-04T12:43:08.315395906+11:00","updated_at":"2026-01-04T12:43:08.315395906+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.35","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:43:08.320587181+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.36","title":"Test Strategy: Example apps verification","description":"Verify all v3 example apps work with webkit_6:\n\nTest each example in v3/examples/:\n- Build with default tags (GTK3)\n- Build with -tags webkit_6 (GTK4)\n- Run and verify functionality matches\n\nPriority examples:\n- plain (basic window)\n- menu (menu system)\n- dialogs (file/message dialogs)\n- clipboard (copy/paste)\n- events (window events)\n- binding (Go-JS bindings)\n\nDocument any examples that need webkit_6-specific adjustments.","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:43:12.575574602+11:00","updated_at":"2026-01-04T12:43:12.575574602+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.36","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:43:12.58115082+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.37","title":"Phase 2: Update Docker container with both GTK3 and GTK4 libraries","description":"Update Dockerfile.linux-x86_64 and Dockerfile.linux-arm64 to include BOTH library sets:\n\nRUN apt-get install -y \\\n # GTK4 + WebKitGTK 6.0 (default/modern)\n libgtk-4-dev \\\n libwebkitgtk-6.0-dev \\\n # GTK3 + WebKit2GTK 4.1 (legacy)\n libgtk-3-dev \\\n libwebkit2gtk-4.1-dev \\\n libayatana-appindicator3-dev\n\nUpdate build script to accept GTK version parameter:\n- build-linux.sh gtk4 → builds with no tags (default)\n- build-linux.sh gtk3 → builds with -tags gtk3\n\nThis enables cross-compilation to EITHER target from any platform.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:53:05.672476127+11:00","updated_at":"2026-01-06T20:27:23.926443978+11:00","closed_at":"2026-01-06T20:27:23.926443978+11:00","close_reason":"Completed - Docker containers updated in Phase 6","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.37","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:53:05.678037266+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.38","title":"Test Strategy: Comprehensive performance benchmark suite","description":"Create benchmark suite to measure GTK4/WebKit6 vs GTK3/WebKit4.1 performance.\n\nRENDERING BENCHMARKS:\n- Time to First Paint (TTFP): Measure ms from app start to first meaningful content\n- Time to Interactive (TTI): When app responds to user input\n- Frame rate during scroll: 60fps target, measure drops\n- Large DOM: Render 10,000 list items, measure time and FPS\n- DOM manipulation: Add/remove 1000 elements, measure time\n- CSS animations: Complex animations, measure frame consistency\n- Reflow/repaint: Measure layout thrashing scenarios\n\nBINDING BENCHMARKS:\n- Call latency: Round-trip time for Go function call from JS\n- Throughput: Calls per second (simple function)\n- Large payload: Transfer 1MB JSON Go→JS and JS→Go\n- Concurrent calls: 100 simultaneous binding calls\n- Callback performance: Go calling back into JS\n\nASSET SERVER BENCHMARKS:\n- Small file latency: Load 1KB file, measure ms\n- Large file throughput: Load 10MB file, measure MB/s\n- Many files: Load 100 small files sequentially\n- Parallel loading: Load 20 files simultaneously\n- Streaming: Video/audio streaming performance\n\nMEMORY BENCHMARKS:\n- Initial footprint: Memory after app start\n- After heavy ops: Memory after DOM/binding stress\n- Leak detection: Memory after 1000 window open/close cycles\n- Long-running: Memory growth over 1 hour of use\n\nOUTPUT FORMAT:\n- JSON results for CI integration\n- Markdown report for human review\n- Compare GTK4 vs GTK3 side-by-side\n\nIMPLEMENTATION:\n- Create v3/test/benchmarks/ directory\n- Benchmark app with standardized test pages\n- Go benchmark harness using testing.B\n- Browser performance APIs (performance.now(), PerformanceObserver)","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:54:15.661692112+11:00","updated_at":"2026-01-04T12:54:15.661692112+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.38","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:54:15.667316351+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.39","title":"Test Strategy: Create benchmark test application","description":"Create dedicated benchmark application in v3/test/benchmarks/app/\n\nFRONTEND (benchmark pages):\n1. rendering.html - DOM/CSS performance tests\n - Virtual scroll with 100,000 items\n - CSS grid with 1000 cells\n - Animation stress test (50 simultaneous)\n - Canvas 2D drawing benchmark\n \n2. bindings.html - Go\u003c-\u003eJS communication tests\n - Ping-pong latency measurement\n - Large data serialization\n - Concurrent call stress test\n - Event emission throughput\n\n3. assets.html - Asset server tests\n - Image gallery (100 images)\n - Large file download\n - Streaming video playback\n - WebSocket throughput (if applicable)\n\n4. memory.html - Memory profiling\n - Allocate/deallocate cycles\n - DOM node creation/destruction\n - Image loading/unloading\n\nBACKEND (Go harness):\n- BenchmarkService with standardized test methods\n- Metrics collection and reporting\n- Automated test runner\n- Results export (JSON, CSV, Markdown)\n\nCOMPARISON MODE:\n- Run same tests on GTK4 and GTK3 builds\n- Generate comparison report\n- Highlight improvements/regressions\n- Statistical significance testing (multiple runs)","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-04T12:54:33.607772979+11:00","updated_at":"2026-01-04T12:54:33.607772979+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.39","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:54:33.612719138+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.4","title":"Phase 2: Update wails3 capabilities command","description":"Update capabilities command for GTK4-default architecture:\n\nOutput structure:\n{\n \"linux\": {\n \"gtk4\": true,\n \"gtk3\": true,\n \"webkitgtk_6_0\": true,\n \"webkit2gtk_4_1\": true,\n \"default_available\": true, // Can build without tags\n \"legacy_available\": true, // Can build with -tags gtk3\n \"recommended\": \"default\" // or \"legacy\" or \"docker\"\n }\n}\n\nIf GTK4 not available locally, recommend Docker build.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:44.735354235+11:00","updated_at":"2026-01-06T20:46:36.935228449+11:00","closed_at":"2026-01-06T20:46:36.935228449+11:00","close_reason":"Implemented wails3 tool capabilities command","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.4","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:44.739955792+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.40","title":"Test Strategy: CI benchmark regression tracking","description":"Add CI workflow to track performance over time:\n\nWORKFLOW (.github/workflows/benchmarks.yml):\n- Trigger: Weekly schedule + manual dispatch\n- Run benchmarks on both GTK4 and GTK3 builds\n- Store results as artifacts\n- Compare against baseline\n\nTRACKING:\n- Store historical benchmark data\n- Alert on \u003e10% regression\n- Track trends over releases\n- Generate performance dashboard\n\nBASELINE ESTABLISHMENT:\n- Run benchmarks before GTK4 migration (current GTK3)\n- This becomes the baseline for comparison\n- Document expected improvements from GTK4/WebKit6\n\nREPORTING:\n- Post results to PR comments (for benchmark PRs)\n- Update performance docs with latest numbers\n- Publish comparison: GTK4 vs GTK3 vs other frameworks (Electron, Tauri)","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-04T12:54:39.84655827+11:00","updated_at":"2026-01-04T12:54:39.84655827+11:00","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.40","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:54:39.851364533+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.5","title":"Phase 2: Update Taskfile with build:linux and build:linux:gtk3","description":"Update Taskfile.yaml with Linux build targets:\n\ntask build:linux → Default GTK4/WebKit6 build\ntask build:linux:gtk3 → Legacy GTK3/WebKit4.1 build (uses -tags gtk3)\n\nBoth work via Docker for cross-compilation:\n- Docker container has BOTH library sets installed\n- Build script accepts target parameter\n\nExample usage:\n task build:linux # GTK4 native or Docker\n task build:linux:gtk3 # GTK3 via Docker (or native with -tags gtk3)","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:07:46.101012374+11:00","updated_at":"2026-01-06T20:27:33.971988614+11:00","closed_at":"2026-01-06T20:27:33.971988614+11:00","close_reason":"Completed - Taskfile updated with test:example:linux:gtk3 and docker targets in Phase 6","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.5","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:46.105510654+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.6","title":"Phase 3: Implement GTK4 application lifecycle","description":"linux_cgo_webkit6.go - GTK4 app init with gtk_application_new, g_application_run, proper signal handlers. No gtk_init needed in GTK4.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:56.71551144+11:00","updated_at":"2026-01-06T15:34:38.511762855+11:00","closed_at":"2026-01-06T15:34:38.511762855+11:00","close_reason":"GTK4 application lifecycle implemented in application_linux_gtk4.go","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.6","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:56.721263416+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.7","title":"Phase 3: Implement GTK4 window management","description":"Window creation with gtk_window_set_child (not gtk_container_add). Widgets visible by default (no show_all). Fullscreen/maximize/minimize state handling.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:07:59.625663163+11:00","updated_at":"2026-01-06T15:34:39.557173339+11:00","closed_at":"2026-01-06T15:34:39.557173339+11:00","close_reason":"GTK4 window management implemented in linux_cgo_gtk4.go","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.7","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:07:59.63049083+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.8","title":"Phase 3: Implement WebKitGTK 6.0 WebView integration","description":"Use webkit_web_view_evaluate_javascript (not run_javascript), WebKitNetworkSession for network, URI scheme handler registration with new API.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T12:08:02.595646332+11:00","updated_at":"2026-01-06T15:34:40.794896929+11:00","closed_at":"2026-01-06T15:34:40.794896929+11:00","close_reason":"WebKitGTK 6.0 WebView integration implemented in linux_cgo_gtk4.go","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.8","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:02.601222032+11:00","created_by":"daemon"}]}
|
||||||
|
{"id":"wails-webview2gtk6-t4e.9","title":"Phase 3: Window positioning as no-op for webkit_6","description":"SetPosition, Center, GetPosition return gracefully on GTK4/Wayland. gtk_window_move removed intentionally by GTK. Document as known limitation.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-04T12:08:05.494126564+11:00","updated_at":"2026-01-06T20:27:32.813843908+11:00","closed_at":"2026-01-06T20:27:32.813843908+11:00","close_reason":"Completed - Window positioning documented as no-op on Wayland in Decision 3 of IMPLEMENTATION.md","dependencies":[{"issue_id":"wails-webview2gtk6-t4e.9","depends_on_id":"wails-webview2gtk6-t4e","type":"parent-child","created_at":"2026-01-04T12:08:05.498782524+11:00","created_by":"daemon"}]}
|
||||||
71
.coderabbit.yaml
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
language: en-US
|
||||||
|
tone_instructions: ''
|
||||||
|
early_access: false
|
||||||
|
enable_free_tier: true
|
||||||
|
reviews:
|
||||||
|
profile: chill
|
||||||
|
request_changes_workflow: false
|
||||||
|
high_level_summary: true
|
||||||
|
high_level_summary_placeholder: '@coderabbitai summary'
|
||||||
|
auto_title_placeholder: '@coderabbitai'
|
||||||
|
review_status: true
|
||||||
|
poem: true
|
||||||
|
collapse_walkthrough: false
|
||||||
|
sequence_diagrams: true
|
||||||
|
path_filters: []
|
||||||
|
path_instructions: []
|
||||||
|
abort_on_close: true
|
||||||
|
auto_review:
|
||||||
|
enabled: true
|
||||||
|
auto_incremental_review: true
|
||||||
|
ignore_title_keywords: []
|
||||||
|
labels: []
|
||||||
|
drafts: false
|
||||||
|
base_branches: ['v3-alpha', 'master']
|
||||||
|
tools:
|
||||||
|
shellcheck:
|
||||||
|
enabled: true
|
||||||
|
ruff:
|
||||||
|
enabled: true
|
||||||
|
markdownlint:
|
||||||
|
enabled: true
|
||||||
|
github-checks:
|
||||||
|
enabled: true
|
||||||
|
timeout_ms: 90000
|
||||||
|
languagetool:
|
||||||
|
enabled: true
|
||||||
|
enabled_only: false
|
||||||
|
level: default
|
||||||
|
biome:
|
||||||
|
enabled: true
|
||||||
|
hadolint:
|
||||||
|
enabled: true
|
||||||
|
swiftlint:
|
||||||
|
enabled: true
|
||||||
|
phpstan:
|
||||||
|
enabled: true
|
||||||
|
level: default
|
||||||
|
golangci-lint:
|
||||||
|
enabled: true
|
||||||
|
yamllint:
|
||||||
|
enabled: true
|
||||||
|
gitleaks:
|
||||||
|
enabled: true
|
||||||
|
checkov:
|
||||||
|
enabled: true
|
||||||
|
detekt:
|
||||||
|
enabled: true
|
||||||
|
eslint:
|
||||||
|
enabled: true
|
||||||
|
chat:
|
||||||
|
auto_reply: true
|
||||||
|
knowledge_base:
|
||||||
|
opt_out: false
|
||||||
|
learnings:
|
||||||
|
scope: auto
|
||||||
|
issues:
|
||||||
|
scope: auto
|
||||||
|
jira:
|
||||||
|
project_keys: []
|
||||||
|
linear:
|
||||||
|
team_keys: []
|
||||||
3
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
# Use bd merge for beads JSONL files
|
||||||
|
.beads/issues.jsonl merge=beads
|
||||||
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -7,6 +7,8 @@ body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
|
***Please note: No bug reports are currently being accepted for Wails v3***
|
||||||
|
***Please note: No bug reports are currently being accepted for Wails v3***
|
||||||
***Please note: No bug reports are currently being accepted for Wails v3***
|
***Please note: No bug reports are currently being accepted for Wails v3***
|
||||||
Before submitting this issue, please do the following:
|
Before submitting this issue, please do the following:
|
||||||
- Do a web search for your error. This usually leads to a much better understanding of the issue.
|
- Do a web search for your error. This usually leads to a much better understanding of the issue.
|
||||||
|
|
|
||||||
44
.github/file-labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
# File path specific labels
|
||||||
|
v2-only:
|
||||||
|
- 'v2/**/*'
|
||||||
|
|
||||||
|
v3-alpha:
|
||||||
|
- 'v3/**/*'
|
||||||
|
|
||||||
|
windows:
|
||||||
|
- '**/*_windows.go'
|
||||||
|
- 'v2/internal/frontend/desktop/windows/**/*'
|
||||||
|
|
||||||
|
macos:
|
||||||
|
- '**/*_darwin.go'
|
||||||
|
- 'v2/internal/frontend/desktop/darwin/**/*'
|
||||||
|
|
||||||
|
linux:
|
||||||
|
- '**/*_linux.go'
|
||||||
|
- 'v2/internal/frontend/desktop/linux/**/*'
|
||||||
|
|
||||||
|
cli:
|
||||||
|
- 'v2/cmd/**/*'
|
||||||
|
- 'v3/cmd/**/*'
|
||||||
|
- '**/cli/**/*'
|
||||||
|
- '**/commands/**/*'
|
||||||
|
|
||||||
|
documentation:
|
||||||
|
- '**/*.md'
|
||||||
|
- 'docs/**/*'
|
||||||
|
- 'website/**/*'
|
||||||
|
- 'mkdocs-website/**/*'
|
||||||
|
|
||||||
|
templates:
|
||||||
|
- '**/templates/**/*'
|
||||||
|
- '**/template/**/*'
|
||||||
|
|
||||||
|
runtime:
|
||||||
|
- '**/runtime/**/*'
|
||||||
|
- 'v2/internal/runtime/**/*'
|
||||||
|
- 'v3/internal/runtime/**/*'
|
||||||
|
|
||||||
|
bindings:
|
||||||
|
- 'v2/internal/binding/**/*'
|
||||||
|
- 'v3/internal/generator/**/*'
|
||||||
|
|
||||||
144
.github/issue-labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
# Version labels
|
||||||
|
v2-only:
|
||||||
|
- '\[v2\]'
|
||||||
|
- '\(v2\)'
|
||||||
|
- 'v2:'
|
||||||
|
- 'version 2'
|
||||||
|
- 'wails v2'
|
||||||
|
- 'using v2'
|
||||||
|
- 'master branch'
|
||||||
|
|
||||||
|
v3-alpha:
|
||||||
|
- '\[v3\]'
|
||||||
|
- '\(v3\)'
|
||||||
|
- 'v3:'
|
||||||
|
- '\[v3-alpha\]'
|
||||||
|
- '\(v3-alpha\)'
|
||||||
|
- 'version 3'
|
||||||
|
- 'wails v3'
|
||||||
|
- 'using v3'
|
||||||
|
- 'v3-alpha branch'
|
||||||
|
|
||||||
|
# Component labels
|
||||||
|
webview2:
|
||||||
|
- 'webview2'
|
||||||
|
- 'windows'
|
||||||
|
- 'microsoft edge'
|
||||||
|
- 'edge browser'
|
||||||
|
- 'IE'
|
||||||
|
- 'Explorer'
|
||||||
|
- 'browser crashes'
|
||||||
|
|
||||||
|
macos:
|
||||||
|
- 'macOS'
|
||||||
|
- 'mac OS'
|
||||||
|
- 'OS X'
|
||||||
|
- 'darwin'
|
||||||
|
- 'cocoa'
|
||||||
|
- 'Safari'
|
||||||
|
- 'Catalyst'
|
||||||
|
- 'Ventura'
|
||||||
|
- 'Sonoma'
|
||||||
|
- 'apple'
|
||||||
|
|
||||||
|
linux:
|
||||||
|
- 'linux'
|
||||||
|
- 'ubuntu'
|
||||||
|
- 'debian'
|
||||||
|
- 'fedora'
|
||||||
|
- 'gtk'
|
||||||
|
- 'webkitgtk'
|
||||||
|
- 'webkit2gtk'
|
||||||
|
- 'gnome'
|
||||||
|
- 'x11'
|
||||||
|
- 'wayland'
|
||||||
|
|
||||||
|
cli:
|
||||||
|
- 'cli'
|
||||||
|
- 'command line'
|
||||||
|
- 'wails doctor'
|
||||||
|
- 'wails init'
|
||||||
|
- 'wails build'
|
||||||
|
- 'wails dev'
|
||||||
|
- 'template'
|
||||||
|
- 'scaffolding'
|
||||||
|
|
||||||
|
# Type labels
|
||||||
|
bug:
|
||||||
|
- 'bug'
|
||||||
|
- 'crash'
|
||||||
|
- 'broken'
|
||||||
|
- 'failure'
|
||||||
|
- 'error'
|
||||||
|
- 'failed'
|
||||||
|
- 'panic'
|
||||||
|
- 'segfault'
|
||||||
|
- 'issue'
|
||||||
|
- 'not working'
|
||||||
|
- 'problem'
|
||||||
|
|
||||||
|
enhancement:
|
||||||
|
- 'feature'
|
||||||
|
- 'enhancement'
|
||||||
|
- 'request'
|
||||||
|
- 'add'
|
||||||
|
- 'new'
|
||||||
|
- 'improve'
|
||||||
|
- 'functionality'
|
||||||
|
- 'support for'
|
||||||
|
- 'please add'
|
||||||
|
- 'would be nice'
|
||||||
|
|
||||||
|
documentation:
|
||||||
|
- 'docs'
|
||||||
|
- 'documentation'
|
||||||
|
- 'readme'
|
||||||
|
- 'example'
|
||||||
|
- 'tutorial'
|
||||||
|
- 'guide'
|
||||||
|
- 'explanation'
|
||||||
|
- 'clarification'
|
||||||
|
- 'instructions'
|
||||||
|
|
||||||
|
security:
|
||||||
|
- 'security'
|
||||||
|
- 'vulnerability'
|
||||||
|
- 'exploit'
|
||||||
|
- 'hack'
|
||||||
|
- 'CVE'
|
||||||
|
- 'secure'
|
||||||
|
- 'encryption'
|
||||||
|
- 'hardening'
|
||||||
|
|
||||||
|
performance:
|
||||||
|
- 'performance'
|
||||||
|
- 'slow'
|
||||||
|
- 'speed'
|
||||||
|
- 'memory leak'
|
||||||
|
- 'cpu usage'
|
||||||
|
- 'high memory'
|
||||||
|
- 'lag'
|
||||||
|
- 'freeze'
|
||||||
|
- 'optimization'
|
||||||
|
|
||||||
|
# Priority labels
|
||||||
|
high-priority:
|
||||||
|
- 'urgent'
|
||||||
|
- 'critical'
|
||||||
|
- 'security'
|
||||||
|
- 'high priority'
|
||||||
|
- 'important'
|
||||||
|
- 'production'
|
||||||
|
- 'blocker'
|
||||||
|
- 'blocking'
|
||||||
|
|
||||||
|
question:
|
||||||
|
- 'how to'
|
||||||
|
- 'how do i'
|
||||||
|
- 'can I'
|
||||||
|
- 'is it possible'
|
||||||
|
- 'question'
|
||||||
|
- 'help me'
|
||||||
|
- 'need help'
|
||||||
|
- 'assistance'
|
||||||
|
- 'confused'
|
||||||
25
.github/pull_request_template.md
vendored
|
|
@ -1,9 +1,20 @@
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
READ CAREFULLY: Before submitting your PR, please ensure you have created an issue for your PR.
|
|
||||||
It is essential that you do this so that we can discuss the proposed changes before you spend time on them.
|
*********************************************************************
|
||||||
If you do not create an issue, your PR may be rejected without review.
|
* PLEASE READ BEFORE SUBMITTING YOUR PR *
|
||||||
If a relevant issue already exists, please reference it in your PR by including `Fixes #<issue number>` in your PR description.
|
* YOUR PR MAY BE REJECTED IF IT DOES NOT FOLLOW THESE STEPS *
|
||||||
|
*********************************************************************
|
||||||
|
|
||||||
|
- *DO NOT* submit bugs for a source install of v3, ONLY tagged versions, e.g. v3.0.0-alpha.11
|
||||||
|
- *DO NOT* submit PRs for v3 alpha enhancements, unless you have opened a post on the discord channel.
|
||||||
|
All enhancements must be discussed first.
|
||||||
|
The feedback guide for v3 is here: https://v3alpha.wails.io/getting-started/feedback/
|
||||||
|
|
||||||
|
- Before submitting your PR, please ensure you have created and linked the PR to an issue.
|
||||||
|
- If a relevant issue already exists, please reference it in your PR by including `Fixes #<issue number>` in your PR description.
|
||||||
|
- Please fill in the checklists.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
@ -14,7 +25,7 @@ Fixes # (issue)
|
||||||
|
|
||||||
## Type of change
|
## Type of change
|
||||||
|
|
||||||
Please delete options that are not relevant.
|
Please select the option that is relevant.
|
||||||
|
|
||||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
- [ ] New feature (non-breaking change which adds functionality)
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
|
|
@ -29,13 +40,15 @@ Please describe the tests that you ran to verify your changes. Provide instructi
|
||||||
- [ ] macOS
|
- [ ] macOS
|
||||||
- [ ] Linux
|
- [ ] Linux
|
||||||
|
|
||||||
|
If you checked Linux, please specify the distro and version.
|
||||||
|
|
||||||
## Test Configuration
|
## Test Configuration
|
||||||
|
|
||||||
Please paste the output of `wails doctor`. If you are unable to run this command, please describe your environment in as much detail as possible.
|
Please paste the output of `wails doctor`. If you are unable to run this command, please describe your environment in as much detail as possible.
|
||||||
|
|
||||||
# Checklist:
|
# Checklist:
|
||||||
|
|
||||||
- [ ] I have updated `website/src/pages/changelog.mdx` with details of this PR
|
- [ ] I have updated `v3/UNRELEASED_CHANGELOG.md` with details of this PR
|
||||||
- [ ] My code follows the general coding style of this project
|
- [ ] My code follows the general coding style of this project
|
||||||
- [ ] I have performed a self-review of my own code
|
- [ ] I have performed a self-review of my own code
|
||||||
- [ ] I have commented my code, particularly in hard-to-understand areas
|
- [ ] I have commented my code, particularly in hard-to-understand areas
|
||||||
|
|
|
||||||
26
.github/stale.yml
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
# Number of days of inactivity before an issue becomes stale
|
# Number of days of inactivity before an issue becomes stale
|
||||||
daysUntilStale: 30
|
daysUntilStale: 45
|
||||||
# Number of days of inactivity before a stale issue is closed
|
# Number of days of inactivity before a stale issue is closed
|
||||||
daysUntilClose: 7
|
daysUntilClose: 10
|
||||||
# Issues with these labels will never be considered stale
|
# Issues with these labels will never be considered stale
|
||||||
exemptLabels:
|
exemptLabels:
|
||||||
- pinned
|
- pinned
|
||||||
|
|
@ -9,14 +9,28 @@ exemptLabels:
|
||||||
- onhold
|
- onhold
|
||||||
- inprogress
|
- inprogress
|
||||||
- "Selected For Development"
|
- "Selected For Development"
|
||||||
|
- bug
|
||||||
|
- enhancement
|
||||||
|
- v3-alpha
|
||||||
|
- high-priority
|
||||||
# Label to use when marking an issue as stale
|
# Label to use when marking an issue as stale
|
||||||
staleLabel: "Wont Fix"
|
staleLabel: "stale"
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
markComment: >
|
markComment: >
|
||||||
This issue has been automatically marked as stale because it has not had
|
This issue has been automatically marked as stale because it has not had
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
recent activity. It will be closed if no further activity occurs within the next 10 days.
|
||||||
for your contributions.
|
|
||||||
|
If this issue is still relevant, please add a comment to keep it open.
|
||||||
|
Thank you for your contributions.
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
closeComment: false
|
closeComment: >
|
||||||
|
This issue has been automatically closed due to lack of activity.
|
||||||
|
Please feel free to reopen it if it's still relevant.
|
||||||
exemptMilestones: true
|
exemptMilestones: true
|
||||||
exemptAssignees: true
|
exemptAssignees: true
|
||||||
|
# Only mark issues (not PRs)
|
||||||
|
only: issues
|
||||||
|
# Exempt issues created before a certain date
|
||||||
|
exemptCreatedBefore: "2024-01-01T00:00:00Z"
|
||||||
|
# Starts checking issues only after the specified date
|
||||||
|
startDate: "2025-06-01T00:00:00Z"
|
||||||
|
|
|
||||||
33
.github/workflows/auto-label-issues.yml
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
name: Auto Label Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened, edited, reopened]
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, edited, reopened, synchronize]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-label:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Label issues and PRs by content
|
||||||
|
uses: github/issue-labeler@v3.4
|
||||||
|
with:
|
||||||
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
configuration-path: .github/issue-labeler.yml
|
||||||
|
enable-versioned-regex: 0
|
||||||
|
include-title: 1
|
||||||
|
|
||||||
|
- name: Label issues and PRs by file paths
|
||||||
|
uses: actions/labeler@v4
|
||||||
|
with:
|
||||||
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
configuration-path: .github/file-labeler.yml
|
||||||
|
sync-labels: true
|
||||||
373
.github/workflows/automated-releases.yml
vendored
Normal file
|
|
@ -0,0 +1,373 @@
|
||||||
|
name: Automated Nightly Releases
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force_release:
|
||||||
|
description: 'Force release even if no changes detected'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
dry_run:
|
||||||
|
description: 'Run in dry-run mode (no actual releases)'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
# schedule:
|
||||||
|
# Run at 2 AM UTC every day - DISABLED for safety until ready
|
||||||
|
# - cron: '0 2 * * *'
|
||||||
|
|
||||||
|
env:
|
||||||
|
GO_VERSION: '1.24'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-permissions:
|
||||||
|
name: Check Release Permissions
|
||||||
|
permissions: {}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
authorized: ${{ steps.check.outputs.authorized }}
|
||||||
|
steps:
|
||||||
|
- name: Check if user is authorized for releases
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
# Only allow specific users to trigger releases
|
||||||
|
AUTHORIZED_USERS="leaanthony"
|
||||||
|
|
||||||
|
if [[ "$AUTHORIZED_USERS" == *"${{ github.actor }}"* ]]; then
|
||||||
|
echo "✅ User ${{ github.actor }} is authorized for releases"
|
||||||
|
echo "authorized=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "❌ User ${{ github.actor }} is not authorized for releases"
|
||||||
|
echo "authorized=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
detect-v2-changes:
|
||||||
|
name: Detect v2 Changes
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: check-permissions
|
||||||
|
if: needs.check-permissions.outputs.authorized == 'true'
|
||||||
|
outputs:
|
||||||
|
has_changes: ${{ steps.changes.outputs.has_changes }}
|
||||||
|
commits_since_last: ${{ steps.changes.outputs.commits_since_last }}
|
||||||
|
last_release_tag: ${{ steps.changes.outputs.last_release_tag }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Check for v2 changes since last release
|
||||||
|
id: changes
|
||||||
|
run: |
|
||||||
|
echo "🔍 Checking for v2 changes since last release..."
|
||||||
|
|
||||||
|
# Find the last v2 release tag
|
||||||
|
LAST_TAG=$(git tag -l "v2.*" --sort=-version:refname | head -n 1)
|
||||||
|
if [ -z "$LAST_TAG" ]; then
|
||||||
|
echo "No previous v2 tags found, assuming first release"
|
||||||
|
LAST_TAG=$(git rev-list --max-parents=0 HEAD)
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "commits_since_last=999" >> $GITHUB_OUTPUT
|
||||||
|
echo "last_release_tag=none" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Last v2 release tag: $LAST_TAG"
|
||||||
|
echo "last_release_tag=$LAST_TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Count commits since last release affecting v2 or root files
|
||||||
|
COMMITS_COUNT=$(git rev-list --count ${LAST_TAG}..HEAD -- v2/ website/ README.md CHANGELOG.md || echo "0")
|
||||||
|
echo "Commits since last v2 release: $COMMITS_COUNT"
|
||||||
|
echo "commits_since_last=$COMMITS_COUNT" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
if [ "$COMMITS_COUNT" -gt 0 ] || [ "${{ github.event.inputs.force_release }}" == "true" ]; then
|
||||||
|
echo "✅ Changes detected or forced release"
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "ℹ️ No changes detected since last release"
|
||||||
|
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
detect-v3-changes:
|
||||||
|
name: Detect v3-alpha Changes
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: check-permissions
|
||||||
|
if: needs.check-permissions.outputs.authorized == 'true'
|
||||||
|
outputs:
|
||||||
|
has_changes: ${{ steps.changes.outputs.has_changes }}
|
||||||
|
commits_since_last: ${{ steps.changes.outputs.commits_since_last }}
|
||||||
|
last_release_tag: ${{ steps.changes.outputs.last_release_tag }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout v3-alpha branch
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: v3-alpha
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Check for v3-alpha changes since last release
|
||||||
|
id: changes
|
||||||
|
run: |
|
||||||
|
echo "🔍 Checking for v3-alpha changes since last release..."
|
||||||
|
|
||||||
|
# Find the last v3 alpha release tag
|
||||||
|
LAST_TAG=$(git tag -l "v3.*-alpha.*" --sort=-version:refname | head -n 1)
|
||||||
|
if [ -z "$LAST_TAG" ]; then
|
||||||
|
echo "No previous v3-alpha tags found, assuming first release"
|
||||||
|
LAST_TAG=$(git rev-list --max-parents=0 HEAD)
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "commits_since_last=999" >> $GITHUB_OUTPUT
|
||||||
|
echo "last_release_tag=none" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Last v3-alpha release tag: $LAST_TAG"
|
||||||
|
echo "last_release_tag=$LAST_TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Count commits since last release affecting v3 or docs
|
||||||
|
COMMITS_COUNT=$(git rev-list --count ${LAST_TAG}..HEAD -- v3/ docs/ || echo "0")
|
||||||
|
echo "Commits since last v3-alpha release: $COMMITS_COUNT"
|
||||||
|
echo "commits_since_last=$COMMITS_COUNT" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
if [ "$COMMITS_COUNT" -gt 0 ] || [ "${{ github.event.inputs.force_release }}" == "true" ]; then
|
||||||
|
echo "✅ Changes detected or forced release"
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "ℹ️ No changes detected since last release"
|
||||||
|
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
release-v2:
|
||||||
|
name: Create v2 Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [check-permissions, detect-v2-changes]
|
||||||
|
if: |
|
||||||
|
needs.check-permissions.outputs.authorized == 'true' &&
|
||||||
|
needs.detect-v2-changes.outputs.has_changes == 'true'
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.release.outputs.version }}
|
||||||
|
release_notes: ${{ steps.release.outputs.release_notes }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
|
- name: Run v2 release script and extract notes
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
echo "🚀 Running v2 release script..."
|
||||||
|
cd v2/tools/release
|
||||||
|
|
||||||
|
# Run release script and capture output
|
||||||
|
RELEASE_OUTPUT=$(go run release.go 2>&1)
|
||||||
|
echo "$RELEASE_OUTPUT"
|
||||||
|
|
||||||
|
# Extract version from output or version file
|
||||||
|
NEW_VERSION=$(cat ../../cmd/wails/internal/version.txt)
|
||||||
|
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Extract release notes from delimited output
|
||||||
|
RELEASE_NOTES=$(echo "$RELEASE_OUTPUT" | sed -n '/=== RELEASE NOTES FOR/,/=== END RELEASE NOTES ===/p' | sed '1d;$d')
|
||||||
|
|
||||||
|
# Save release notes to file for multiline output
|
||||||
|
echo "$RELEASE_NOTES" > ../../../release_notes_v2.md
|
||||||
|
|
||||||
|
# Set output (escape for GitHub Actions)
|
||||||
|
{
|
||||||
|
echo "release_notes<<EOF"
|
||||||
|
echo "$RELEASE_NOTES"
|
||||||
|
echo "EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "✅ v2 release script completed - version: $NEW_VERSION"
|
||||||
|
|
||||||
|
- name: Create v2 git tag and release
|
||||||
|
if: github.event.inputs.dry_run != 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.release.outputs.version }}"
|
||||||
|
echo "📝 Creating v2 release: $VERSION"
|
||||||
|
|
||||||
|
# Configure git
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
|
# Commit the changelog changes
|
||||||
|
git add website/src/pages/changelog.mdx v2/cmd/wails/internal/version.txt
|
||||||
|
git commit -m "chore: release $VERSION
|
||||||
|
|
||||||
|
Automated release created by GitHub Actions
|
||||||
|
|
||||||
|
🤖 Generated with [Claude Code](https://claude.ai/code)
|
||||||
|
|
||||||
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
||||||
|
|
||||||
|
# Create and push tag
|
||||||
|
git tag -a "$VERSION" -m "Release $VERSION"
|
||||||
|
git push origin master
|
||||||
|
git push origin "$VERSION"
|
||||||
|
|
||||||
|
# Create GitHub release with notes
|
||||||
|
gh release create "$VERSION" \
|
||||||
|
--title "Release $VERSION" \
|
||||||
|
--notes-file release_notes_v2.md \
|
||||||
|
--target master
|
||||||
|
|
||||||
|
- name: Log dry-run results for v2
|
||||||
|
if: github.event.inputs.dry_run == 'true'
|
||||||
|
run: |
|
||||||
|
echo "🧪 DRY RUN - Would have created v2 release:"
|
||||||
|
echo "Version: ${{ steps.release.outputs.version }}"
|
||||||
|
echo "Release Notes:"
|
||||||
|
cat release_notes_v2.md
|
||||||
|
|
||||||
|
release-v3:
|
||||||
|
name: Create v3-alpha Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [check-permissions, detect-v3-changes]
|
||||||
|
if: |
|
||||||
|
needs.check-permissions.outputs.authorized == 'true' &&
|
||||||
|
needs.detect-v3-changes.outputs.has_changes == 'true'
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.release.outputs.version }}
|
||||||
|
release_notes: ${{ steps.release.outputs.release_notes }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout v3-alpha branch
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: v3-alpha
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
|
- name: Run v3 release script and extract notes
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
echo "🚀 Running v3-alpha release script..."
|
||||||
|
cd v3/tasks/release
|
||||||
|
|
||||||
|
# Run release script and capture output
|
||||||
|
RELEASE_OUTPUT=$(go run release.go 2>&1)
|
||||||
|
echo "$RELEASE_OUTPUT"
|
||||||
|
|
||||||
|
# Extract version from output or version file
|
||||||
|
NEW_VERSION=$(cat ../../internal/version/version.txt)
|
||||||
|
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Extract release notes from delimited output
|
||||||
|
RELEASE_NOTES=$(echo "$RELEASE_OUTPUT" | sed -n '/=== RELEASE NOTES FOR/,/=== END RELEASE NOTES ===/p' | sed '1d;$d')
|
||||||
|
|
||||||
|
# Save release notes to file for multiline output
|
||||||
|
echo "$RELEASE_NOTES" > ../../../release_notes_v3.md
|
||||||
|
|
||||||
|
# Set output (escape for GitHub Actions)
|
||||||
|
{
|
||||||
|
echo "release_notes<<EOF"
|
||||||
|
echo "$RELEASE_NOTES"
|
||||||
|
echo "EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "✅ v3-alpha release script completed - version: $NEW_VERSION"
|
||||||
|
|
||||||
|
- name: Create v3-alpha git tag and release
|
||||||
|
if: github.event.inputs.dry_run != 'true'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.release.outputs.version }}"
|
||||||
|
echo "📝 Creating v3-alpha release: $VERSION"
|
||||||
|
|
||||||
|
# Configure git
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
|
# Commit the changelog changes
|
||||||
|
git add docs/src/content/docs/changelog.mdx v3/internal/version/version.txt
|
||||||
|
git commit -m "chore: release $VERSION
|
||||||
|
|
||||||
|
Automated v3-alpha release created by GitHub Actions
|
||||||
|
|
||||||
|
🤖 Generated with [Claude Code](https://claude.ai/code)
|
||||||
|
|
||||||
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
||||||
|
|
||||||
|
# Create and push tag
|
||||||
|
git tag -a "$VERSION" -m "Release $VERSION"
|
||||||
|
git push origin v3-alpha
|
||||||
|
git push origin "$VERSION"
|
||||||
|
|
||||||
|
# Create GitHub release with notes
|
||||||
|
gh release create "$VERSION" \
|
||||||
|
--title "Release $VERSION" \
|
||||||
|
--notes-file release_notes_v3.md \
|
||||||
|
--target v3-alpha \
|
||||||
|
--prerelease
|
||||||
|
|
||||||
|
- name: Log dry-run results for v3-alpha
|
||||||
|
if: github.event.inputs.dry_run == 'true'
|
||||||
|
run: |
|
||||||
|
echo "🧪 DRY RUN - Would have created v3-alpha release:"
|
||||||
|
echo "Version: ${{ steps.release.outputs.version }}"
|
||||||
|
echo "Release Notes:"
|
||||||
|
cat release_notes_v3.md
|
||||||
|
|
||||||
|
summary:
|
||||||
|
name: Release Summary
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [check-permissions, detect-v2-changes, detect-v3-changes, release-v2, release-v3]
|
||||||
|
if: always() && needs.check-permissions.outputs.authorized == 'true'
|
||||||
|
steps:
|
||||||
|
- name: Create release summary
|
||||||
|
run: |
|
||||||
|
echo "# 🚀 Automated Release Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Repository**: ${{ github.repository }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Triggered by**: ${{ github.actor }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Dry Run Mode**: ${{ github.event.inputs.dry_run || 'false' }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
# v2 Summary
|
||||||
|
echo "## v2 Release" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [ "${{ needs.detect-v2-changes.outputs.has_changes }}" == "true" ]; then
|
||||||
|
if [ "${{ needs.release-v2.result }}" == "success" ]; then
|
||||||
|
echo "✅ **v2 Release**: Created successfully" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Version: ${{ needs.release-v2.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Commits since last: ${{ needs.detect-v2-changes.outputs.commits_since_last }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **v2 Release**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⏭️ **v2 Release**: Skipped (no changes)" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Commits since last: ${{ needs.detect-v2-changes.outputs.commits_since_last }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
# v3 Summary
|
||||||
|
echo "## v3-alpha Release" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [ "${{ needs.detect-v3-changes.outputs.has_changes }}" == "true" ]; then
|
||||||
|
if [ "${{ needs.release-v3.result }}" == "success" ]; then
|
||||||
|
echo "✅ **v3-alpha Release**: Created successfully" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Version: ${{ needs.release-v3.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Commits since last: ${{ needs.detect-v3-changes.outputs.commits_since_last }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **v3-alpha Release**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⏭️ **v3-alpha Release**: Skipped (no changes)" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Commits since last: ${{ needs.detect-v3-changes.outputs.commits_since_last }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "---" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "🤖 **Automated Release System** | Generated with [Claude Code](https://claude.ai/code)" >> $GITHUB_STEP_SUMMARY
|
||||||
315
.github/workflows/build-and-test-v3.yml
vendored
Normal file
|
|
@ -0,0 +1,315 @@
|
||||||
|
name: Build + Test v3
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened, ready_for_review]
|
||||||
|
branches:
|
||||||
|
- v3-alpha
|
||||||
|
pull_request_review:
|
||||||
|
types: [submitted]
|
||||||
|
branches:
|
||||||
|
- v3-alpha
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_approval:
|
||||||
|
name: Check PR Approval
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.base_ref == 'v3-alpha'
|
||||||
|
outputs:
|
||||||
|
approved: ${{ steps.check.outputs.approved }}
|
||||||
|
steps:
|
||||||
|
- name: Check if PR is approved
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.event.review.state }}" == "approved" || "${{ github.event.pull_request.approved }}" == "true" ]]; then
|
||||||
|
echo "approved=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "approved=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
test_js:
|
||||||
|
name: Run JS Tests
|
||||||
|
needs: check_approval
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.base_ref == 'v3-alpha'
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.x]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npx --yes esbuild@latest --version
|
||||||
|
|
||||||
|
- name: Clean build artifacts
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: npm run clean
|
||||||
|
|
||||||
|
- name: Type-check runtime
|
||||||
|
working-directory: v3
|
||||||
|
run: task runtime:check
|
||||||
|
|
||||||
|
- name: Test runtime
|
||||||
|
working-directory: v3
|
||||||
|
run: task runtime:test
|
||||||
|
|
||||||
|
- name: Check that the bundled runtime builds
|
||||||
|
working-directory: v3
|
||||||
|
run: task runtime:build
|
||||||
|
|
||||||
|
- name: Check that the npm package builds
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Pack runtime for template tests
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: npm pack
|
||||||
|
|
||||||
|
- name: Store runtime build artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: runtime-build-artifacts
|
||||||
|
path: |
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/dist/
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/types/
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.tsbuildinfo
|
||||||
|
|
||||||
|
- name: Store runtime package
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: runtime-package
|
||||||
|
path: v3/internal/runtime/desktop/@wailsio/runtime/*.tgz
|
||||||
|
|
||||||
|
test_go:
|
||||||
|
name: Run Go Tests v3
|
||||||
|
needs: [check_approval, test_js]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
if: github.base_ref == 'v3-alpha'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [windows-latest, ubuntu-latest, macos-latest]
|
||||||
|
go-version: [1.24]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install linux dependencies (GTK3)
|
||||||
|
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
with:
|
||||||
|
packages: libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config xvfb x11-xserver-utils at-spi2-core xdg-desktop-portal-gtk
|
||||||
|
version: 1.0
|
||||||
|
|
||||||
|
- name: Install linux dependencies (GTK4)
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libgtk-4-dev libwebkitgtk-6.0-dev
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ matrix.go-version }}
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: "v3/go.sum"
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Retrieve runtime build artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: runtime-build-artifacts
|
||||||
|
path: v3/internal/runtime/desktop/@wailsio/runtime/
|
||||||
|
|
||||||
|
- name: Build Examples (GTK3 default)
|
||||||
|
working-directory: v3
|
||||||
|
run: |
|
||||||
|
echo "Starting example compilation tests (GTK3)..."
|
||||||
|
task test:examples
|
||||||
|
echo "Example compilation tests (GTK3) completed successfully"
|
||||||
|
|
||||||
|
- name: Build Examples (GTK4)
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
working-directory: v3
|
||||||
|
run: |
|
||||||
|
echo "Starting example compilation tests (GTK4)..."
|
||||||
|
BUILD_TAGS=gtk4 task test:examples
|
||||||
|
echo "Example compilation tests (GTK4) completed successfully"
|
||||||
|
|
||||||
|
- name: Run tests (mac)
|
||||||
|
if: matrix.os == 'macos-latest'
|
||||||
|
env:
|
||||||
|
CGO_LDFLAGS: -framework UniformTypeIdentifiers -mmacosx-version-min=10.13
|
||||||
|
working-directory: v3
|
||||||
|
run: go test -v ./...
|
||||||
|
|
||||||
|
- name: Run tests (windows)
|
||||||
|
if: matrix.os == 'windows-latest'
|
||||||
|
working-directory: v3
|
||||||
|
run: go test -v ./...
|
||||||
|
|
||||||
|
- name: Run tests (ubuntu) - GTK3 default
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
working-directory: v3
|
||||||
|
run: >
|
||||||
|
xvfb-run --auto-servernum
|
||||||
|
sh -c '
|
||||||
|
dbus-update-activation-environment --systemd --all &&
|
||||||
|
go test -v ./...
|
||||||
|
'
|
||||||
|
|
||||||
|
- name: Run tests (ubuntu) - GTK4
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
working-directory: v3
|
||||||
|
# Skip service tests that hang in CI due to GTK4 display requirements
|
||||||
|
run: >
|
||||||
|
xvfb-run --auto-servernum
|
||||||
|
sh -c '
|
||||||
|
dbus-update-activation-environment --systemd --all &&
|
||||||
|
go test -tags gtk4 -v -skip "TestService" ./...
|
||||||
|
'
|
||||||
|
|
||||||
|
- name: Typecheck binding generator output
|
||||||
|
working-directory: v3
|
||||||
|
run: task generator:test:check
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
name: Cleanup build artifacts
|
||||||
|
if: always()
|
||||||
|
needs: [test_js, test_go, test_templates]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: geekyeggo/delete-artifact@v5
|
||||||
|
with:
|
||||||
|
name: |
|
||||||
|
runtime-build-artifacts
|
||||||
|
runtime-package
|
||||||
|
failOnError: false
|
||||||
|
|
||||||
|
test_templates:
|
||||||
|
name: Test Templates
|
||||||
|
needs: [test_js, test_go]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
if: github.base_ref == 'v3-alpha'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
|
template:
|
||||||
|
- svelte
|
||||||
|
- svelte-ts
|
||||||
|
- vue
|
||||||
|
- vue-ts
|
||||||
|
- react
|
||||||
|
- react-ts
|
||||||
|
- preact
|
||||||
|
- preact-ts
|
||||||
|
- lit
|
||||||
|
- lit-ts
|
||||||
|
- vanilla
|
||||||
|
- vanilla-ts
|
||||||
|
go-version: [1.24]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install linux dependencies (GTK3)
|
||||||
|
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
with:
|
||||||
|
packages: libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config
|
||||||
|
version: 1.0
|
||||||
|
|
||||||
|
- name: Install linux dependencies (GTK4)
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libgtk-4-dev libwebkitgtk-6.0-dev
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ matrix.go-version }}
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: "v3/go.sum"
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build Wails3 CLI
|
||||||
|
working-directory: v3
|
||||||
|
run: |
|
||||||
|
task install
|
||||||
|
wails3 doctor
|
||||||
|
|
||||||
|
- name: Download runtime package
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: runtime-package
|
||||||
|
path: wails-runtime-temp
|
||||||
|
|
||||||
|
- name: Generate template '${{ matrix.template }}' (GTK3 default)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# Get absolute path - use pwd -W on Windows for native paths, pwd elsewhere
|
||||||
|
if [[ "$RUNNER_OS" == "Windows" ]]; then
|
||||||
|
RUNTIME_TGZ="$(cd wails-runtime-temp && pwd -W)/$(ls wails-runtime-temp/*.tgz | xargs basename)"
|
||||||
|
else
|
||||||
|
RUNTIME_TGZ="$(cd wails-runtime-temp && pwd)/$(ls wails-runtime-temp/*.tgz | xargs basename)"
|
||||||
|
fi
|
||||||
|
mkdir -p ./test-${{ matrix.template }}
|
||||||
|
cd ./test-${{ matrix.template }}
|
||||||
|
wails3 init -n ${{ matrix.template }} -t ${{ matrix.template }}
|
||||||
|
cd ${{ matrix.template }}/frontend
|
||||||
|
# Replace @wailsio/runtime version with local tarball
|
||||||
|
npm pkg set dependencies.@wailsio/runtime="file://$RUNTIME_TGZ"
|
||||||
|
cd ..
|
||||||
|
wails3 build
|
||||||
|
|
||||||
|
# GTK4 template builds are covered by the Go example compilation tests above.
|
||||||
|
|
||||||
|
build_results:
|
||||||
|
if: ${{ always() }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: v3 Build Results
|
||||||
|
needs: [test_go, test_js, test_templates]
|
||||||
|
steps:
|
||||||
|
- run: |
|
||||||
|
go_result="${{ needs.test_go.result }}"
|
||||||
|
js_result="${{ needs.test_js.result }}"
|
||||||
|
templates_result="${{ needs.test_templates.result }}"
|
||||||
|
|
||||||
|
if [[ $go_result == "success" || $go_result == "skipped" ]] && \
|
||||||
|
[[ $js_result == "success" || $js_result == "skipped" ]] && \
|
||||||
|
[[ $templates_result == "success" || $templates_result == "skipped" ]]; then
|
||||||
|
echo "All required jobs succeeded or were skipped"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "One or more required jobs failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
4
.github/workflows/build-and-test.yml
vendored
|
|
@ -28,7 +28,7 @@ jobs:
|
||||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
if: matrix.os == 'ubuntu-24.04'
|
if: matrix.os == 'ubuntu-24.04'
|
||||||
with:
|
with:
|
||||||
packages: libgtk-3-dev libwebkit2gtk-4.1-dev build-essential pkg-config
|
packages: libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config
|
||||||
version: 1.0
|
version: 1.0
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
|
|
@ -126,7 +126,7 @@ jobs:
|
||||||
|
|
||||||
- name: Install linux dependencies ( 24.04 )
|
- name: Install linux dependencies ( 24.04 )
|
||||||
if: matrix.os == 'ubuntu-24.04'
|
if: matrix.os == 'ubuntu-24.04'
|
||||||
run: sudo apt-get update -y && sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev build-essential pkg-config
|
run: sudo apt-get update -y && sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config
|
||||||
|
|
||||||
- name: Generate & Build template '${{ matrix.template }}'
|
- name: Generate & Build template '${{ matrix.template }}'
|
||||||
if: matrix.os != 'ubuntu-24.04'
|
if: matrix.os != 'ubuntu-24.04'
|
||||||
|
|
|
||||||
289
.github/workflows/build-cross-image.yml
vendored
Normal file
|
|
@ -0,0 +1,289 @@
|
||||||
|
name: Build Cross-Compiler Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
branch:
|
||||||
|
description: 'Branch containing Dockerfile'
|
||||||
|
required: true
|
||||||
|
default: 'v3-alpha'
|
||||||
|
sdk_version:
|
||||||
|
description: 'macOS SDK version'
|
||||||
|
required: true
|
||||||
|
default: '14.5'
|
||||||
|
zig_version:
|
||||||
|
description: 'Zig version'
|
||||||
|
required: true
|
||||||
|
default: '0.14.0'
|
||||||
|
image_version:
|
||||||
|
description: 'Image version tag'
|
||||||
|
required: true
|
||||||
|
default: 'latest'
|
||||||
|
skip_tests:
|
||||||
|
description: 'Skip cross-compilation tests'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
type: boolean
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- v3-alpha
|
||||||
|
paths:
|
||||||
|
- 'v3/internal/commands/build_assets/docker/Dockerfile.cross'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: wailsapp/wails-cross
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
outputs:
|
||||||
|
image_tag: ${{ steps.vars.outputs.image_version }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ inputs.branch || github.ref }}
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Log in to Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set build variables
|
||||||
|
id: vars
|
||||||
|
run: |
|
||||||
|
echo "sdk_version=${{ inputs.sdk_version || '14.5' }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "zig_version=${{ inputs.zig_version || '0.14.0' }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "image_version=${{ inputs.image_version || 'latest' }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Extract metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest
|
||||||
|
type=raw,value=${{ steps.vars.outputs.image_version }}
|
||||||
|
type=raw,value=sdk-${{ steps.vars.outputs.sdk_version }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: v3/internal/commands/build_assets/docker
|
||||||
|
file: v3/internal/commands/build_assets/docker/Dockerfile.cross
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: |
|
||||||
|
${{ steps.meta.outputs.labels }}
|
||||||
|
io.wails.zig.version=${{ steps.vars.outputs.zig_version }}
|
||||||
|
io.wails.sdk.version=${{ steps.vars.outputs.sdk_version }}
|
||||||
|
build-args: |
|
||||||
|
ZIG_VERSION=${{ steps.vars.outputs.zig_version }}
|
||||||
|
MACOS_SDK_VERSION=${{ steps.vars.outputs.sdk_version }}
|
||||||
|
cache-from: |
|
||||||
|
type=gha
|
||||||
|
type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache
|
||||||
|
cache-to: |
|
||||||
|
type=gha,mode=max
|
||||||
|
type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache,mode=max
|
||||||
|
|
||||||
|
# Test cross-compilation using wails3 task system (3 parallel jobs)
|
||||||
|
# Runs on Linux/amd64 runner - tests actual cross-compilation only:
|
||||||
|
# - darwin: cross-platform (arm64)
|
||||||
|
# - windows: cross-platform (arm64)
|
||||||
|
# - linux: cross-architecture (arm64 from amd64 runner)
|
||||||
|
test-cross-compile:
|
||||||
|
needs: build
|
||||||
|
if: ${{ inputs.skip_tests != 'true' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# Darwin arm64 (Intel Macs are EOL, skip amd64)
|
||||||
|
- os: darwin
|
||||||
|
arch: arm64
|
||||||
|
expected: "Mach-O 64-bit.*arm64"
|
||||||
|
# Windows - both archs
|
||||||
|
- os: windows
|
||||||
|
arch: amd64
|
||||||
|
expected: "PE32.*x86-64"
|
||||||
|
- os: windows
|
||||||
|
arch: arm64
|
||||||
|
expected: "PE32.*Aarch64"
|
||||||
|
# Linux - both archs via Docker
|
||||||
|
- os: linux
|
||||||
|
arch: amd64
|
||||||
|
expected: "ELF 64-bit LSB.*x86-64"
|
||||||
|
- os: linux
|
||||||
|
arch: arm64
|
||||||
|
expected: "ELF 64-bit LSB.*ARM aarch64"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ inputs.branch || github.ref }}
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.24'
|
||||||
|
cache: false
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install Linux dev dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev
|
||||||
|
|
||||||
|
- name: Install wails3 CLI
|
||||||
|
run: |
|
||||||
|
cd v3
|
||||||
|
go install ./cmd/wails3
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
if: matrix.os == 'linux'
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Log in to Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Pull and tag Docker image
|
||||||
|
run: |
|
||||||
|
# Pull both platform variants and tag them for the task system
|
||||||
|
# The task uses --platform flag which requires matching arch variant
|
||||||
|
IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.build.outputs.image_tag || 'latest' }}"
|
||||||
|
|
||||||
|
# For Linux arm64 test, we need the arm64 variant
|
||||||
|
if [ "${{ matrix.os }}" = "linux" ] && [ "${{ matrix.arch }}" = "arm64" ]; then
|
||||||
|
docker pull --platform linux/arm64 "$IMAGE"
|
||||||
|
docker tag "$IMAGE" wails-cross
|
||||||
|
else
|
||||||
|
docker pull "$IMAGE"
|
||||||
|
docker tag "$IMAGE" wails-cross
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Generate wails3 test project
|
||||||
|
run: |
|
||||||
|
cd /tmp
|
||||||
|
wails3 init -n test-wails-app -t vanilla
|
||||||
|
cd test-wails-app
|
||||||
|
|
||||||
|
# Update replace directive to use absolute path (wails3 init adds relative path)
|
||||||
|
sed -i 's|replace github.com/wailsapp/wails/v3 => .*|replace github.com/wailsapp/wails/v3 => ${{ github.workspace }}/v3|' go.mod
|
||||||
|
|
||||||
|
- name: Cross-compile ${{ matrix.os }}/${{ matrix.arch }} via task
|
||||||
|
run: |
|
||||||
|
cd /tmp/test-wails-app
|
||||||
|
# For Linux, always use docker build to test the Docker image
|
||||||
|
if [ "${{ matrix.os }}" = "linux" ]; then
|
||||||
|
wails3 task linux:build:docker ARCH=${{ matrix.arch }}
|
||||||
|
else
|
||||||
|
wails3 task ${{ matrix.os }}:build ARCH=${{ matrix.arch }}
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Verify binary
|
||||||
|
run: |
|
||||||
|
cd /tmp/test-wails-app/bin
|
||||||
|
ls -la
|
||||||
|
|
||||||
|
if [ "${{ matrix.os }}" = "windows" ]; then
|
||||||
|
BINARY="test-wails-app.exe"
|
||||||
|
else
|
||||||
|
BINARY="test-wails-app"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking: $BINARY"
|
||||||
|
FILE_OUTPUT=$(file "$BINARY")
|
||||||
|
echo " $FILE_OUTPUT"
|
||||||
|
|
||||||
|
if echo "$FILE_OUTPUT" | grep -qE "${{ matrix.expected }}"; then
|
||||||
|
echo " ✅ Cross-compilation verified: ${{ matrix.os }}/${{ matrix.arch }}"
|
||||||
|
else
|
||||||
|
echo " ❌ Format mismatch! Expected: ${{ matrix.expected }}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check library dependencies (Linux only)
|
||||||
|
if: matrix.os == 'linux'
|
||||||
|
run: |
|
||||||
|
cd /tmp/test-wails-app/bin
|
||||||
|
|
||||||
|
echo "## Library Dependencies"
|
||||||
|
echo ""
|
||||||
|
echo "### NEEDED libraries:"
|
||||||
|
readelf -d test-wails-app | grep NEEDED || echo "No dynamic dependencies"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
NEEDED=$(readelf -d test-wails-app | grep NEEDED)
|
||||||
|
MISSING=""
|
||||||
|
for lib in libwebkit2gtk-4.1.so libgtk-3.so libglib-2.0.so libc.so; do
|
||||||
|
if echo "$NEEDED" | grep -q "$lib"; then
|
||||||
|
echo "✅ $lib"
|
||||||
|
else
|
||||||
|
echo "❌ $lib MISSING"
|
||||||
|
MISSING="$MISSING $lib"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$MISSING" ]; then
|
||||||
|
echo "ERROR: Missing required libraries:$MISSING"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Summary job
|
||||||
|
test-summary:
|
||||||
|
needs: [build, test-cross-compile]
|
||||||
|
if: always() && inputs.skip_tests != 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check test results
|
||||||
|
run: |
|
||||||
|
echo "## Cross-Compilation Test Results" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
if [ "${{ needs.test-cross-compile.result }}" = "success" ]; then
|
||||||
|
echo "✅ **All Tests Passed**" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **Some Tests Failed**" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "### Cross-Compilation Tests (from Linux/amd64 runner)" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Target | Status |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "|--------|--------|" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Darwin/arm64 | ✅ |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Windows/amd64 | ✅ |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Windows/arm64 | ✅ |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Linux/amd64 | ✅ |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Linux/arm64 | ✅ |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
# Fail if any test failed
|
||||||
|
if [ "${{ needs.test-cross-compile.result }}" != "success" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "❌ Some tests failed. Check the individual job logs for details."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
74
.github/workflows/changelog-validation-v3.yml
vendored
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
name: Changelog Validation (v3)
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [ v3-alpha ]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
pr_number:
|
||||||
|
description: 'PR number to validate (for manual testing)'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate-changelog:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name == 'pull_request' || github.event.inputs.pr_number
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha || format('refs/pull/{0}/head', github.event.inputs.pr_number) }}
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Get PR information
|
||||||
|
id: pr_info
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
||||||
|
echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "base_ref=${{ github.event.pull_request.base.ref }}" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "pr_number=${{ github.event.inputs.pr_number }}" >> $GITHUB_OUTPUT
|
||||||
|
echo "base_ref=v3-alpha" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check if changelog was modified
|
||||||
|
id: changelog_check
|
||||||
|
run: |
|
||||||
|
git fetch origin ${{ steps.pr_info.outputs.base_ref }}
|
||||||
|
if git diff --name-only origin/${{ steps.pr_info.outputs.base_ref }}..HEAD | grep -q "v3/UNRELEASED_CHANGELOG.md"; then
|
||||||
|
echo "changelog_modified=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "✅ UNRELEASED_CHANGELOG.md was modified in this PR"
|
||||||
|
else
|
||||||
|
echo "changelog_modified=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "⚠️ UNRELEASED_CHANGELOG.md was not modified"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Comment on PR about missing changelog
|
||||||
|
if: steps.changelog_check.outputs.changelog_modified == 'false' && github.event_name == 'pull_request'
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const author = context.payload.pull_request.user.login;
|
||||||
|
const message = '## ⚠️ Missing Changelog Update\n\n' +
|
||||||
|
`Hi @${author}, please update \`v3/UNRELEASED_CHANGELOG.md\` with a description of your changes.\n\n` +
|
||||||
|
'This helps us keep track of changes for the next release.';
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
issue_number: ${{ steps.pr_info.outputs.pr_number }},
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: message
|
||||||
|
});
|
||||||
|
|
||||||
44
.github/workflows/claude-code-review.yml
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
name: Claude Code Review
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, ready_for_review, reopened]
|
||||||
|
# Optional: Only run on specific file changes
|
||||||
|
# paths:
|
||||||
|
# - "src/**/*.ts"
|
||||||
|
# - "src/**/*.tsx"
|
||||||
|
# - "src/**/*.js"
|
||||||
|
# - "src/**/*.jsx"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
claude-review:
|
||||||
|
# Optional: Filter by PR author
|
||||||
|
# if: |
|
||||||
|
# github.event.pull_request.user.login == 'external-contributor' ||
|
||||||
|
# github.event.pull_request.user.login == 'new-developer' ||
|
||||||
|
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
issues: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Run Claude Code Review
|
||||||
|
id: claude-review
|
||||||
|
uses: anthropics/claude-code-action@v1
|
||||||
|
with:
|
||||||
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||||
|
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
|
||||||
|
plugins: 'code-review@claude-code-plugins'
|
||||||
|
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
|
||||||
|
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
||||||
|
# or https://code.claude.com/docs/en/cli-reference for available options
|
||||||
|
|
||||||
50
.github/workflows/claude.yml
vendored
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
name: Claude Code
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
pull_request_review_comment:
|
||||||
|
types: [created]
|
||||||
|
issues:
|
||||||
|
types: [opened, assigned]
|
||||||
|
pull_request_review:
|
||||||
|
types: [submitted]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
claude:
|
||||||
|
if: |
|
||||||
|
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||||
|
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||||
|
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
||||||
|
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
issues: read
|
||||||
|
id-token: write
|
||||||
|
actions: read # Required for Claude to read CI results on PRs
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Run Claude Code
|
||||||
|
id: claude
|
||||||
|
uses: anthropics/claude-code-action@v1
|
||||||
|
with:
|
||||||
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||||
|
|
||||||
|
# This is an optional setting that allows Claude to read CI results on PRs
|
||||||
|
additional_permissions: |
|
||||||
|
actions: read
|
||||||
|
|
||||||
|
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
|
||||||
|
# prompt: 'Update the pull request description to include a summary of changes.'
|
||||||
|
|
||||||
|
# Optional: Add claude_args to customize behavior and configuration
|
||||||
|
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
||||||
|
# or https://code.claude.com/docs/en/cli-reference for available options
|
||||||
|
# claude_args: '--allowed-tools Bash(gh pr:*)'
|
||||||
|
|
||||||
135
.github/workflows/cross-compile-test-v3.yml
vendored
Normal file
|
|
@ -0,0 +1,135 @@
|
||||||
|
name: Cross-Compile Test v3
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_review:
|
||||||
|
types: [submitted]
|
||||||
|
branches:
|
||||||
|
- v3-alpha
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
pr_number:
|
||||||
|
description: 'PR number to test (optional, uses current branch if not specified)'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_approval:
|
||||||
|
name: Check PR Approval
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name == 'workflow_dispatch' || github.event.review.state == 'approved'
|
||||||
|
outputs:
|
||||||
|
approved: ${{ steps.check.outputs.approved }}
|
||||||
|
steps:
|
||||||
|
- name: Check if PR is approved or manual dispatch
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||||
|
echo "Manual dispatch, proceeding with cross-compile tests"
|
||||||
|
else
|
||||||
|
echo "PR approved, proceeding with cross-compile tests"
|
||||||
|
fi
|
||||||
|
echo "approved=true" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
cross_compile:
|
||||||
|
name: Cross-Compile (${{ matrix.target_os }}/${{ matrix.target_arch }})
|
||||||
|
needs: check_approval
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
|
if: needs.check_approval.outputs.approved == 'true'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- target_os: darwin
|
||||||
|
target_arch: arm64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- target_os: darwin
|
||||||
|
target_arch: amd64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- target_os: linux
|
||||||
|
target_arch: arm64
|
||||||
|
runner: ubuntu-24.04-arm # Native ARM64 runner - much faster than QEMU
|
||||||
|
- target_os: linux
|
||||||
|
target_arch: amd64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- target_os: windows
|
||||||
|
target_arch: arm64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- target_os: windows
|
||||||
|
target_arch: amd64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Checkout PR (if specified)
|
||||||
|
if: github.event_name == 'workflow_dispatch' && inputs.pr_number != ''
|
||||||
|
run: gh pr checkout ${{ inputs.pr_number }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.25'
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: "v3/go.sum"
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install Linux dependencies
|
||||||
|
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
|
with:
|
||||||
|
packages: libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config
|
||||||
|
version: 1.0
|
||||||
|
|
||||||
|
- name: Install Wails3 CLI
|
||||||
|
working-directory: v3
|
||||||
|
run: |
|
||||||
|
go install ./cmd/wails3
|
||||||
|
wails3 version
|
||||||
|
|
||||||
|
- name: Create test project
|
||||||
|
run: |
|
||||||
|
mkdir -p test-cross-compile
|
||||||
|
cd test-cross-compile
|
||||||
|
wails3 init -n crosstest -t vanilla
|
||||||
|
|
||||||
|
- name: Setup Docker cross-compile image
|
||||||
|
working-directory: test-cross-compile/crosstest
|
||||||
|
run: task common:setup:docker
|
||||||
|
|
||||||
|
- name: Fix replace directive for Docker build
|
||||||
|
working-directory: test-cross-compile/crosstest
|
||||||
|
run: |
|
||||||
|
# Change the replace directive to use absolute path that matches Docker mount
|
||||||
|
go mod edit -dropreplace github.com/wailsapp/wails/v3
|
||||||
|
go mod edit -replace github.com/wailsapp/wails/v3=${{ github.workspace }}/v3
|
||||||
|
|
||||||
|
- name: Cross-compile for ${{ matrix.target_os }}/${{ matrix.target_arch }}
|
||||||
|
working-directory: test-cross-compile/crosstest
|
||||||
|
run: |
|
||||||
|
echo "Cross-compiling for ${{ matrix.target_os }}/${{ matrix.target_arch }}..."
|
||||||
|
task ${{ matrix.target_os }}:build ARCH=${{ matrix.target_arch }}
|
||||||
|
echo "Cross-compilation successful!"
|
||||||
|
ls -la bin/
|
||||||
|
|
||||||
|
cross_compile_results:
|
||||||
|
if: ${{ always() }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Cross-Compile Results
|
||||||
|
needs: [cross_compile]
|
||||||
|
steps:
|
||||||
|
- run: |
|
||||||
|
result="${{ needs.cross_compile.result }}"
|
||||||
|
echo "Cross-compile result: $result"
|
||||||
|
if [[ $result == "success" || $result == "skipped" ]]; then
|
||||||
|
echo "Cross-compile tests passed (or were skipped)!"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "One or more cross-compile tests failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
9
.github/workflows/generate-sponsor-image.yml
vendored
|
|
@ -29,7 +29,12 @@ jobs:
|
||||||
with:
|
with:
|
||||||
commit-message: "chore: update sponsors.svg"
|
commit-message: "chore: update sponsors.svg"
|
||||||
add-paths: "website/static/img/sponsors.svg"
|
add-paths: "website/static/img/sponsors.svg"
|
||||||
title: Update Sponsor Image
|
title: "chore: update sponsors.svg"
|
||||||
body: Generated new image
|
body: |
|
||||||
|
Auto-generated by the sponsor image workflow
|
||||||
|
|
||||||
|
[skip ci] [skip actions]
|
||||||
branch: update-sponsors
|
branch: update-sponsors
|
||||||
|
base: master
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
|
draft: false
|
||||||
|
|
|
||||||
77
.github/workflows/issue-triage-automation.yml
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
name: Issue Triage Automation
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened, reopened, labeled, unlabeled]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
triage:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
# Request more info for unclear bug reports
|
||||||
|
- name: Request more info
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
if: |
|
||||||
|
contains(github.event.issue.labels.*.name, 'bug') &&
|
||||||
|
!contains(github.event.issue.body, 'wails doctor') &&
|
||||||
|
!contains(github.event.issue.body, 'reproduction')
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: `👋 Thanks for reporting this issue! To help us investigate, could you please:
|
||||||
|
|
||||||
|
1. Add the output of \`wails doctor\` if not already included
|
||||||
|
2. Provide clear steps to reproduce the issue
|
||||||
|
3. If possible, create a minimal reproduction of the issue
|
||||||
|
|
||||||
|
This will help us resolve your issue much faster. Thank you!`
|
||||||
|
});
|
||||||
|
github.rest.issues.addLabels({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
labels: ['awaiting feedback']
|
||||||
|
});
|
||||||
|
|
||||||
|
# Prioritize security issues
|
||||||
|
- name: Prioritize security issues
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
if: contains(github.event.issue.labels.*.name, 'security')
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.addLabels({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
labels: ['high-priority']
|
||||||
|
});
|
||||||
|
|
||||||
|
# Tag version-specific issues for project boards
|
||||||
|
- name: Add to v2 project
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
if: |
|
||||||
|
contains(github.event.issue.labels.*.name, 'v2-only') &&
|
||||||
|
!contains(github.event.issue.labels.*.name, 'v3-alpha')
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
// Replace PROJECT_ID with your actual GitHub project ID
|
||||||
|
// This is a placeholder as the actual implementation would require
|
||||||
|
// GraphQL API calls to add to a project board
|
||||||
|
console.log('Would add to v2 project board');
|
||||||
|
|
||||||
|
# Tag version-specific issues for project boards
|
||||||
|
- name: Add to v3 project
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
if: contains(github.event.issue.labels.*.name, 'v3-alpha')
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
// Replace PROJECT_ID with your actual GitHub project ID
|
||||||
|
// This is a placeholder as the actual implementation would require
|
||||||
|
// GraphQL API calls to add to a project board
|
||||||
|
console.log('Would add to v3 project board');
|
||||||
210
.github/workflows/nightly-release-v3.yml
vendored
Normal file
|
|
@ -0,0 +1,210 @@
|
||||||
|
name: Nightly Release v3-alpha
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 2 * * *' # 2 AM UTC daily
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force_release:
|
||||||
|
description: 'Force release even if no changes detected'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
dry_run:
|
||||||
|
description: 'Run in dry-run mode (no actual release)'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
nightly-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: read
|
||||||
|
actions: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: v3-alpha
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '1.24'
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: 'v3/go.sum'
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Git
|
||||||
|
run: |
|
||||||
|
git config --global user.name "github-actions[bot]"
|
||||||
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
|
# Configure git to use the token for authentication
|
||||||
|
git config --global url."https://x-access-token:${{ secrets.WAILS_REPO_TOKEN || github.token }}@github.com/".insteadOf "https://github.com/"
|
||||||
|
|
||||||
|
- name: Check for existing release tag
|
||||||
|
id: check_tag
|
||||||
|
run: |
|
||||||
|
if git describe --tags --exact-match HEAD 2>/dev/null; then
|
||||||
|
echo "has_tag=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "tag=$(git describe --tags --exact-match HEAD)" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "has_tag=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "tag=" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check for unreleased changelog content
|
||||||
|
id: changelog_check
|
||||||
|
run: |
|
||||||
|
echo "🔍 Checking UNRELEASED_CHANGELOG.md for content..."
|
||||||
|
|
||||||
|
# Run the release script in check mode to see if there's content
|
||||||
|
cd v3/tasks/release
|
||||||
|
|
||||||
|
# Use the release script itself to check for content
|
||||||
|
if go run release.go --check-only 2>/dev/null; then
|
||||||
|
echo "has_unreleased_content=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "✅ Found unreleased changelog content"
|
||||||
|
else
|
||||||
|
echo "has_unreleased_content=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "ℹ️ No unreleased changelog content found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Quick change detection and early exit
|
||||||
|
id: quick_check
|
||||||
|
run: |
|
||||||
|
echo "🔍 Quick check for changes to determine if we should continue..."
|
||||||
|
|
||||||
|
# First check if we have unreleased changelog content
|
||||||
|
if [ "${{ steps.changelog_check.outputs.has_unreleased_content }}" == "true" ]; then
|
||||||
|
echo "✅ Found unreleased changelog content, proceeding with release"
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "reason=Found unreleased changelog content" >> $GITHUB_OUTPUT
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If no unreleased changelog content, check for git changes as fallback
|
||||||
|
echo "No unreleased changelog content found, checking for git changes..."
|
||||||
|
|
||||||
|
# Check if current commit has a release tag
|
||||||
|
if git describe --tags --exact-match HEAD 2>/dev/null; then
|
||||||
|
CURRENT_TAG=$(git describe --tags --exact-match HEAD)
|
||||||
|
echo "Current commit has release tag: $CURRENT_TAG"
|
||||||
|
|
||||||
|
# For tagged commits, check if there are changes since the tag
|
||||||
|
COMMIT_COUNT=$(git rev-list ${CURRENT_TAG}..HEAD --count)
|
||||||
|
if [ "$COMMIT_COUNT" -eq 0 ]; then
|
||||||
|
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "reason=No changes since existing tag $CURRENT_TAG and no unreleased changelog content" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# No current tag, check against latest release
|
||||||
|
LATEST_TAG=$(git tag --list "v3.0.0-alpha.*" | sort -V | tail -1)
|
||||||
|
if [ -z "$LATEST_TAG" ]; then
|
||||||
|
echo "No previous release found, proceeding with release"
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
COMMIT_COUNT=$(git rev-list ${LATEST_TAG}..HEAD --count)
|
||||||
|
if [ "$COMMIT_COUNT" -gt 0 ]; then
|
||||||
|
echo "Found $COMMIT_COUNT commits since $LATEST_TAG"
|
||||||
|
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "should_continue=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "reason=No changes since latest release $LATEST_TAG and no unreleased changelog content" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Early exit - No changes detected
|
||||||
|
if: |
|
||||||
|
steps.quick_check.outputs.should_continue == 'false' &&
|
||||||
|
github.event.inputs.force_release != 'true'
|
||||||
|
run: |
|
||||||
|
echo "🛑 EARLY EXIT: ${{ steps.quick_check.outputs.reason }}"
|
||||||
|
echo ""
|
||||||
|
echo "ℹ️ No changes detected since last release and force_release is not enabled."
|
||||||
|
echo " Workflow will exit early to save resources."
|
||||||
|
echo ""
|
||||||
|
echo " To force a release anyway, run this workflow with 'force_release=true'"
|
||||||
|
echo ""
|
||||||
|
echo "## 🛑 Early Exit Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Reason:** ${{ steps.quick_check.outputs.reason }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Action:** Workflow exited early to save resources" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Force Release:** Set 'force_release=true' to override this behavior" >> $GITHUB_STEP_SUMMARY
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
- name: Continue with release process
|
||||||
|
if: |
|
||||||
|
steps.quick_check.outputs.should_continue == 'true' ||
|
||||||
|
github.event.inputs.force_release == 'true'
|
||||||
|
run: |
|
||||||
|
echo "✅ Proceeding with release process..."
|
||||||
|
if [ "${{ github.event.inputs.force_release }}" == "true" ]; then
|
||||||
|
echo "🔨 FORCE RELEASE: Overriding change detection"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Run release script
|
||||||
|
id: release
|
||||||
|
if: |
|
||||||
|
steps.quick_check.outputs.should_continue == 'true' ||
|
||||||
|
github.event.inputs.force_release == 'true'
|
||||||
|
env:
|
||||||
|
WAILS_REPO_TOKEN: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
run: |
|
||||||
|
cd v3/tasks/release
|
||||||
|
ARGS=()
|
||||||
|
if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then
|
||||||
|
ARGS+=(--dry-run)
|
||||||
|
fi
|
||||||
|
go run release.go "${ARGS[@]}"
|
||||||
|
|
||||||
|
- name: Summary
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then
|
||||||
|
echo "## 🧪 DRY RUN Release Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "## 🚀 Nightly Release Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
echo "================================" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
if [ -n "${{ steps.release.outputs.release_version }}" ]; then
|
||||||
|
echo "- **Version:** ${{ steps.release.outputs.release_version }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Tag:** ${{ steps.release.outputs.release_tag }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Status:** ${{ steps.release.outcome == 'success' && '✅ Success' || '⚠️ Failed' }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- **Mode:** ${{ steps.release.outputs.release_dry_run == 'true' && '🧪 Dry Run' || '🚀 Live release' }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [ -n "${{ steps.release.outputs.release_url }}" ]; then
|
||||||
|
echo "- **Release URL:** ${{ steps.release.outputs.release_url }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "### Changelog" >> $GITHUB_STEP_SUMMARY
|
||||||
|
if [ "${{ steps.changelog_check.outputs.has_unreleased_content }}" == "true" ]; then
|
||||||
|
echo "✅ Unreleased changelog processed and reset." >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "ℹ️ No unreleased changelog content detected." >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "- Release script did not run (skipped or failed before execution)." >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
@ -1,20 +1,23 @@
|
||||||
name: PR Checks
|
name: PR Checks (master)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
pull_request_review:
|
pull_request_review:
|
||||||
types: [submitted]
|
types: [submitted]
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
jobs:
|
jobs:
|
||||||
check_docs:
|
check_docs:
|
||||||
name: Check Docs
|
name: Check Docs
|
||||||
if: ${{github.repository == 'wailsapp/wails' && contains(github.head_ref,'feature/')}}
|
if: ${{github.repository == 'wailsapp/wails' && github.base_ref == 'master'}}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Verify Changed files
|
- name: Verify Changed files
|
||||||
uses: tj-actions/verify-changed-files@v17
|
uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
|
@ -26,37 +29,18 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "::warning::Feature branch does not contain any changes to the website."
|
echo "::warning::Feature branch does not contain any changes to the website."
|
||||||
|
|
||||||
# lint_go:
|
|
||||||
# name: Run Go Linters
|
|
||||||
# runs-on: ubuntu-latest
|
|
||||||
# steps:
|
|
||||||
# - name: Checkout code
|
|
||||||
# uses: actions/checkout@v4
|
|
||||||
#
|
|
||||||
# - name: Setup Go
|
|
||||||
# uses: actions/setup-go@v4
|
|
||||||
# with:
|
|
||||||
# go-version: "1.21"
|
|
||||||
#
|
|
||||||
# - name: Update go modules
|
|
||||||
# working-directory: ./v2
|
|
||||||
# run: go mod tidy
|
|
||||||
#
|
|
||||||
# - name: Run Linter
|
|
||||||
# uses: golangci/golangci-lint-action@v3
|
|
||||||
# with:
|
|
||||||
# version: v1.54
|
|
||||||
# working-directory: ./v2
|
|
||||||
# args: --timeout=10m0s --config ./.golangci.yml
|
|
||||||
|
|
||||||
test_go:
|
test_go:
|
||||||
name: Run Go Tests
|
name: Run Go Tests
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
if: github.event.review.state == 'approved'
|
if: >
|
||||||
|
github.event.review.state == 'approved' &&
|
||||||
|
github.repository == 'wailsapp/wails' &&
|
||||||
|
github.base_ref == 'master' &&
|
||||||
|
github.event.pull_request.head.ref != 'update-sponsors'
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-22.04, windows-latest, macos-latest, ubuntu-24.04]
|
os: [ubuntu-22.04, windows-latest, macos-latest, ubuntu-24.04]
|
||||||
go-version: ['1.21']
|
go-version: ['1.23']
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
|
|
@ -68,7 +52,7 @@ jobs:
|
||||||
|
|
||||||
- name: Install linux dependencies (24.04)
|
- name: Install linux dependencies (24.04)
|
||||||
if: matrix.os == 'ubuntu-24.04'
|
if: matrix.os == 'ubuntu-24.04'
|
||||||
run: sudo apt-get update -y && sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev build-essential pkg-config
|
run: sudo apt-get update -y && sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libwayland-dev build-essential pkg-config
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
119
.github/workflows/publish-npm.yml
vendored
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ['v3-alpha']
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: publish-npm-v3
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect:
|
||||||
|
name: Detect committed changes
|
||||||
|
if: github.event_name != 'workflow_dispatch'
|
||||||
|
outputs:
|
||||||
|
changed: ${{ steps.package-json-changes.outputs.any_modified == 'true' || steps.source-changes.outputs.any_modified == 'true' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.sha }}
|
||||||
|
persist-credentials: 'true'
|
||||||
|
|
||||||
|
- name: Detect committed package.json changes
|
||||||
|
id: package-json-changes
|
||||||
|
uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/package.json
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json
|
||||||
|
|
||||||
|
- name: Detect committed source changes
|
||||||
|
if: >-
|
||||||
|
steps.package-json-changes.outputs.any_modified != 'true'
|
||||||
|
id: source-changes
|
||||||
|
uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
v3/internal/runtime/Taskfile.yaml
|
||||||
|
v3/internal/runtime/desktop/@wailsio/compiled/main.js
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json
|
||||||
|
v3/internal/runtime/desktop/@wailsio/runtime/src/**
|
||||||
|
v3/pkg/events/events.txt
|
||||||
|
v3/tasks/events/**
|
||||||
|
|
||||||
|
rebuild_and_publish:
|
||||||
|
name: Rebuild and publish
|
||||||
|
needs: [detect]
|
||||||
|
if: >-
|
||||||
|
!failure() && !cancelled()
|
||||||
|
&& (github.event_name == 'workflow_dispatch' || needs.detect.outputs.changed == 'true')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
actions: read
|
||||||
|
pull-requests: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
ref: 'v3-alpha'
|
||||||
|
token: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
|
||||||
|
- name: Configure git
|
||||||
|
run: |
|
||||||
|
git config --global user.email "github-actions@github.com"
|
||||||
|
git config --global user.name "GitHub Actions"
|
||||||
|
git config --global url."https://x-access-token:${{ secrets.WAILS_REPO_TOKEN || github.token }}@github.com/".insteadOf "https://github.com/"
|
||||||
|
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v2
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Use Node.js 20
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: "20"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npx --yes esbuild@latest --version
|
||||||
|
|
||||||
|
- name: Clean build artifacts
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: npm run clean
|
||||||
|
|
||||||
|
- name: Build bundled runtime
|
||||||
|
working-directory: v3
|
||||||
|
run: task runtime:build
|
||||||
|
|
||||||
|
- name: Test+Build npm package
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: |
|
||||||
|
npm test
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
- name: Bump version
|
||||||
|
id: bump-version
|
||||||
|
working-directory: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
run: |
|
||||||
|
echo "version=$(npm --no-git-tag-version --force version prerelease)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
run: |
|
||||||
|
git add .
|
||||||
|
git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}"
|
||||||
|
git push
|
||||||
|
|
||||||
|
- name: Publish npm package
|
||||||
|
uses: JS-DevTools/npm-publish@v3
|
||||||
|
with:
|
||||||
|
package: v3/internal/runtime/desktop/@wailsio/runtime
|
||||||
|
access: public
|
||||||
|
token: ${{ secrets.NPM_TOKEN }}
|
||||||
3
.github/workflows/semgrep.yml
vendored
|
|
@ -5,6 +5,7 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- master
|
- master
|
||||||
|
- v3-alpha
|
||||||
paths:
|
paths:
|
||||||
- .github/workflows/semgrep.yml
|
- .github/workflows/semgrep.yml
|
||||||
schedule:
|
schedule:
|
||||||
|
|
@ -14,7 +15,7 @@ name: Semgrep
|
||||||
jobs:
|
jobs:
|
||||||
semgrep:
|
semgrep:
|
||||||
name: semgrep/ci
|
name: semgrep/ci
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
env:
|
env:
|
||||||
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
|
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
|
||||||
container:
|
container:
|
||||||
|
|
|
||||||
57
.github/workflows/stale-issues.yml
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
name: Mark and Close Stale Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 1 * * *' # Run at 1 AM UTC every day
|
||||||
|
workflow_dispatch: # Allow manual triggering
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
# General settings
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
days-before-stale: 45
|
||||||
|
days-before-close: 10
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
operations-per-run: 250 # Increased from 50 to 250
|
||||||
|
|
||||||
|
# Issue specific settings
|
||||||
|
stale-issue-message: |
|
||||||
|
This issue has been automatically marked as stale because it has not had recent activity.
|
||||||
|
It will be closed if no further activity occurs within the next 10 days.
|
||||||
|
|
||||||
|
If this issue is still relevant, please add a comment to keep it open.
|
||||||
|
Thank you for your contributions.
|
||||||
|
|
||||||
|
close-issue-message: |
|
||||||
|
This issue has been automatically closed due to lack of activity.
|
||||||
|
Please feel free to reopen it if it's still relevant.
|
||||||
|
|
||||||
|
# PR specific settings - We will not mark PRs as stale
|
||||||
|
days-before-pr-stale: -1 # Disable PR staling
|
||||||
|
days-before-pr-close: -1 # Disable PR closing
|
||||||
|
|
||||||
|
# Exemptions
|
||||||
|
exempt-issue-labels: 'pinned,security,onhold,inprogress,Selected For Development,bug,enhancement,v3-alpha,high-priority'
|
||||||
|
exempt-all-issue-milestones: true
|
||||||
|
exempt-all-issue-assignees: true
|
||||||
|
|
||||||
|
# Protection for existing issues
|
||||||
|
exempt-issue-created-before: '2024-01-01T00:00:00Z'
|
||||||
|
start-date: '2025-06-01T00:00:00Z' # Don't start checking until June 1, 2025
|
||||||
|
|
||||||
|
# Only process issues, not PRs
|
||||||
|
only-labels: ''
|
||||||
|
any-of-labels: ''
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
|
||||||
|
# Debug options
|
||||||
|
debug-only: false # Set to true to test without actually marking issues
|
||||||
|
ascending: true # Process older issues first
|
||||||
218
.github/workflows/test-nightly-releases.yml
vendored
Normal file
|
|
@ -0,0 +1,218 @@
|
||||||
|
name: Test Nightly Releases (Dry Run)
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
description: 'Run in dry-run mode (no actual releases)'
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
test_branch:
|
||||||
|
description: 'Branch to test against'
|
||||||
|
required: false
|
||||||
|
default: 'master'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
GO_VERSION: '1.24'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-permissions:
|
||||||
|
name: Test Release Permissions
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
authorized: ${{ steps.check.outputs.authorized }}
|
||||||
|
steps:
|
||||||
|
- name: Check if user is authorized
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
# Test authorization logic
|
||||||
|
AUTHORIZED_USERS="leaanthony"
|
||||||
|
|
||||||
|
if [[ "$AUTHORIZED_USERS" == *"${{ github.actor }}"* ]]; then
|
||||||
|
echo "✅ User ${{ github.actor }} is authorized"
|
||||||
|
echo "authorized=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "❌ User ${{ github.actor }} is not authorized"
|
||||||
|
echo "authorized=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
test-changelog-extraction:
|
||||||
|
name: Test Changelog Extraction
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: test-permissions
|
||||||
|
if: needs.test-permissions.outputs.authorized == 'true'
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.inputs.test_branch }}
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Test v2 changelog extraction
|
||||||
|
run: |
|
||||||
|
echo "🧪 Testing v2 changelog extraction..."
|
||||||
|
CHANGELOG_FILE="website/src/pages/changelog.mdx"
|
||||||
|
|
||||||
|
if [ ! -f "$CHANGELOG_FILE" ]; then
|
||||||
|
echo "❌ v2 changelog file not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract unreleased section
|
||||||
|
awk '
|
||||||
|
/^## \[Unreleased\]/ { found=1; next }
|
||||||
|
found && /^## / { exit }
|
||||||
|
found && !/^$/ { print }
|
||||||
|
' $CHANGELOG_FILE > v2_release_notes.md
|
||||||
|
|
||||||
|
echo "📝 v2 changelog content (first 10 lines):"
|
||||||
|
head -10 v2_release_notes.md || echo "No content found"
|
||||||
|
echo "Total lines: $(wc -l < v2_release_notes.md)"
|
||||||
|
|
||||||
|
- name: Test v3 changelog extraction (if accessible)
|
||||||
|
run: |
|
||||||
|
echo "🧪 Testing v3 changelog extraction..."
|
||||||
|
|
||||||
|
if git show v3-alpha:docs/src/content/docs/changelog.mdx > /dev/null 2>&1; then
|
||||||
|
echo "✅ v3 changelog accessible"
|
||||||
|
|
||||||
|
git show v3-alpha:docs/src/content/docs/changelog.mdx | awk '
|
||||||
|
/^## \[Unreleased\]/ { found=1; next }
|
||||||
|
found && /^## / { exit }
|
||||||
|
found && !/^$/ { print }
|
||||||
|
' > v3_release_notes.md
|
||||||
|
|
||||||
|
echo "📝 v3 changelog content (first 10 lines):"
|
||||||
|
head -10 v3_release_notes.md || echo "No content found"
|
||||||
|
echo "Total lines: $(wc -l < v3_release_notes.md)"
|
||||||
|
else
|
||||||
|
echo "⚠️ v3 changelog not accessible from current context"
|
||||||
|
fi
|
||||||
|
|
||||||
|
test-version-detection:
|
||||||
|
name: Test Version Detection
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: test-permissions
|
||||||
|
if: needs.test-permissions.outputs.authorized == 'true'
|
||||||
|
outputs:
|
||||||
|
v2_current_version: ${{ steps.versions.outputs.v2_current }}
|
||||||
|
v2_next_patch: ${{ steps.versions.outputs.v2_next_patch }}
|
||||||
|
v2_next_minor: ${{ steps.versions.outputs.v2_next_minor }}
|
||||||
|
v2_next_major: ${{ steps.versions.outputs.v2_next_major }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Test version detection logic
|
||||||
|
id: versions
|
||||||
|
run: |
|
||||||
|
echo "🧪 Testing version detection..."
|
||||||
|
|
||||||
|
# Test v2 version parsing
|
||||||
|
if [ -f "v2/cmd/wails/internal/version.txt" ]; then
|
||||||
|
CURRENT_V2=$(cat v2/cmd/wails/internal/version.txt | sed 's/^v//')
|
||||||
|
echo "Current v2 version: v$CURRENT_V2"
|
||||||
|
echo "v2_current=v$CURRENT_V2" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Parse and increment
|
||||||
|
IFS='.' read -ra VERSION_PARTS <<< "$CURRENT_V2"
|
||||||
|
MAJOR=${VERSION_PARTS[0]}
|
||||||
|
MINOR=${VERSION_PARTS[1]}
|
||||||
|
PATCH=${VERSION_PARTS[2]}
|
||||||
|
|
||||||
|
PATCH_VERSION="v$MAJOR.$MINOR.$((PATCH + 1))"
|
||||||
|
MINOR_VERSION="v$MAJOR.$((MINOR + 1)).0"
|
||||||
|
MAJOR_VERSION="v$((MAJOR + 1)).0.0"
|
||||||
|
|
||||||
|
echo "v2_next_patch=$PATCH_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "v2_next_minor=$MINOR_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "v2_next_major=$MAJOR_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
echo "✅ Patch: v$CURRENT_V2 → $PATCH_VERSION"
|
||||||
|
echo "✅ Minor: v$CURRENT_V2 → $MINOR_VERSION"
|
||||||
|
echo "✅ Major: v$CURRENT_V2 → $MAJOR_VERSION"
|
||||||
|
else
|
||||||
|
echo "❌ v2 version file not found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
test-commit-analysis:
|
||||||
|
name: Test Commit Analysis
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: test-permissions
|
||||||
|
if: needs.test-permissions.outputs.authorized == 'true'
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Test commit analysis
|
||||||
|
run: |
|
||||||
|
echo "🧪 Testing commit analysis..."
|
||||||
|
|
||||||
|
# Get recent commits for testing
|
||||||
|
echo "Recent commits:"
|
||||||
|
git log --oneline -10
|
||||||
|
|
||||||
|
# Test conventional commit detection
|
||||||
|
RECENT_COMMITS=$(git log --oneline --since="7 days ago")
|
||||||
|
echo "Commits from last 7 days:"
|
||||||
|
echo "$RECENT_COMMITS"
|
||||||
|
|
||||||
|
# Analyze for release type
|
||||||
|
RELEASE_TYPE="patch"
|
||||||
|
if echo "$RECENT_COMMITS" | grep -q "feat!\|fix!\|BREAKING CHANGE:"; then
|
||||||
|
RELEASE_TYPE="major"
|
||||||
|
elif echo "$RECENT_COMMITS" | grep -q "feat\|BREAKING CHANGE"; then
|
||||||
|
RELEASE_TYPE="minor"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Detected release type: $RELEASE_TYPE"
|
||||||
|
|
||||||
|
test-summary:
|
||||||
|
name: Test Summary
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [test-permissions, test-changelog-extraction, test-version-detection, test-commit-analysis]
|
||||||
|
if: always()
|
||||||
|
steps:
|
||||||
|
- name: Print test results
|
||||||
|
run: |
|
||||||
|
echo "# 🧪 Nightly Release Workflow Test Results" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
if [ "${{ needs.test-permissions.result }}" == "success" ]; then
|
||||||
|
echo "✅ **Permissions Test**: Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **Permissions Test**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${{ needs.test-changelog-extraction.result }}" == "success" ]; then
|
||||||
|
echo "✅ **Changelog Extraction**: Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **Changelog Extraction**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${{ needs.test-version-detection.result }}" == "success" ]; then
|
||||||
|
echo "✅ **Version Detection**: Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Current v2: ${{ needs.test-version-detection.outputs.v2_current_version }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Next patch: ${{ needs.test-version-detection.outputs.v2_next_patch }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Next minor: ${{ needs.test-version-detection.outputs.v2_next_minor }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo " - Next major: ${{ needs.test-version-detection.outputs.v2_next_major }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **Version Detection**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${{ needs.test-commit-analysis.result }}" == "success" ]; then
|
||||||
|
echo "✅ **Commit Analysis**: Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
else
|
||||||
|
echo "❌ **Commit Analysis**: Failed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Note**: This was a dry-run test. No actual releases were created." >> $GITHUB_STEP_SUMMARY
|
||||||
11
.github/workflows/test-simple.yml
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
name: Test Simple
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Test
|
||||||
|
run: echo "Hello World"
|
||||||
128
.github/workflows/unreleased-changelog-trigger.yml
vendored
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
name: Auto Release on Changelog Update
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- v3-alpha
|
||||||
|
paths:
|
||||||
|
- 'v3/UNRELEASED_CHANGELOG.md'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
description: 'Run in dry-run mode (no actual release)'
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-permissions:
|
||||||
|
name: Check Release Permissions
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
authorized: ${{ steps.check.outputs.authorized }}
|
||||||
|
steps:
|
||||||
|
- name: Check if user is authorized for releases
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
# Only allow specific users to trigger releases
|
||||||
|
AUTHORIZED_USERS="leaanthony"
|
||||||
|
|
||||||
|
if [[ "$AUTHORIZED_USERS" == *"${{ github.actor }}"* ]]; then
|
||||||
|
echo "✅ User ${{ github.actor }} is authorized for releases"
|
||||||
|
echo "authorized=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "❌ User ${{ github.actor }} is not authorized for releases"
|
||||||
|
echo "authorized=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
trigger-release:
|
||||||
|
name: Trigger v3-alpha Release
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: check-permissions
|
||||||
|
if: needs.check-permissions.outputs.authorized == 'true'
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: v3-alpha
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
|
||||||
|
- name: Check for unreleased changelog content
|
||||||
|
id: changelog_check
|
||||||
|
run: |
|
||||||
|
echo "🔍 Checking UNRELEASED_CHANGELOG.md for content..."
|
||||||
|
|
||||||
|
cd v3
|
||||||
|
# Check if UNRELEASED_CHANGELOG.md has actual content beyond the template
|
||||||
|
if [ -f "UNRELEASED_CHANGELOG.md" ]; then
|
||||||
|
# Use a simple check for actual content (bullet points starting with -)
|
||||||
|
CONTENT_LINES=$(grep -E "^\s*-\s+[^[:space:]]" UNRELEASED_CHANGELOG.md | wc -l)
|
||||||
|
if [ "$CONTENT_LINES" -gt 0 ]; then
|
||||||
|
echo "✅ Found $CONTENT_LINES content lines in UNRELEASED_CHANGELOG.md"
|
||||||
|
echo "has_content=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "ℹ️ No actual content found in UNRELEASED_CHANGELOG.md"
|
||||||
|
echo "has_content=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ UNRELEASED_CHANGELOG.md not found"
|
||||||
|
echo "has_content=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Trigger nightly release workflow
|
||||||
|
if: steps.changelog_check.outputs.has_content == 'true'
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WAILS_REPO_TOKEN || github.token }}
|
||||||
|
script: |
|
||||||
|
const response = await github.rest.actions.createWorkflowDispatch({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
workflow_id: 'nightly-release-v3.yml',
|
||||||
|
ref: 'v3-alpha',
|
||||||
|
inputs: {
|
||||||
|
force_release: 'true',
|
||||||
|
dry_run: '${{ github.event.inputs.dry_run || "false" }}'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('🚀 Successfully triggered nightly release workflow');
|
||||||
|
console.log(`Workflow dispatch response status: ${response.status}`);
|
||||||
|
|
||||||
|
// Create a summary
|
||||||
|
core.summary
|
||||||
|
.addHeading('🚀 Auto Release Triggered')
|
||||||
|
.addRaw('The v3-alpha release workflow has been automatically triggered due to changes in UNRELEASED_CHANGELOG.md')
|
||||||
|
.addTable([
|
||||||
|
[{data: 'Trigger', header: true}, {data: 'Value', header: true}],
|
||||||
|
['Repository', context.repo.repo],
|
||||||
|
['Branch', 'v3-alpha'],
|
||||||
|
['Actor', context.actor],
|
||||||
|
['Dry Run', '${{ github.event.inputs.dry_run || "false" }}'],
|
||||||
|
['Force Release', 'true']
|
||||||
|
])
|
||||||
|
.addRaw('\n---\n*This release was automatically triggered by the unreleased-changelog-trigger workflow*')
|
||||||
|
.write();
|
||||||
|
|
||||||
|
- name: No content found
|
||||||
|
if: steps.changelog_check.outputs.has_content == 'false'
|
||||||
|
run: |
|
||||||
|
echo "ℹ️ No content found in UNRELEASED_CHANGELOG.md, skipping release trigger"
|
||||||
|
echo "## ℹ️ No Release Triggered" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Reason:** UNRELEASED_CHANGELOG.md does not contain actual changelog content" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Action:** No release workflow was triggered" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "To trigger a release, add actual changelog entries to the UNRELEASED_CHANGELOG.md file." >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
- name: Unauthorized user
|
||||||
|
if: needs.check-permissions.outputs.authorized == 'false'
|
||||||
|
run: |
|
||||||
|
echo "❌ User ${{ github.actor }} is not authorized to trigger releases"
|
||||||
|
echo "## ❌ Unauthorized Release Attempt" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**User:** ${{ github.actor }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Action:** Release trigger was blocked due to insufficient permissions" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "Only authorized users can trigger automatic releases via changelog updates." >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
@ -15,7 +15,7 @@ jobs:
|
||||||
|
|
||||||
- name: Verify Changed files
|
- name: Verify Changed files
|
||||||
id: changed-files
|
id: changed-files
|
||||||
uses: tj-actions/changed-files@v41
|
uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
website/**/*.mdx
|
website/**/*.mdx
|
||||||
|
|
|
||||||
51
.github/workflows/v3-docs.yml
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
name: Deploy to GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
# Trigger the workflow every time you push to the `main` branch
|
||||||
|
# Using a different branch name? Replace `main` with your branch's name
|
||||||
|
push:
|
||||||
|
branches: [v3-alpha]
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
- '.github/workflows/v3-docs.yml'
|
||||||
|
# Allows you to run this workflow manually from the Actions tab on GitHub.
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# Allow this job to clone the repo and create a page deployment
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.repository.fork == false
|
||||||
|
steps:
|
||||||
|
- name: Checkout your repository using git
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install D2
|
||||||
|
run: |
|
||||||
|
curl -fsSL https://d2lang.com/install.sh > install.sh
|
||||||
|
chmod +x install.sh
|
||||||
|
./install.sh
|
||||||
|
sudo cp ~/.local/bin/d2 /usr/local/bin/d2
|
||||||
|
d2 --version
|
||||||
|
rm install.sh
|
||||||
|
- name: Install, build, and upload your site output
|
||||||
|
uses: withastro/action@v2
|
||||||
|
with:
|
||||||
|
path: docs
|
||||||
|
node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional)
|
||||||
|
# package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional)
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
steps:
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
58
.gitignore
vendored
|
|
@ -37,5 +37,61 @@ v2/cmd/wails/internal/commands/initialise/templates/testtemplates/
|
||||||
/websitev3/site/
|
/websitev3/site/
|
||||||
/v3/examples/plugins/bin/testapp
|
/v3/examples/plugins/bin/testapp
|
||||||
|
|
||||||
|
# V3 Example binaries - ignore executables that match directory names
|
||||||
|
/v3/examples/badge-custom/badge-custom
|
||||||
|
/v3/examples/badge/badge
|
||||||
|
/v3/examples/binding/binding
|
||||||
|
/v3/examples/cancel-async/cancel-async
|
||||||
|
/v3/examples/cancel-chaining/cancel-chaining
|
||||||
|
/v3/examples/clipboard/clipboard
|
||||||
|
/v3/examples/contextmenus/contextmenus
|
||||||
|
/v3/examples/dev/dev
|
||||||
|
/v3/examples/dialogs-basic/dialogs-basic
|
||||||
|
/v3/examples/dialogs/dialogs
|
||||||
|
/v3/examples/drag-n-drop/drag-n-drop
|
||||||
|
/v3/examples/environment/environment
|
||||||
|
/v3/examples/events-bug/events-bug
|
||||||
|
/v3/examples/events/events
|
||||||
|
/v3/examples/file-association/file-association
|
||||||
|
/v3/examples/frameless/frameless
|
||||||
|
/v3/examples/gin-example/gin-example
|
||||||
|
/v3/examples/gin-routing/gin-routing
|
||||||
|
/v3/examples/gin-service/gin-service
|
||||||
|
/v3/examples/hide-window/hide-window
|
||||||
|
/v3/examples/html-dnd-api/html-dnd-api
|
||||||
|
/v3/examples/ignore-mouse/ignore-mouse
|
||||||
|
/v3/examples/keybindings/keybindings
|
||||||
|
/v3/examples/menu/menu
|
||||||
|
/v3/examples/notifications/notifications
|
||||||
|
/v3/examples/panic-handling/panic-handling
|
||||||
|
/v3/examples/plain/plain
|
||||||
|
/v3/examples/raw-message/raw-message
|
||||||
|
/v3/examples/screen/screen
|
||||||
|
/v3/examples/services/services
|
||||||
|
/v3/examples/show-macos-toolbar/show-macos-toolbar
|
||||||
|
/v3/examples/single-instance/single-instance
|
||||||
|
/v3/examples/systray-basic/systray-basic
|
||||||
|
/v3/examples/systray-custom/systray-custom
|
||||||
|
/v3/examples/systray-menu/systray-menu
|
||||||
|
/v3/examples/video/video
|
||||||
|
/v3/examples/window-api/window-api
|
||||||
|
/v3/examples/window-call/window-call
|
||||||
|
/v3/examples/window-menu/window-menu
|
||||||
|
/v3/examples/window/window
|
||||||
|
/v3/examples/wml/wml
|
||||||
|
|
||||||
|
# Common binary names in examples
|
||||||
|
/v3/examples/*/main
|
||||||
|
/v3/examples/*/app
|
||||||
|
/v3/examples/*/changeme
|
||||||
|
/v3/examples/*/testbuild-*
|
||||||
|
|
||||||
# Temporary called mkdocs, should be renamed to more standard -website or similar
|
# Temporary called mkdocs, should be renamed to more standard -website or similar
|
||||||
/mkdocs-website/site
|
/docs/site
|
||||||
|
.aider*
|
||||||
|
.aider*
|
||||||
|
.cache
|
||||||
|
.local
|
||||||
|
|
||||||
|
# Ignore local iOS test app
|
||||||
|
/v3/testiosapp/
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
overrides:
|
overrides:
|
||||||
- files:
|
- files:
|
||||||
- "**/*.md"
|
- "**/*.md"
|
||||||
|
- "**/*.mdx"
|
||||||
options:
|
options:
|
||||||
printWidth: 80
|
printWidth: 80
|
||||||
proseWrap: always
|
proseWrap: always
|
||||||
|
|
|
||||||
197
AGENTS.md
Normal file
|
|
@ -0,0 +1,197 @@
|
||||||
|
# AI Agent Instructions for Wails v3
|
||||||
|
|
||||||
|
## Issue Tracking with bd (beads)
|
||||||
|
|
||||||
|
**IMPORTANT**: This project uses **bd (beads)** for ALL issue tracking. Do NOT use markdown TODOs, task lists, or other tracking methods.
|
||||||
|
|
||||||
|
### Why bd?
|
||||||
|
|
||||||
|
- Dependency-aware: Track blockers and relationships between issues
|
||||||
|
- Git-friendly: Auto-syncs to JSONL for version control
|
||||||
|
- Agent-optimized: JSON output, ready work detection, discovered-from links
|
||||||
|
- Prevents duplicate tracking systems and confusion
|
||||||
|
|
||||||
|
### Quick Start
|
||||||
|
|
||||||
|
**Check for ready work:**
|
||||||
|
```bash
|
||||||
|
bd ready --json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create new issues:**
|
||||||
|
```bash
|
||||||
|
bd create "Issue title" -t bug|feature|task -p 0-4 --json
|
||||||
|
bd create "Issue title" -p 1 --deps discovered-from:bd-123 --json
|
||||||
|
bd create "Subtask" --parent <epic-id> --json # Hierarchical subtask (gets ID like epic-id.1)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Claim and update:**
|
||||||
|
```bash
|
||||||
|
bd update bd-42 --status in_progress --json
|
||||||
|
bd update bd-42 --priority 1 --json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Complete work:**
|
||||||
|
```bash
|
||||||
|
bd close bd-42 --reason "Completed" --json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue Types
|
||||||
|
|
||||||
|
- `bug` - Something broken
|
||||||
|
- `feature` - New functionality
|
||||||
|
- `task` - Work item (tests, docs, refactoring)
|
||||||
|
- `epic` - Large feature with subtasks
|
||||||
|
- `chore` - Maintenance (dependencies, tooling)
|
||||||
|
|
||||||
|
### Priorities
|
||||||
|
|
||||||
|
- `0` - Critical (security, data loss, broken builds)
|
||||||
|
- `1` - High (major features, important bugs)
|
||||||
|
- `2` - Medium (default, nice-to-have)
|
||||||
|
- `3` - Low (polish, optimization)
|
||||||
|
- `4` - Backlog (future ideas)
|
||||||
|
|
||||||
|
### Workflow for AI Agents
|
||||||
|
|
||||||
|
1. **Check ready work**: `bd ready` shows unblocked issues
|
||||||
|
2. **Claim your task**: `bd update <id> --status in_progress`
|
||||||
|
3. **Work on it**: Implement, test, document
|
||||||
|
4. **Discover new work?** Create linked issue:
|
||||||
|
- `bd create "Found bug" -p 1 --deps discovered-from:<parent-id>`
|
||||||
|
5. **Complete**: `bd close <id> --reason "Done"`
|
||||||
|
6. **Commit together**: Always commit the `.beads/issues.jsonl` file together with the code changes so issue state stays in sync with code state
|
||||||
|
|
||||||
|
### Auto-Sync
|
||||||
|
|
||||||
|
bd automatically syncs with git:
|
||||||
|
- Exports to `.beads/issues.jsonl` after changes (5s debounce)
|
||||||
|
- Imports from JSONL when newer (e.g., after `git pull`)
|
||||||
|
- No manual export/import needed!
|
||||||
|
|
||||||
|
### GitHub Copilot Integration
|
||||||
|
|
||||||
|
If using GitHub Copilot, also create `.github/copilot-instructions.md` for automatic instruction loading.
|
||||||
|
Run `bd onboard` to get the content, or see step 2 of the onboard instructions.
|
||||||
|
|
||||||
|
### MCP Server (Recommended)
|
||||||
|
|
||||||
|
If using Claude or MCP-compatible clients, install the beads MCP server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install beads-mcp
|
||||||
|
```
|
||||||
|
|
||||||
|
Add to MCP config (e.g., `~/.config/claude/config.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"beads": {
|
||||||
|
"command": "beads-mcp",
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use `mcp__beads__*` functions instead of CLI commands.
|
||||||
|
|
||||||
|
### Managing AI-Generated Planning Documents
|
||||||
|
|
||||||
|
AI assistants often create planning and design documents during development:
|
||||||
|
- PLAN.md, IMPLEMENTATION.md, ARCHITECTURE.md
|
||||||
|
- DESIGN.md, CODEBASE_SUMMARY.md, INTEGRATION_PLAN.md
|
||||||
|
- TESTING_GUIDE.md, TECHNICAL_DESIGN.md, and similar files
|
||||||
|
|
||||||
|
**Best Practice: Use a dedicated directory for these ephemeral files**
|
||||||
|
|
||||||
|
**Recommended approach:**
|
||||||
|
- Create a `history/` directory in the project root
|
||||||
|
- Store ALL AI-generated planning/design docs in `history/`
|
||||||
|
- Keep the repository root clean and focused on permanent project files
|
||||||
|
- Only access `history/` when explicitly asked to review past planning
|
||||||
|
|
||||||
|
**Example .gitignore entry (optional):**
|
||||||
|
```
|
||||||
|
# AI planning documents (ephemeral)
|
||||||
|
history/
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Clean repository root
|
||||||
|
- Clear separation between ephemeral and permanent documentation
|
||||||
|
- Easy to exclude from version control if desired
|
||||||
|
- Preserves planning history for archeological research
|
||||||
|
- Reduces noise when browsing the project
|
||||||
|
|
||||||
|
### CLI Help
|
||||||
|
|
||||||
|
Run `bd <command> --help` to see all available flags for any command.
|
||||||
|
For example: `bd create --help` shows `--parent`, `--deps`, `--assignee`, etc.
|
||||||
|
|
||||||
|
### Important Rules
|
||||||
|
|
||||||
|
- Use bd for ALL task tracking
|
||||||
|
- Always use `--json` flag for programmatic use
|
||||||
|
- Link discovered work with `discovered-from` dependencies
|
||||||
|
- Check `bd ready` before asking "what should I work on?"
|
||||||
|
- Store AI planning docs in `history/` directory
|
||||||
|
- Run `bd <cmd> --help` to discover available flags
|
||||||
|
- **ALWAYS run `coderabbit --plain` before committing** to get code analysis and catch issues early
|
||||||
|
- Do NOT create markdown TODO lists
|
||||||
|
- Do NOT use external issue trackers
|
||||||
|
- Do NOT duplicate tracking systems
|
||||||
|
- Do NOT clutter repo root with planning documents
|
||||||
|
|
||||||
|
For more details, see README.md and QUICKSTART.md.
|
||||||
|
|
||||||
|
## Implementation Tracking (IMPLEMENTATION.md)
|
||||||
|
|
||||||
|
**IMPORTANT**: The `IMPLEMENTATION.md` file at the repository root is a **persistent tracking document** for the WebKitGTK 6.0 / GTK4 implementation work. It is NOT an ephemeral planning document.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
1. **Update with EVERY commit** that touches GTK4/WebKitGTK 6.0 related code
|
||||||
|
2. **Track all architectural decisions** with context, decision, and rationale
|
||||||
|
3. **Maintain progress status** for each implementation phase
|
||||||
|
4. **Document API differences** between GTK3 and GTK4
|
||||||
|
5. **Keep file references** accurate and up-to-date
|
||||||
|
|
||||||
|
### What to Update
|
||||||
|
|
||||||
|
- Phase completion status (✅ COMPLETE, 🔄 IN PROGRESS, 📋 PENDING)
|
||||||
|
- New decisions made during implementation
|
||||||
|
- Files created or modified
|
||||||
|
- Changelog entries with dates
|
||||||
|
- TODO items discovered during work
|
||||||
|
|
||||||
|
### Commit Message Pattern
|
||||||
|
|
||||||
|
When updating IMPLEMENTATION.md:
|
||||||
|
```
|
||||||
|
docs: update implementation tracker for [phase/feature]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Landing the Plane (Session Completion)
|
||||||
|
|
||||||
|
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
|
||||||
|
|
||||||
|
**MANDATORY WORKFLOW:**
|
||||||
|
|
||||||
|
1. **File issues for remaining work** - Create issues for anything that needs follow-up
|
||||||
|
2. **Run quality gates** (if code changed) - Tests, linters, builds
|
||||||
|
3. **Update issue status** - Close finished work, update in-progress items
|
||||||
|
4. **PUSH TO REMOTE** - This is MANDATORY:
|
||||||
|
```bash
|
||||||
|
git pull --rebase
|
||||||
|
bd sync
|
||||||
|
git push
|
||||||
|
git status # MUST show "up to date with origin"
|
||||||
|
```
|
||||||
|
5. **Clean up** - Clear stashes, prune remote branches
|
||||||
|
6. **Verify** - All changes committed AND pushed
|
||||||
|
7. **Hand off** - Provide context for next session
|
||||||
|
|
||||||
|
**CRITICAL RULES:**
|
||||||
|
- Work is NOT complete until `git push` succeeds
|
||||||
|
- NEVER stop before pushing - that leaves work stranded locally
|
||||||
|
- NEVER say "ready to push when you are" - YOU must push
|
||||||
|
- If push fails, resolve and retry until it succeeds
|
||||||
1
CNAME
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
v3alpha.wails.io
|
||||||
543
IMPLEMENTATION.md
Normal file
|
|
@ -0,0 +1,543 @@
|
||||||
|
# WebKitGTK 6.0 / GTK4 Implementation Tracker
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This document tracks the implementation of WebKitGTK 6.0 (GTK4) support for Wails v3 on Linux.
|
||||||
|
|
||||||
|
**Goal**: Provide GTK4/WebKitGTK 6.0 support as an EXPERIMENTAL opt-in via `-tags gtk4`, while maintaining GTK3/WebKit2GTK 4.1 as the stable default.
|
||||||
|
|
||||||
|
## Architecture Decisions
|
||||||
|
|
||||||
|
### Decision 1: GTK3 as Default, GTK4 Opt-In (2026-02-04)
|
||||||
|
**Context**: Need to support modern Linux distributions with GTK4 while maintaining stability for existing apps.
|
||||||
|
|
||||||
|
**Decision**: GTK3 remains the stable default (no build tag required). GTK4 is available as experimental via `-tags gtk4`.
|
||||||
|
|
||||||
|
**Rationale**:
|
||||||
|
- GTK3/WebKit2GTK 4.1 is battle-tested and widely deployed
|
||||||
|
- GTK4 support needs more community testing before becoming default
|
||||||
|
- Allows gradual migration and feedback collection
|
||||||
|
- Protects existing apps from unexpected breakage
|
||||||
|
|
||||||
|
**Build Tags**:
|
||||||
|
- Default (no tag): `//go:build linux && cgo && !gtk4 && !android`
|
||||||
|
- Experimental GTK4: `//go:build linux && cgo && gtk4 && !android`
|
||||||
|
|
||||||
|
### Decision 2: pkg-config Libraries (2026-01-04)
|
||||||
|
**GTK4/WebKitGTK 6.0**:
|
||||||
|
```
|
||||||
|
#cgo linux pkg-config: gtk4 webkitgtk-6.0 libsoup-3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**GTK3/WebKit2GTK 4.1** (legacy):
|
||||||
|
```
|
||||||
|
#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.1 libsoup-3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Decision 3: Wayland Window Positioning (2026-01-04)
|
||||||
|
**Context**: GTK4/Wayland doesn't support arbitrary window positioning - this is a Wayland protocol limitation.
|
||||||
|
|
||||||
|
**Decision**: Window positioning functions (`move()`, `setPosition()`, `center()`) are documented NO-OPs on GTK4/Wayland.
|
||||||
|
|
||||||
|
**Rationale**: This is a fundamental Wayland design decision, not a limitation we can work around. Users need to be aware of this behavioral difference.
|
||||||
|
|
||||||
|
### Decision 4: Menu System Architecture (2026-01-04)
|
||||||
|
**Context**: GTK4 removes GtkMenu/GtkMenuItem in favor of GMenu/GAction.
|
||||||
|
|
||||||
|
**Decision**: Complete rewrite of menu system for GTK4 using GMenu/GAction/GtkPopoverMenuBar.
|
||||||
|
|
||||||
|
**Status**: Stub implementations only. Full implementation pending.
|
||||||
|
|
||||||
|
### Decision 5: System Tray Compatibility (2026-01-04)
|
||||||
|
**Context**: v3's system tray uses D-Bus StatusNotifierItem protocol.
|
||||||
|
|
||||||
|
**Decision**: No changes needed - system tray is already GTK-agnostic.
|
||||||
|
|
||||||
|
## Implementation Progress
|
||||||
|
|
||||||
|
### Phase 1: Build Infrastructure ✅ COMPLETE
|
||||||
|
|
||||||
|
**Commit**: `a0ca13fdc` (2026-01-04)
|
||||||
|
|
||||||
|
#### 1.1 Add gtk3 constraint to existing files
|
||||||
|
Files modified:
|
||||||
|
- `v3/pkg/application/application_linux.go` - Added `gtk3` constraint
|
||||||
|
- `v3/pkg/application/linux_cgo.go` - Added `gtk3` constraint
|
||||||
|
- `v3/internal/assetserver/webview/request_linux.go` - Added `gtk3` constraint
|
||||||
|
- `v3/internal/assetserver/webview/responsewriter_linux.go` - Added `gtk3` constraint
|
||||||
|
- `v3/internal/assetserver/webview/webkit2.go` - Added `gtk3` constraint
|
||||||
|
|
||||||
|
#### 1.2 Create GTK4 stub files
|
||||||
|
Files created:
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.go` (~1000 lines)
|
||||||
|
- Main CGO file with GTK4 bindings
|
||||||
|
- Implements: window management, clipboard, basic menu stubs
|
||||||
|
- Uses `gtk4 webkitgtk-6.0` pkg-config
|
||||||
|
|
||||||
|
- `v3/pkg/application/application_linux_gtk4.go` (~250 lines)
|
||||||
|
- Application lifecycle management
|
||||||
|
- System theme detection via D-Bus
|
||||||
|
- NVIDIA DMA-BUF workaround for Wayland
|
||||||
|
|
||||||
|
#### 1.3 Create WebKitGTK 6.0 asset server stubs
|
||||||
|
Files created:
|
||||||
|
- `v3/internal/assetserver/webview/webkit6.go`
|
||||||
|
- `v3/internal/assetserver/webview/request_linux_gtk4.go`
|
||||||
|
- `v3/internal/assetserver/webview/responsewriter_linux_gtk4.go`
|
||||||
|
|
||||||
|
### Phase 2: Doctor & Capabilities ✅ COMPLETE
|
||||||
|
|
||||||
|
**Goal**: Update `wails doctor` to check for GTK4 as primary, GTK3 as secondary.
|
||||||
|
|
||||||
|
#### 2.1 Package Manager Updates
|
||||||
|
All 7 package managers updated to check GTK4/WebKitGTK 6.0 as primary, GTK3 as optional/legacy:
|
||||||
|
- `v3/internal/doctor/packagemanager/apt.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/dnf.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/pacman.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/zypper.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/emerge.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/eopkg.go` ✅
|
||||||
|
- `v3/internal/doctor/packagemanager/nixpkgs.go` ✅
|
||||||
|
|
||||||
|
Package key naming convention: `gtk3`, `webkit2gtk-4.1` (primary/default), `gtk4`, `webkitgtk-6.0` (experimental, optional)
|
||||||
|
|
||||||
|
#### 2.2 Capabilities Detection
|
||||||
|
Files created/updated:
|
||||||
|
- `v3/internal/capabilities/capabilities.go` - Added `GTKVersion` (int) and `WebKitVersion` (string) fields
|
||||||
|
- `v3/internal/capabilities/capabilities_linux.go` - GTK4 default: `GTKVersion: 4, WebKitVersion: "6.0"`
|
||||||
|
- `v3/internal/capabilities/capabilities_linux_gtk3.go` - GTK3 legacy: `GTKVersion: 3, WebKitVersion: "4.1"`
|
||||||
|
|
||||||
|
TODO (deferred to Phase 3):
|
||||||
|
- [ ] Update `v3/internal/doctor/doctor_linux.go` - Improve output to show GTK4 vs GTK3 status
|
||||||
|
|
||||||
|
### Phase 3: Window Management ✅ COMPLETE
|
||||||
|
|
||||||
|
#### 3.1 GTK4 Event Controllers
|
||||||
|
GTK4 replaces direct signal handlers with `GtkEventController` objects:
|
||||||
|
- `GtkEventControllerFocus` for focus in/out events
|
||||||
|
- `GtkGestureClick` for button press/release events
|
||||||
|
- `GtkEventControllerKey` for keyboard events
|
||||||
|
- Window signals: `close-request`, `notify::maximized`, `notify::fullscreened`
|
||||||
|
|
||||||
|
New C function `setupWindowEventControllers()` sets up all event controllers.
|
||||||
|
|
||||||
|
#### 3.2 Window Drag and Resize
|
||||||
|
GTK4 uses `GdkToplevel` API instead of GTK3's `gtk_window_begin_move_drag`:
|
||||||
|
- `gdk_toplevel_begin_move()` for window drag
|
||||||
|
- `gdk_toplevel_begin_resize()` for window resize
|
||||||
|
- Requires `gtk_native_get_surface()` to get the GdkSurface
|
||||||
|
|
||||||
|
#### 3.3 Drag-and-Drop with GtkDropTarget
|
||||||
|
Complete implementation using GTK4's `GtkDropTarget`:
|
||||||
|
- `on_drop_enter` / `on_drop_leave` for drag enter/exit events
|
||||||
|
- `on_drop_motion` for drag position updates
|
||||||
|
- `on_drop` handles file drops via `GDK_TYPE_FILE_LIST`
|
||||||
|
- Go callbacks: `onDropEnter`, `onDropLeave`, `onDropMotion`, `onDropFiles`
|
||||||
|
|
||||||
|
#### 3.4 Window State Detection
|
||||||
|
- `isMinimised()` uses `gdk_toplevel_get_state()` with `GDK_TOPLEVEL_STATE_MINIMIZED`
|
||||||
|
- `isMaximised()` uses `gtk_window_is_maximized()`
|
||||||
|
- `isFullscreen()` uses `gtk_window_is_fullscreen()`
|
||||||
|
|
||||||
|
#### 3.5 Size Constraints
|
||||||
|
GTK4 removed `gtk_window_set_geometry_hints()`. Now using `gtk_widget_set_size_request()` for minimum size.
|
||||||
|
|
||||||
|
TODO (deferred):
|
||||||
|
- [ ] Test window lifecycle on GTK4 with actual GTK4 libraries
|
||||||
|
|
||||||
|
### Phase 4: Menu System ✅ COMPLETE
|
||||||
|
|
||||||
|
GTK4 completely replaced the menu system. GTK3's GtkMenu/GtkMenuItem are gone.
|
||||||
|
|
||||||
|
#### 4.1 GMenu/GAction Architecture
|
||||||
|
- `GMenu` - Menu model (data structure, not a widget)
|
||||||
|
- `GMenuItem` - Individual menu item in the model
|
||||||
|
- `GSimpleAction` - Action that gets triggered when menu item is activated
|
||||||
|
- `GSimpleActionGroup` - Container for actions, attached to widgets
|
||||||
|
|
||||||
|
#### 4.2 Menu Bar Implementation
|
||||||
|
- `GtkPopoverMenuBar` created from `GMenu` model via `create_menu_bar_from_model()`
|
||||||
|
- Action group attached to window with `attach_action_group_to_widget()`
|
||||||
|
- Actions use "app.action_name" namespace
|
||||||
|
|
||||||
|
#### 4.3 New Files Created
|
||||||
|
- `v3/pkg/application/menu_linux_gtk4.go` - GTK4 menu processing
|
||||||
|
- `v3/pkg/application/menuitem_linux_gtk4.go` - GTK4 menu item handling
|
||||||
|
|
||||||
|
#### 4.4 Build Tag Changes
|
||||||
|
- `menu_linux.go` - Added `gtk3` tag
|
||||||
|
- `menuitem_linux.go` - Added `gtk3` tag
|
||||||
|
|
||||||
|
#### 4.5 Key Functions
|
||||||
|
- `menuActionActivated()` - Callback when GAction is triggered
|
||||||
|
- `menuItemNewWithId()` - Creates GMenuItem + associated GSimpleAction
|
||||||
|
- `menuCheckItemNewWithId()` - Creates stateful toggle action
|
||||||
|
- `menuRadioItemNewWithId()` - Creates radio action
|
||||||
|
- `set_action_enabled()` / `set_action_state()` - Manage action state
|
||||||
|
|
||||||
|
TODO (deferred):
|
||||||
|
- [ ] Context menus with GtkPopoverMenu
|
||||||
|
|
||||||
|
### Phase 5: Asset Server ✅ COMPLETE
|
||||||
|
|
||||||
|
WebKitGTK 6.0 uses the same URI scheme handler API as WebKitGTK 4.1.
|
||||||
|
The asset server implementation is identical between GTK3 and GTK4.
|
||||||
|
|
||||||
|
#### 5.1 Asset Server Files (already created in Phase 1)
|
||||||
|
- `v3/internal/assetserver/webview/webkit6.go` - WebKitGTK 6.0 helpers
|
||||||
|
- `v3/internal/assetserver/webview/request_linux_gtk4.go` - Request handling
|
||||||
|
- `v3/internal/assetserver/webview/responsewriter_linux_gtk4.go` - Response writing
|
||||||
|
|
||||||
|
#### 5.2 Missing Exports Added
|
||||||
|
The GTK4 CGO file was missing two critical exports that were in the GTK3 file:
|
||||||
|
- `onProcessRequest` - Handles URI scheme requests from WebKit
|
||||||
|
- `sendMessageToBackend` - Handles JavaScript to Go communication
|
||||||
|
|
||||||
|
Both exports were added to `linux_cgo_gtk4.go`.
|
||||||
|
|
||||||
|
#### 5.3 Key Differences from GTK3
|
||||||
|
| Aspect | GTK3 | GTK4 |
|
||||||
|
|--------|------|------|
|
||||||
|
| pkg-config | `webkit2gtk-4.1` | `webkitgtk-6.0` |
|
||||||
|
| Headers | `webkit2/webkit2.h` | `webkit/webkit.h` |
|
||||||
|
| Min version | 2.40 | 6.0 |
|
||||||
|
| URI scheme API | Same | Same |
|
||||||
|
|
||||||
|
TODO (deferred to testing phase):
|
||||||
|
- [ ] Test asset loading on actual GTK4 system
|
||||||
|
- [ ] Verify JavaScript execution works correctly
|
||||||
|
|
||||||
|
### Phase 6: Docker & Build System ✅ COMPLETE
|
||||||
|
|
||||||
|
#### 6.1 Docker Container Updates
|
||||||
|
Updated both Dockerfile.linux-x86_64 and Dockerfile.linux-arm64 to install:
|
||||||
|
- GTK3 + WebKit2GTK 4.1 (default build target)
|
||||||
|
- GTK4 + WebKitGTK 6.0 (for experimental `-tags gtk4` builds)
|
||||||
|
|
||||||
|
Build scripts now support `BUILD_TAGS` environment variable:
|
||||||
|
- Default: Builds with GTK3/WebKit2GTK 4.1
|
||||||
|
- `BUILD_TAGS=gtk4`: Builds with GTK4/WebKitGTK 6.0 (experimental)
|
||||||
|
|
||||||
|
#### 6.2 Taskfile Targets
|
||||||
|
New targets added to `v3/Taskfile.yaml`:
|
||||||
|
|
||||||
|
| Target | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| `test:example:linux` | Build single example with GTK3 (native, default) |
|
||||||
|
| `test:example:linux:gtk4` | Build single example with GTK4 (native, experimental) |
|
||||||
|
| `test:examples:linux:docker:x86_64` | Build all examples with GTK3 in Docker |
|
||||||
|
| `test:examples:linux:docker:x86_64:gtk4` | Build all examples with GTK4 in Docker (experimental) |
|
||||||
|
| `test:examples:linux:docker:arm64` | Build all examples with GTK3 in Docker (ARM64) |
|
||||||
|
| `test:examples:linux:docker:arm64:gtk4` | Build all examples with GTK4 in Docker (ARM64, experimental) |
|
||||||
|
|
||||||
|
TODO (deferred):
|
||||||
|
- [ ] Update CI/CD workflows to test both GTK versions
|
||||||
|
|
||||||
|
### Phase 8: Dialog System ✅ COMPLETE
|
||||||
|
|
||||||
|
GTK4 completely replaced the dialog APIs. GTK3's `GtkFileChooserDialog` and
|
||||||
|
`gtk_message_dialog_new` are deprecated/removed.
|
||||||
|
|
||||||
|
#### 8.1 File Dialogs
|
||||||
|
GTK4 uses `GtkFileDialog` with async API:
|
||||||
|
- `gtk_file_dialog_open()` - Open single file
|
||||||
|
- `gtk_file_dialog_open_multiple()` - Open multiple files
|
||||||
|
- `gtk_file_dialog_select_folder()` - Select folder
|
||||||
|
- `gtk_file_dialog_select_multiple_folders()` - Select multiple folders
|
||||||
|
- `gtk_file_dialog_save()` - Save file
|
||||||
|
|
||||||
|
Key differences:
|
||||||
|
- No more `gtk_dialog_run()` - everything is async with callbacks
|
||||||
|
- Filters use `GListStore` of `GtkFileFilter` objects
|
||||||
|
- Results delivered via `GAsyncResult` callbacks
|
||||||
|
- Custom button text via `gtk_file_dialog_set_accept_label()`
|
||||||
|
|
||||||
|
#### 8.1.1 GTK4 File Dialog Limitations (Portal-based)
|
||||||
|
|
||||||
|
GTK4's `GtkFileDialog` uses **xdg-desktop-portal** for native file dialogs. This provides
|
||||||
|
better desktop integration but removes some application control:
|
||||||
|
|
||||||
|
| Feature | GTK3 | GTK4 | Notes |
|
||||||
|
|---------|------|------|-------|
|
||||||
|
| `ShowHiddenFiles()` | ✅ Works | ❌ No effect | User controls via portal UI toggle |
|
||||||
|
| `CanCreateDirectories()` | ✅ Works | ❌ No effect | Always enabled in portal |
|
||||||
|
| `ResolvesAliases()` | ✅ Works | ❌ No effect | Portal handles symlinks |
|
||||||
|
| `SetButtonText()` | ✅ Works | ✅ Works | `gtk_file_dialog_set_accept_label()` |
|
||||||
|
| Multiple folders | ✅ Works | ✅ Works | `gtk_file_dialog_select_multiple_folders()` |
|
||||||
|
|
||||||
|
**Why these limitations exist**: GTK4's portal-based dialogs delegate UI control to the
|
||||||
|
desktop environment (GNOME, KDE, etc.). This is intentional - the portal provides
|
||||||
|
consistent UX across applications and respects user preferences.
|
||||||
|
|
||||||
|
#### 8.2 Message Dialogs
|
||||||
|
GTK4 uses `GtkAlertDialog`:
|
||||||
|
- `gtk_alert_dialog_choose()` - Show dialog with buttons
|
||||||
|
- Buttons specified as NULL-terminated string array
|
||||||
|
- Default and cancel button indices configurable
|
||||||
|
|
||||||
|
#### 8.3 Implementation Details
|
||||||
|
- Request ID tracking for async callback matching
|
||||||
|
- `fileDialogCallback` / `alertDialogCallback` C exports for results
|
||||||
|
- `runChooserDialog()` and `runQuestionDialog()` Go wrappers
|
||||||
|
- `runOpenFileDialog()` and `runSaveFileDialog()` convenience functions
|
||||||
|
|
||||||
|
| GTK3 | GTK4 |
|
||||||
|
|------|------|
|
||||||
|
| `GtkFileChooserDialog` | `GtkFileDialog` |
|
||||||
|
| `gtk_dialog_run()` | Async callbacks |
|
||||||
|
| `gtk_message_dialog_new()` | `GtkAlertDialog` |
|
||||||
|
| `gtk_widget_destroy()` | `g_object_unref()` |
|
||||||
|
|
||||||
|
### Phase 9: Keyboard Accelerators ✅ COMPLETE
|
||||||
|
|
||||||
|
GTK4 uses `gtk_application_set_accels_for_action()` to bind keyboard shortcuts to GActions.
|
||||||
|
|
||||||
|
#### 9.1 Key Components
|
||||||
|
|
||||||
|
**C Helper Functions** (in `linux_cgo_gtk4.go`):
|
||||||
|
- `set_action_accelerator(app, action_name, accel)` - Sets accelerator for a GAction
|
||||||
|
- `build_accelerator_string(key, mods)` - Converts key+modifiers to GTK accelerator string
|
||||||
|
|
||||||
|
**Go Functions** (in `linux_cgo_gtk4.go`):
|
||||||
|
- `namedKeysToGTK` - Map of key names to GDK keysym values (e.g., "backspace" → 0xff08)
|
||||||
|
- `parseKeyGTK(key)` - Converts Wails key string to GDK keysym
|
||||||
|
- `parseModifiersGTK(modifiers)` - Converts Wails modifiers to GdkModifierType
|
||||||
|
- `acceleratorToGTK(accel)` - Converts full accelerator to GTK format
|
||||||
|
- `setMenuItemAccelerator(itemId, accel)` - Sets accelerator for a menu item
|
||||||
|
|
||||||
|
**Integration** (in `menuitem_linux_gtk4.go`):
|
||||||
|
- `setAccelerator()` method on `linuxMenuItem` calls `setMenuItemAccelerator()`
|
||||||
|
- `newMenuItemImpl()`, `newCheckMenuItemImpl()`, `newRadioMenuItemImpl()` all set accelerators during creation
|
||||||
|
|
||||||
|
#### 9.2 Accelerator String Format
|
||||||
|
|
||||||
|
GTK accelerator strings use format like:
|
||||||
|
- `<Control>q` - Ctrl+Q
|
||||||
|
- `<Control><Shift>s` - Ctrl+Shift+S
|
||||||
|
- `<Alt>F4` - Alt+F4
|
||||||
|
- `<Super>e` - Super+E (Windows/Command key)
|
||||||
|
|
||||||
|
#### 9.3 Modifier Mapping
|
||||||
|
|
||||||
|
| Wails Modifier | GDK Modifier |
|
||||||
|
|----------------|--------------|
|
||||||
|
| `CmdOrCtrlKey` | `GDK_CONTROL_MASK` |
|
||||||
|
| `ControlKey` | `GDK_CONTROL_MASK` |
|
||||||
|
| `OptionOrAltKey` | `GDK_ALT_MASK` |
|
||||||
|
| `ShiftKey` | `GDK_SHIFT_MASK` |
|
||||||
|
| `SuperKey` | `GDK_SUPER_MASK` |
|
||||||
|
|
||||||
|
### Phase 10: Testing 📋 PENDING
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- [ ] Test on Ubuntu 24.04 (native GTK4)
|
||||||
|
- [ ] Test on Ubuntu 22.04 (backported WebKitGTK 6.0)
|
||||||
|
- [ ] Test legacy build on older systems
|
||||||
|
- [ ] Performance benchmarks
|
||||||
|
- [ ] Verify file dialogs work correctly
|
||||||
|
- [ ] Verify message dialogs work correctly
|
||||||
|
|
||||||
|
## API Differences: GTK3 vs GTK4
|
||||||
|
|
||||||
|
| Feature | GTK3 | GTK4 |
|
||||||
|
|---------|------|------|
|
||||||
|
| Init | `gtk_init(&argc, &argv)` | `gtk_init_check()` |
|
||||||
|
| Container | `gtk_container_add()` | `gtk_window_set_child()` |
|
||||||
|
| Show | `gtk_widget_show_all()` | Widgets visible by default |
|
||||||
|
| Hide | `gtk_widget_hide()` | `gtk_widget_set_visible(w, FALSE)` |
|
||||||
|
| Clipboard | `GtkClipboard` | `GdkClipboard` |
|
||||||
|
| Menu | `GtkMenu/GtkMenuItem` | `GMenu/GAction` |
|
||||||
|
| Menu Bar | `GtkMenuBar` | `GtkPopoverMenuBar` |
|
||||||
|
| Window Move | `gtk_window_move()` | NO-OP on Wayland |
|
||||||
|
| Window Position | `gtk_window_get_position()` | Not available on Wayland |
|
||||||
|
| Destroy | `gtk_widget_destroy()` | `gtk_window_destroy()` |
|
||||||
|
| Drag Start | `gtk_window_begin_move_drag()` | `gtk_native_get_surface()` + surface drag |
|
||||||
|
|
||||||
|
## Files Reference
|
||||||
|
|
||||||
|
### GTK3 (Default) Files
|
||||||
|
```
|
||||||
|
v3/pkg/application/
|
||||||
|
linux_cgo.go # Main CGO (!gtk4 tag - default)
|
||||||
|
application_linux.go # App lifecycle (!gtk4 tag - default)
|
||||||
|
|
||||||
|
v3/internal/assetserver/webview/
|
||||||
|
webkit2.go # WebKit2GTK helpers (!gtk4 tag - default)
|
||||||
|
request_linux.go # Request handling (!gtk4 tag - default)
|
||||||
|
responsewriter_linux.go # Response writing (!gtk4 tag - default)
|
||||||
|
|
||||||
|
v3/internal/capabilities/
|
||||||
|
capabilities_linux_gtk3.go # GTK3 capabilities (!gtk4 tag - default)
|
||||||
|
|
||||||
|
v3/internal/operatingsystem/
|
||||||
|
webkit_linux.go # WebKit version info (!gtk4 tag - default)
|
||||||
|
```
|
||||||
|
|
||||||
|
### GTK4 (Experimental) Files
|
||||||
|
```
|
||||||
|
v3/pkg/application/
|
||||||
|
linux_cgo_gtk4.go # Main CGO (gtk4 tag - experimental)
|
||||||
|
application_linux_gtk4.go # App lifecycle (gtk4 tag - experimental)
|
||||||
|
|
||||||
|
v3/internal/assetserver/webview/
|
||||||
|
webkit6.go # WebKitGTK 6.0 helpers (gtk4 tag - experimental)
|
||||||
|
request_linux_gtk4.go # Request handling (gtk4 tag - experimental)
|
||||||
|
responsewriter_linux_gtk4.go # Response writing (gtk4 tag - experimental)
|
||||||
|
|
||||||
|
v3/internal/capabilities/
|
||||||
|
capabilities_linux.go # GTK4 capabilities (gtk4 tag - experimental)
|
||||||
|
|
||||||
|
v3/internal/operatingsystem/
|
||||||
|
webkit_linux_gtk4.go # WebKit version info (gtk4 tag - experimental)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shared Files (no GTK-specific code)
|
||||||
|
```
|
||||||
|
v3/pkg/application/
|
||||||
|
webview_window_linux.go # Window wrapper (uses methods from CGO files)
|
||||||
|
systemtray_linux.go # D-Bus based, GTK-agnostic
|
||||||
|
|
||||||
|
v3/internal/assetserver/webview/
|
||||||
|
request.go # Interface definitions
|
||||||
|
responsewriter.go # Interface definitions
|
||||||
|
```
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
### 2026-01-07 (Session 11)
|
||||||
|
- Fixed GTK4 dialog system bugs
|
||||||
|
- **File Dialog Fix**: Removed premature `g_object_unref()` that freed dialog before async callback
|
||||||
|
- GTK4 async dialogs manage their own lifecycle
|
||||||
|
- Commit: `6f9c5beb5`
|
||||||
|
- **Alert Dialog Fixes**:
|
||||||
|
- Removed premature `g_object_unref(dialog)` from `show_alert_dialog()` (same issue as file dialogs)
|
||||||
|
- Fixed deadlock in `dialogs_linux.go` - `InvokeAsync` → `go func()` since `runQuestionDialog` blocks internally
|
||||||
|
- Fixed `runQuestionDialog` to use `options.Title` as message (was using `options.Message`)
|
||||||
|
- Added default "OK" button when no buttons specified
|
||||||
|
- Commit: `1a77e6091`
|
||||||
|
- **Other Fixes**:
|
||||||
|
- Fixed checkptr errors with `-race` flag by changing C signal functions to accept `uintptr_t` (`3999f1f24`)
|
||||||
|
- Fixed ExecJS race condition by adding mutex for `runtimeLoaded`/`pendingJS` (`8e386034e`)
|
||||||
|
- Added DEBUG_LOG macro for compile-time debug output: `CGO_CFLAGS="-DWAILS_GTK_DEBUG" go build ...`
|
||||||
|
- Added manual dialog test suite in `v3/test/manual/dialog/`
|
||||||
|
- **Additional Dialog Fixes** (Session 11 continued):
|
||||||
|
- Added `gtk_file_dialog_set_accept_label()` for custom button text
|
||||||
|
- Added `gtk_file_dialog_select_multiple_folders()` for multiple directory selection
|
||||||
|
- Fixed data race in `application.go` cleanup - was using RLock() when writing `a.windows = nil`
|
||||||
|
- Documented GTK4 portal limitations (ShowHiddenFiles, CanCreateDirectories have no effect)
|
||||||
|
- Files modified:
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.go` - dialog fixes, race fixes, accept label, multiple folders
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.c` - DEBUG_LOG macro, alert dialog lifecycle fix, select_multiple_folders callback
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.h` - uintptr_t for signal functions
|
||||||
|
- `v3/pkg/application/dialogs_linux.go` - deadlock fix
|
||||||
|
- `v3/pkg/application/webview_window.go` - pendingJS mutex
|
||||||
|
- `v3/pkg/application/application.go` - RLock → Lock for cleanup writes
|
||||||
|
- `docs/src/content/docs/reference/dialogs.mdx` - documented GTK4 limitations
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 10)
|
||||||
|
- Fixed Window → Zoom menu behavior to toggle maximize/restore (was incorrectly calling webview zoomIn)
|
||||||
|
- Fixed radio button styling in GTK4 GMenu (now shows dots instead of checkmarks)
|
||||||
|
- Implemented proper GMenu radio groups with string-valued stateful actions
|
||||||
|
- All items in group share same action name with unique target values
|
||||||
|
- Added `create_radio_menu_item()` C helper and `menuRadioItemNewWithGroup()` Go wrapper
|
||||||
|
- Researched Wayland minimize behavior:
|
||||||
|
- `gtk_window_minimize()` works on GNOME/KDE (sends xdg_toplevel_set_minimized)
|
||||||
|
- May be no-op on tiling WMs (Sway, etc.) per Wayland protocol design
|
||||||
|
- Fixed app not terminating when last window closed
|
||||||
|
- Added quit logic to `unregisterWindow()` in `application_linux_gtk4.go`
|
||||||
|
- Respects `DisableQuitOnLastWindowClosed` option
|
||||||
|
- Fixed menu separators not showing
|
||||||
|
- GMenu uses sections for visual separators (not separate separator items)
|
||||||
|
- Rewrote menu processing to group items into sections, separators create new sections
|
||||||
|
- Added `menuNewSection()`, `menuAppendSection()`, `menuAppendItemToSection()` helpers
|
||||||
|
- Added CSS provider to reduce popover menu padding
|
||||||
|
- Removed all debug println statements
|
||||||
|
- Files modified:
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.go` - added radio group support, section helpers
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.c` - added create_radio_menu_item(), init_menu_css()
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.h` - added function declaration
|
||||||
|
- `v3/pkg/application/application_linux_gtk4.go` - added quit-on-last-window logic
|
||||||
|
- `v3/pkg/application/menu_linux_gtk4.go` - section-based menu processing, radio groups
|
||||||
|
- `v3/pkg/application/menuitem_linux_gtk4.go` - updated radio item creation
|
||||||
|
- `v3/pkg/application/webview_window_linux.go` - fixed zoom() to toggle maximize
|
||||||
|
- `v3/pkg/application/window_manager.go` - removed debug output
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 9)
|
||||||
|
- Fixed GTK4 window creation crash (SIGSEGV in gtk_application_window_new)
|
||||||
|
- **Root Cause**: GTK4 requires app to be "activated" before creating windows
|
||||||
|
- **Solution**: Added activation synchronization mechanism:
|
||||||
|
- Added `activated` channel and `sync.Once` to `linuxApp` struct
|
||||||
|
- Added `markActivated()` method called from `activateLinux()` callback
|
||||||
|
- Added `waitForActivation()` method for callers to block until ready
|
||||||
|
- Modified `WebviewWindow.Run()` to wait for activation before `InvokeSync`
|
||||||
|
- Files modified:
|
||||||
|
- `v3/pkg/application/application_linux_gtk4.go` - activation gate
|
||||||
|
- `v3/pkg/application/linux_cgo_gtk4.go` - call markActivated() in activateLinux
|
||||||
|
- `v3/pkg/application/webview_window.go` - wait for activation on GTK4
|
||||||
|
- GTK4 apps now create windows successfully without crashes
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 8)
|
||||||
|
- Fixed GTK3/GTK4 symbol conflict in operatingsystem package
|
||||||
|
- Added `gtk3` build tag to `v3/internal/operatingsystem/webkit_linux.go`
|
||||||
|
- Created `v3/internal/operatingsystem/webkit_linux_gtk4.go` with GTK4/WebKitGTK 6.0
|
||||||
|
- Moved app initialization from `init()` to `newPlatformApp()` for cleaner setup
|
||||||
|
- Resolved runtime crash: "GTK 2/3 symbols detected in GTK 4 process"
|
||||||
|
- Verified menu example runs successfully with GTK 4.20.3 and WebKitGTK 2.50.3
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 7)
|
||||||
|
- Completed Phase 9: Keyboard Accelerators
|
||||||
|
- Added namedKeysToGTK map with GDK keysym values for all special keys
|
||||||
|
- Added parseKeyGTK() and parseModifiersGTK() conversion functions
|
||||||
|
- Added acceleratorToGTK() to convert Wails accelerator format to GTK
|
||||||
|
- Added setMenuItemAccelerator() Go wrapper that calls C helpers
|
||||||
|
- Integrated accelerator setting in all menu item creation functions
|
||||||
|
- Uses gtk_application_set_accels_for_action() for GTK4 shortcut binding
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 6)
|
||||||
|
- Completed Phase 8: Dialog System
|
||||||
|
- Implemented GtkFileDialog for file open/save/folder dialogs
|
||||||
|
- Implemented GtkAlertDialog for message dialogs
|
||||||
|
- Added async callback system for GTK4 dialogs (no more gtk_dialog_run)
|
||||||
|
- Added C helper functions and Go wrapper functions
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 5 continued)
|
||||||
|
- Completed Phase 6: Docker & Build System
|
||||||
|
- Updated Dockerfile.linux-x86_64 and Dockerfile.linux-arm64 for GTK4 + GTK3
|
||||||
|
- Added BUILD_TAGS environment variable support in build scripts
|
||||||
|
- Added Taskfile targets for GTK4 (default) and GTK3 (legacy) builds
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 5)
|
||||||
|
- Completed Phase 5: Asset Server
|
||||||
|
- Verified WebKitGTK 6.0 uses same URI scheme handler API as WebKitGTK 4.1
|
||||||
|
- Added missing `onProcessRequest` export to linux_cgo_gtk4.go
|
||||||
|
- Added missing `sendMessageToBackend` export to linux_cgo_gtk4.go
|
||||||
|
- Confirmed asset server files (webkit6.go, request/responsewriter) are complete
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 4)
|
||||||
|
- Completed Phase 4: Menu System
|
||||||
|
- Implemented GMenu/GAction architecture for GTK4 menus
|
||||||
|
- Created GtkPopoverMenuBar integration
|
||||||
|
- Added menu_linux_gtk4.go and menuitem_linux_gtk4.go
|
||||||
|
- Added gtk3 build tags to original menu files
|
||||||
|
- Implemented stateful actions for checkboxes and radio items
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 3)
|
||||||
|
- Completed Phase 3: Window Management
|
||||||
|
- Implemented GTK4 event controllers (GtkEventControllerFocus, GtkGestureClick, GtkEventControllerKey)
|
||||||
|
- Implemented window drag using GdkToplevel API (gdk_toplevel_begin_move/resize)
|
||||||
|
- Implemented complete drag-and-drop with GtkDropTarget
|
||||||
|
- Fixed window state detection (isMinimised, isMaximised, isFullscreen)
|
||||||
|
- Fixed size() function to properly return window dimensions
|
||||||
|
- Updated windowSetGeometryHints for GTK4 (uses gtk_widget_set_size_request)
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 2)
|
||||||
|
- Completed Phase 2: Doctor & Capabilities
|
||||||
|
- Updated all 7 package managers for GTK4/WebKitGTK 6.0 as primary
|
||||||
|
- Added GTKVersion and WebKitVersion fields to Capabilities struct
|
||||||
|
- Created capabilities_linux_gtk3.go for legacy build path
|
||||||
|
|
||||||
|
### 2026-01-04 (Session 1)
|
||||||
|
- Initial implementation of GTK4 build infrastructure
|
||||||
|
- Added `gtk3` constraint to 5 existing files
|
||||||
|
- Created 5 new GTK4 stub files
|
||||||
|
- Updated UNRELEASED_CHANGELOG.md
|
||||||
419
IOS_ARCHITECTURE.md
Normal file
|
|
@ -0,0 +1,419 @@
|
||||||
|
# Wails v3 iOS Architecture
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
This document provides a comprehensive technical architecture for iOS support in Wails v3. The implementation enables Go applications to run natively on iOS with a WKWebView frontend, maintaining the Wails philosophy of using web technologies for UI while leveraging Go for business logic.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
1. [Architecture Overview](#architecture-overview)
|
||||||
|
2. [Core Components](#core-components)
|
||||||
|
3. [Layer Architecture](#layer-architecture)
|
||||||
|
4. [Implementation Details](#implementation-details)
|
||||||
|
5. [Battery Optimization](#battery-optimization)
|
||||||
|
6. [Build System](#build-system)
|
||||||
|
7. [Security Considerations](#security-considerations)
|
||||||
|
8. [API Reference](#api-reference)
|
||||||
|
|
||||||
|
## Architecture Overview
|
||||||
|
|
||||||
|
### Design Principles
|
||||||
|
|
||||||
|
1. **Battery Efficiency First**: All architectural decisions prioritize battery life
|
||||||
|
2. **No Network Ports**: Asset serving happens in-process via native APIs
|
||||||
|
3. **Minimal WebView Instances**: Maximum 2 concurrent WebViews (1 primary, 1 for transitions)
|
||||||
|
4. **Native Integration**: Deep iOS integration using Objective-C runtime
|
||||||
|
5. **Wails v3 Compatibility**: Maintain API compatibility with existing Wails v3 applications
|
||||||
|
|
||||||
|
### High-Level Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ iOS Application │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ UIKit Framework │
|
||||||
|
│ ┌─────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ WailsViewController │ │
|
||||||
|
│ │ ┌───────────────────────────────────────────────┐ │ │
|
||||||
|
│ │ │ WKWebView Instance │ │ │
|
||||||
|
│ │ │ ┌─────────────────────────────────────────┐ │ │ │
|
||||||
|
│ │ │ │ Web Application (HTML/JS) │ │ │ │
|
||||||
|
│ │ │ └─────────────────────────────────────────┘ │ │ │
|
||||||
|
│ │ └───────────────────────────────────────────────┘ │ │
|
||||||
|
│ └─────────────────────────────────────────────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ Bridge Layer (CGO) │
|
||||||
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||||||
|
│ │URL Handler │ │JS Bridge │ │Message Handler│ │
|
||||||
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ Go Runtime │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Wails Application │ │
|
||||||
|
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │
|
||||||
|
│ │ │App Logic │ │Services │ │Asset Server │ │ │
|
||||||
|
│ │ └──────────┘ └──────────┘ └──────────────────┘ │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Core Components
|
||||||
|
|
||||||
|
### 1. Platform Layer (`application_ios.go`)
|
||||||
|
|
||||||
|
**Purpose**: Go interface for iOS platform operations
|
||||||
|
|
||||||
|
**Key Functions**:
|
||||||
|
- `platformRun()`: Initialize and run the iOS application
|
||||||
|
- `platformQuit()`: Gracefully shutdown the application
|
||||||
|
- `isDarkMode()`: Detect iOS dark mode state
|
||||||
|
- `ExecuteJavaScript(windowID uint, js string)`: Execute JS in WebView
|
||||||
|
|
||||||
|
**Exported Go Functions (Called from Objective-C)**:
|
||||||
|
- `ServeAssetRequest(windowID C.uint, urlStr *C.char, callbackID C.uint)`
|
||||||
|
- `HandleJSMessage(windowID C.uint, message *C.char)`
|
||||||
|
|
||||||
|
### 2. Native iOS Layer (`application_ios.m`)
|
||||||
|
|
||||||
|
**Components**:
|
||||||
|
|
||||||
|
#### WailsSchemeHandler
|
||||||
|
```objc
|
||||||
|
@interface WailsSchemeHandler : NSObject <WKURLSchemeHandler>
|
||||||
|
```
|
||||||
|
- Implements `WKURLSchemeHandler` protocol
|
||||||
|
- Intercepts `wails://` URL requests
|
||||||
|
- Bridges to Go for asset serving
|
||||||
|
- Manages pending requests with callback IDs
|
||||||
|
|
||||||
|
**Methods**:
|
||||||
|
- `startURLSchemeTask:`: Intercept request, call Go handler
|
||||||
|
- `stopURLSchemeTask:`: Cancel pending request
|
||||||
|
- `completeRequest:withData:mimeType:`: Complete request with data from Go
|
||||||
|
|
||||||
|
#### WailsMessageHandler
|
||||||
|
```objc
|
||||||
|
@interface WailsMessageHandler : NSObject <WKScriptMessageHandler>
|
||||||
|
```
|
||||||
|
- Implements JavaScript to Go communication
|
||||||
|
- Handles `window.webkit.messageHandlers.external.postMessage()`
|
||||||
|
- Serializes messages to JSON for Go processing
|
||||||
|
|
||||||
|
**Methods**:
|
||||||
|
- `userContentController:didReceiveScriptMessage:`: Process JS messages
|
||||||
|
|
||||||
|
#### WailsViewController
|
||||||
|
```objc
|
||||||
|
@interface WailsViewController : UIViewController
|
||||||
|
```
|
||||||
|
- Main view controller containing WKWebView
|
||||||
|
- Manages WebView lifecycle
|
||||||
|
- Handles JavaScript execution requests
|
||||||
|
|
||||||
|
**Properties**:
|
||||||
|
- `webView`: WKWebView instance
|
||||||
|
- `schemeHandler`: Custom URL scheme handler
|
||||||
|
- `messageHandler`: JS message handler
|
||||||
|
- `windowID`: Unique window identifier
|
||||||
|
|
||||||
|
**Methods**:
|
||||||
|
- `viewDidLoad`: Initialize WebView with configuration
|
||||||
|
- `executeJavaScript:`: Run JS code in WebView
|
||||||
|
|
||||||
|
### 3. Bridge Layer (CGO)
|
||||||
|
|
||||||
|
**C Interface Functions**:
|
||||||
|
```c
|
||||||
|
void ios_app_init(void); // Initialize iOS app
|
||||||
|
void ios_app_run(void); // Run main loop
|
||||||
|
void ios_app_quit(void); // Quit application
|
||||||
|
bool ios_is_dark_mode(void); // Check dark mode
|
||||||
|
unsigned int ios_create_webview(void); // Create WebView
|
||||||
|
void ios_execute_javascript(unsigned int windowID, const char* js);
|
||||||
|
void ios_complete_request(unsigned int callbackID, const char* data, const char* mimeType);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Layer Architecture
|
||||||
|
|
||||||
|
### Layer 1: Presentation Layer (WebView)
|
||||||
|
|
||||||
|
**Responsibilities**:
|
||||||
|
- Render HTML/CSS/JavaScript UI
|
||||||
|
- Handle user interactions
|
||||||
|
- Communicate with native layer
|
||||||
|
|
||||||
|
**Key Features**:
|
||||||
|
- WKWebView for modern web standards
|
||||||
|
- Hardware-accelerated rendering
|
||||||
|
- Efficient memory management
|
||||||
|
|
||||||
|
### Layer 2: Communication Layer
|
||||||
|
|
||||||
|
**Request Interception**:
|
||||||
|
```
|
||||||
|
WebView Request → WKURLSchemeHandler → Go ServeAssetRequest → AssetServer → Response
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript Bridge**:
|
||||||
|
```
|
||||||
|
JS postMessage → WKScriptMessageHandler → Go HandleJSMessage → Process → ExecuteJavaScript
|
||||||
|
```
|
||||||
|
|
||||||
|
### Layer 3: Application Layer (Go)
|
||||||
|
|
||||||
|
**Components**:
|
||||||
|
- Application lifecycle management
|
||||||
|
- Service binding and method calls
|
||||||
|
- Asset serving from embedded fs.FS
|
||||||
|
- Business logic execution
|
||||||
|
|
||||||
|
### Layer 4: Platform Integration Layer
|
||||||
|
|
||||||
|
**iOS-Specific Features**:
|
||||||
|
- Dark mode detection
|
||||||
|
- System appearance integration
|
||||||
|
- iOS-specific optimizations
|
||||||
|
|
||||||
|
## Implementation Details
|
||||||
|
|
||||||
|
### Request Handling Flow
|
||||||
|
|
||||||
|
1. **WebView makes request** to `wails://localhost/path`
|
||||||
|
2. **WKURLSchemeHandler intercepts** request
|
||||||
|
3. **Creates callback ID** and stores `WKURLSchemeTask`
|
||||||
|
4. **Calls Go function** `ServeAssetRequest` with URL and callback ID
|
||||||
|
5. **Go processes request** through AssetServer
|
||||||
|
6. **Go calls** `ios_complete_request` with response data
|
||||||
|
7. **Objective-C completes** the `WKURLSchemeTask` with response
|
||||||
|
|
||||||
|
### JavaScript Execution Flow
|
||||||
|
|
||||||
|
1. **Go calls** `ios_execute_javascript` with JS code
|
||||||
|
2. **Bridge dispatches** to main thread
|
||||||
|
3. **WKWebView evaluates** JavaScript
|
||||||
|
4. **Completion handler** logs any errors
|
||||||
|
|
||||||
|
### Message Passing Flow
|
||||||
|
|
||||||
|
1. **JavaScript calls** `window.webkit.messageHandlers.wails.postMessage(data)`
|
||||||
|
2. **WKScriptMessageHandler receives** message
|
||||||
|
3. **Serializes to JSON** and passes to Go
|
||||||
|
4. **Go processes** message in `HandleJSMessage`
|
||||||
|
5. **Go can respond** via `ExecuteJavaScript`
|
||||||
|
|
||||||
|
## Battery Optimization
|
||||||
|
|
||||||
|
### WebView Configuration
|
||||||
|
|
||||||
|
```objc
|
||||||
|
// Disable unnecessary features
|
||||||
|
config.suppressesIncrementalRendering = NO;
|
||||||
|
config.allowsInlineMediaPlayback = YES;
|
||||||
|
config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Memory Management
|
||||||
|
|
||||||
|
1. **Single WebView Instance**: Reuse instead of creating new instances
|
||||||
|
2. **Automatic Reference Counting**: Use ARC for Objective-C objects
|
||||||
|
3. **Lazy Loading**: Initialize components only when needed
|
||||||
|
4. **Resource Cleanup**: Properly release resources when done
|
||||||
|
|
||||||
|
### Request Optimization
|
||||||
|
|
||||||
|
1. **In-Process Serving**: No network overhead
|
||||||
|
2. **Direct Memory Transfer**: Pass data directly without serialization
|
||||||
|
3. **Efficient Caching**: Leverage WKWebView's built-in cache
|
||||||
|
4. **Minimal Wake Locks**: No background network activity
|
||||||
|
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
### Build Tags
|
||||||
|
|
||||||
|
```go
|
||||||
|
//go:build ios
|
||||||
|
```
|
||||||
|
|
||||||
|
### CGO Configuration
|
||||||
|
|
||||||
|
```go
|
||||||
|
#cgo CFLAGS: -x objective-c -fobjc-arc
|
||||||
|
#cgo LDFLAGS: -framework Foundation -framework UIKit -framework WebKit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Script (`build_ios.sh`)
|
||||||
|
|
||||||
|
**Steps**:
|
||||||
|
1. Check dependencies (go, xcodebuild, xcrun)
|
||||||
|
2. Set up iOS cross-compilation environment
|
||||||
|
3. Build Go binary with iOS tags
|
||||||
|
4. Create app bundle structure
|
||||||
|
5. Generate Info.plist
|
||||||
|
6. Sign for simulator
|
||||||
|
7. Create launch script
|
||||||
|
|
||||||
|
**Environment Variables**:
|
||||||
|
```bash
|
||||||
|
export CGO_ENABLED=1
|
||||||
|
export GOOS=ios
|
||||||
|
export GOARCH=arm64
|
||||||
|
export SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-path)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Simulator Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
xcrun simctl install "$DEVICE_ID" "WailsIOSDemo.app"
|
||||||
|
xcrun simctl launch "$DEVICE_ID" "com.wails.iosdemo"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### URL Scheme Security
|
||||||
|
|
||||||
|
1. **Custom Scheme**: Use `wails://` to avoid conflicts
|
||||||
|
2. **Origin Validation**: Only serve to authorized WebViews
|
||||||
|
3. **No External Access**: Scheme handler only responds to app's WebView
|
||||||
|
|
||||||
|
### JavaScript Execution
|
||||||
|
|
||||||
|
1. **Input Validation**: Sanitize JS code before execution
|
||||||
|
2. **Sandboxed Execution**: WKWebView provides isolation
|
||||||
|
3. **No eval()**: Avoid dynamic code evaluation
|
||||||
|
|
||||||
|
### Data Protection
|
||||||
|
|
||||||
|
1. **In-Memory Only**: No temporary files on disk
|
||||||
|
2. **ATS Compliance**: App Transport Security enabled
|
||||||
|
3. **Secure Communication**: All data stays within app process
|
||||||
|
|
||||||
|
## API Reference
|
||||||
|
|
||||||
|
### Go API
|
||||||
|
|
||||||
|
#### Application Functions
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Create new iOS application
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Name: "App Name",
|
||||||
|
Description: "App Description",
|
||||||
|
})
|
||||||
|
|
||||||
|
// Run the application
|
||||||
|
app.Run()
|
||||||
|
|
||||||
|
// Execute JavaScript
|
||||||
|
app.ExecuteJavaScript(windowID, "console.log('Hello')")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Service Binding
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyService struct{}
|
||||||
|
|
||||||
|
func (s *MyService) Greet(name string) string {
|
||||||
|
return fmt.Sprintf("Hello, %s!", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
app := application.New(application.Options{
|
||||||
|
Services: []application.Service{
|
||||||
|
application.NewService(&MyService{}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### JavaScript API
|
||||||
|
|
||||||
|
#### Send Message to Go
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
window.webkit.messageHandlers.wails.postMessage({
|
||||||
|
type: 'methodCall',
|
||||||
|
service: 'MyService',
|
||||||
|
method: 'Greet',
|
||||||
|
args: ['World']
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Receive from Go
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
window.wailsCallback = function(data) {
|
||||||
|
console.log('Received:', data);
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Objective-C Bridge API
|
||||||
|
|
||||||
|
#### From Go to Objective-C
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Execute JavaScript
|
||||||
|
ios_execute_javascript(windowID, "alert('Hello')");
|
||||||
|
|
||||||
|
// Complete asset request
|
||||||
|
ios_complete_request(callbackID, htmlData, "text/html");
|
||||||
|
```
|
||||||
|
|
||||||
|
#### From Objective-C to Go
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Serve asset request
|
||||||
|
ServeAssetRequest(windowID, urlString, callbackID);
|
||||||
|
|
||||||
|
// Handle JavaScript message
|
||||||
|
HandleJSMessage(windowID, jsonMessage);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Metrics
|
||||||
|
|
||||||
|
### Target Metrics
|
||||||
|
|
||||||
|
- **WebView Creation**: < 100ms
|
||||||
|
- **Asset Request**: < 10ms for cached, < 50ms for first load
|
||||||
|
- **JS Execution**: < 5ms for simple scripts
|
||||||
|
- **Message Passing**: < 2ms round trip
|
||||||
|
- **Memory Usage**: < 50MB baseline
|
||||||
|
- **Battery Impact**: < 2% per hour active use
|
||||||
|
|
||||||
|
### Monitoring
|
||||||
|
|
||||||
|
1. **Xcode Instruments**: CPU, Memory, Energy profiling
|
||||||
|
2. **WebView Inspector**: JavaScript performance
|
||||||
|
3. **Go Profiling**: pprof for Go code analysis
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
### Phase 1: Core Stability
|
||||||
|
- [ ] Production-ready error handling
|
||||||
|
- [ ] Comprehensive test suite
|
||||||
|
- [ ] Performance optimization
|
||||||
|
|
||||||
|
### Phase 2: Feature Parity
|
||||||
|
- [ ] Multiple window support
|
||||||
|
- [ ] System tray integration
|
||||||
|
- [ ] Native menu implementation
|
||||||
|
|
||||||
|
### Phase 3: iOS-Specific Features
|
||||||
|
- [ ] Widget extension support
|
||||||
|
- [ ] App Clip support
|
||||||
|
- [ ] ShareSheet integration
|
||||||
|
- [ ] Siri Shortcuts
|
||||||
|
|
||||||
|
### Phase 4: Advanced Features
|
||||||
|
- [ ] Background task support
|
||||||
|
- [ ] Push notifications
|
||||||
|
- [ ] CloudKit integration
|
||||||
|
- [ ] Apple Watch companion app
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
This architecture provides a solid foundation for iOS support in Wails v3. The design prioritizes battery efficiency, native performance, and seamless integration with the existing Wails ecosystem. The proof of concept demonstrates all four required capabilities:
|
||||||
|
|
||||||
|
1. ✅ **WebView Creation**: Native WKWebView with optimized configuration
|
||||||
|
2. ✅ **Request Interception**: Custom scheme handler without network ports
|
||||||
|
3. ✅ **JavaScript Execution**: Bidirectional communication bridge
|
||||||
|
4. ✅ **iOS Simulator Support**: Complete build and deployment pipeline
|
||||||
|
|
||||||
|
The architecture is designed to scale from this proof of concept to a full production implementation while maintaining the simplicity and elegance that Wails developers expect.
|
||||||
|
|
@ -16,6 +16,11 @@ includes:
|
||||||
dir: v3
|
dir: v3
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
docs:
|
||||||
|
taskfile: docs
|
||||||
|
dir: docs
|
||||||
|
optional: true
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
contributors:check:
|
contributors:check:
|
||||||
cmds:
|
cmds:
|
||||||
|
|
|
||||||
21
docs/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# build output
|
||||||
|
dist/
|
||||||
|
# generated types
|
||||||
|
.astro/
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# logs
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
|
||||||
|
|
||||||
|
# environment variables
|
||||||
|
.env
|
||||||
|
.env.production
|
||||||
|
|
||||||
|
# macOS-specific files
|
||||||
|
.DS_Store
|
||||||
1
docs/.npmrc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
save-exact=true
|
||||||
4
docs/.vscode/extensions.json
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"recommendations": ["astro-build.astro-vscode"],
|
||||||
|
"unwantedRecommendations": []
|
||||||
|
}
|
||||||
11
docs/.vscode/launch.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "./node_modules/.bin/astro dev",
|
||||||
|
"name": "Development server",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
1
docs/CNAME
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
v3alpha.wails.io
|
||||||
65
docs/README.md
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
# Wails v3 Documentation
|
||||||
|
|
||||||
|
[](https://starlight.astro.build)
|
||||||
|
|
||||||
|
World-class documentation for Wails v3, redesigned following Netflix documentation principles.
|
||||||
|
|
||||||
|
## 📚 Documentation Redesign (2025-10-01)
|
||||||
|
|
||||||
|
This documentation has been completely redesigned to follow the **Netflix approach** to developer documentation:
|
||||||
|
|
||||||
|
- **Problem-first framing** - Start with why, not what
|
||||||
|
- **Progressive disclosure** - Multiple entry points for different skill levels
|
||||||
|
- **Real production examples** - No toy code
|
||||||
|
- **Story-Code-Context pattern** - Why → How → When
|
||||||
|
- **Scannable content** - Clear structure, visual aids
|
||||||
|
|
||||||
|
**Status:** Foundation complete (~20%), ready for content migration
|
||||||
|
|
||||||
|
See [IMPLEMENTATION_SUMMARY.md](./IMPLEMENTATION_SUMMARY.md) for full details.
|
||||||
|
|
||||||
|
## 🚀 Project Structure
|
||||||
|
|
||||||
|
Inside of your Astro + Starlight project, you'll see the following folders and
|
||||||
|
files:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
.
|
||||||
|
├── public/
|
||||||
|
├── src/
|
||||||
|
│ ├── assets/
|
||||||
|
│ ├── content/
|
||||||
|
│ │ ├── docs/
|
||||||
|
│ │ └── config.ts
|
||||||
|
│ └── env.d.ts
|
||||||
|
├── astro.config.mjs
|
||||||
|
├── package.json
|
||||||
|
└── tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory.
|
||||||
|
Each file is exposed as a route based on its file name.
|
||||||
|
|
||||||
|
Images can be added to `src/assets/` and embedded in Markdown with a relative
|
||||||
|
link.
|
||||||
|
|
||||||
|
Static assets, like favicons, can be placed in the `public/` directory.
|
||||||
|
|
||||||
|
## 🧞 Commands
|
||||||
|
|
||||||
|
All commands are run from the root of the project, from a terminal:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
| :------------------------ | :----------------------------------------------- |
|
||||||
|
| `npm install` | Installs dependencies |
|
||||||
|
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||||
|
| `npm run build` | Build your production site to `./dist/` |
|
||||||
|
| `npm run preview` | Preview your build locally, before deploying |
|
||||||
|
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||||
|
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||||
|
|
||||||
|
## 👀 Want to learn more?
|
||||||
|
|
||||||
|
Check out [Starlight’s docs](https://starlight.astro.build/), read
|
||||||
|
[the Astro documentation](https://docs.astro.build), or jump into the
|
||||||
|
[Astro Discord server](https://astro.build/chat).
|
||||||
36
docs/Taskfile.yml
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# https://taskfile.dev
|
||||||
|
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
vars:
|
||||||
|
# Change this to switch package managers: bun, npm, pnpm, yarn
|
||||||
|
PKG_MANAGER: npm
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
|
||||||
|
setup:
|
||||||
|
summary: Setup the project (including D2 diagram tool)
|
||||||
|
preconditions:
|
||||||
|
- sh: '{{.PKG_MANAGER}} --version'
|
||||||
|
msg: "Looks like {{.PKG_MANAGER}} isn't installed."
|
||||||
|
- sh: 'go version'
|
||||||
|
msg: "Go is not installed. Install from https://go.dev/dl/"
|
||||||
|
cmds:
|
||||||
|
- '{{.PKG_MANAGER}} install'
|
||||||
|
- go install oss.terrastruct.com/d2@latest
|
||||||
|
- echo "✓ Setup complete. D2 installed to $(go env GOPATH)/bin/d2"
|
||||||
|
|
||||||
|
dev:
|
||||||
|
summary: Run the dev server
|
||||||
|
deps: [setup]
|
||||||
|
cmds:
|
||||||
|
- '{{.PKG_MANAGER}} run dev'
|
||||||
|
|
||||||
|
build:
|
||||||
|
summary: Build the docs
|
||||||
|
preconditions:
|
||||||
|
- sh: '{{.PKG_MANAGER}} --version'
|
||||||
|
msg: "Looks like {{.PKG_MANAGER}} isn't installed."
|
||||||
|
cmds:
|
||||||
|
- '{{.PKG_MANAGER}} run build'
|
||||||
|
|
||||||
351
docs/astro.config.mjs
Normal file
|
|
@ -0,0 +1,351 @@
|
||||||
|
// @ts-check
|
||||||
|
import { defineConfig } from "astro/config";
|
||||||
|
import starlight from "@astrojs/starlight";
|
||||||
|
import sitemap from "@astrojs/sitemap";
|
||||||
|
import starlightLinksValidator from "starlight-links-validator";
|
||||||
|
import starlightImageZoom from "starlight-image-zoom";
|
||||||
|
import starlightBlog from "starlight-blog";
|
||||||
|
import { authors } from "./src/content/authors";
|
||||||
|
import d2 from 'astro-d2';
|
||||||
|
import react from '@astrojs/react';
|
||||||
|
|
||||||
|
// https://astro.build/config
|
||||||
|
export default defineConfig({
|
||||||
|
site: "https://wails.io",
|
||||||
|
trailingSlash: "ignore",
|
||||||
|
compressHTML: true,
|
||||||
|
output: "static",
|
||||||
|
build: { format: "directory" },
|
||||||
|
devToolbar: { enabled: true },
|
||||||
|
integrations: [
|
||||||
|
react(),
|
||||||
|
d2(),
|
||||||
|
sitemap(),
|
||||||
|
starlight({
|
||||||
|
title: "",
|
||||||
|
titleDelimiter: "",
|
||||||
|
logo: {
|
||||||
|
dark: "./src/assets/wails-logo-horizontal-dark.svg",
|
||||||
|
light: "./src/assets/wails-logo-horizontal-light.svg",
|
||||||
|
},
|
||||||
|
favicon: "./public/favicon.svg",
|
||||||
|
description: "Build beautiful desktop applications using Go and modern web technologies.",
|
||||||
|
pagefind: true,
|
||||||
|
customCss: ["./src/stylesheets/extra.css"],
|
||||||
|
lastUpdated: true,
|
||||||
|
pagination: true,
|
||||||
|
editLink: {
|
||||||
|
baseUrl: "https://github.com/wailsapp/wails/edit/v3-alpha/docs",
|
||||||
|
},
|
||||||
|
social: [
|
||||||
|
{ icon: 'github', label: 'GitHub', href: 'https://github.com/wailsapp/wails' },
|
||||||
|
{ icon: 'discord', label: 'Discord', href: 'https://discord.gg/JDdSxwjhGf' },
|
||||||
|
{ icon: 'x.com', label: 'X', href: 'https://x.com/wailsapp' },
|
||||||
|
],
|
||||||
|
head: [
|
||||||
|
{
|
||||||
|
tag: 'script',
|
||||||
|
content: `
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const socialLinks = document.querySelector('.social-icons');
|
||||||
|
if (socialLinks) {
|
||||||
|
const sponsorLink = document.createElement('a');
|
||||||
|
sponsorLink.href = 'https://github.com/sponsors/leaanthony';
|
||||||
|
sponsorLink.className = 'sl-flex';
|
||||||
|
sponsorLink.title = 'Sponsor';
|
||||||
|
sponsorLink.innerHTML = '<span class="sr-only">Sponsor</span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="#ef4444" stroke="none"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"/></svg>';
|
||||||
|
socialLinks.appendChild(sponsorLink);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
defaultLocale: "root",
|
||||||
|
locales: {
|
||||||
|
root: { label: "English", lang: "en", dir: "ltr" },
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
starlightImageZoom(),
|
||||||
|
starlightBlog({
|
||||||
|
title: "Wails Blog",
|
||||||
|
authors: authors,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
sidebar: [
|
||||||
|
{ label: "Home", link: "/" },
|
||||||
|
|
||||||
|
// Progressive Onboarding - Netflix Principle: Start with the problem
|
||||||
|
{ label: "Why Wails?", link: "/quick-start/why-wails" },
|
||||||
|
|
||||||
|
{
|
||||||
|
label: "Quick Start",
|
||||||
|
collapsed: false,
|
||||||
|
items: [
|
||||||
|
{ label: "Installation", link: "/quick-start/installation" },
|
||||||
|
{ label: "Your First App", link: "/quick-start/first-app" },
|
||||||
|
{ label: "Next Steps", link: "/quick-start/next-steps" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Tutorials
|
||||||
|
{
|
||||||
|
label: "Tutorials",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "tutorials" },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Core Concepts
|
||||||
|
{
|
||||||
|
label: "Core Concepts",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "How Wails Works", link: "/concepts/architecture" },
|
||||||
|
{ label: "Manager API", link: "/concepts/manager-api" },
|
||||||
|
{ label: "Application Lifecycle", link: "/concepts/lifecycle" },
|
||||||
|
{ label: "Go-Frontend Bridge", link: "/concepts/bridge" },
|
||||||
|
{ label: "Build System", link: "/concepts/build-system" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: "Features",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: "Windows",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Window Basics", link: "/features/windows/basics" },
|
||||||
|
{ label: "Window Options", link: "/features/windows/options" },
|
||||||
|
{ label: "Multiple Windows", link: "/features/windows/multiple" },
|
||||||
|
{ label: "Frameless Windows", link: "/features/windows/frameless" },
|
||||||
|
{ label: "Window Events", link: "/features/windows/events" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Menus",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Application Menus", link: "/features/menus/application" },
|
||||||
|
{ label: "Context Menus", link: "/features/menus/context" },
|
||||||
|
{ label: "System Tray Menus", link: "/features/menus/systray" },
|
||||||
|
{ label: "Menu Reference", link: "/features/menus/reference" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Bindings & Services",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Method Binding", link: "/features/bindings/methods" },
|
||||||
|
{ label: "Services", link: "/features/bindings/services" },
|
||||||
|
{ label: "Data Models", link: "/features/bindings/models" },
|
||||||
|
{ label: "Enums", link: "/features/bindings/enums" },
|
||||||
|
{ label: "Advanced Binding", link: "/features/bindings/advanced" },
|
||||||
|
{ label: "Best Practices", link: "/features/bindings/best-practices" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Events",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Event System", link: "/features/events/system" },
|
||||||
|
{ label: "Application Events", link: "/features/events/application" },
|
||||||
|
{ label: "Window Events", link: "/features/events/window" },
|
||||||
|
{ label: "Custom Events", link: "/features/events/custom" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Dialogs",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "File Dialogs", link: "/features/dialogs/file" },
|
||||||
|
{ label: "Message Dialogs", link: "/features/dialogs/message" },
|
||||||
|
{ label: "Custom Dialogs", link: "/features/dialogs/custom" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Clipboard",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/clipboard" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Browser",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/browser" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Drag & Drop",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/drag-and-drop" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Keyboard",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/keyboard" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Notifications",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/notifications" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Screens",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/screens" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Environment",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/environment" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Platform-Specific",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "features/platform" },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Guides - Task-oriented patterns (Netflix: When to use it, when not to use it)
|
||||||
|
{
|
||||||
|
label: "Guides",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
label: "Development",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Project Structure", link: "/guides/dev/project-structure" },
|
||||||
|
{ label: "Development Workflow", link: "/guides/dev/workflow" },
|
||||||
|
{ label: "Debugging", link: "/guides/dev/debugging" },
|
||||||
|
{ label: "Testing", link: "/guides/dev/testing" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Building & Packaging",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Building Applications", link: "/guides/build/building" },
|
||||||
|
{ label: "Build Customization", link: "/guides/build/customization" },
|
||||||
|
{ label: "Cross-Platform Builds", link: "/guides/build/cross-platform" },
|
||||||
|
{ label: "Code Signing", link: "/guides/build/signing" },
|
||||||
|
{ label: "Windows Packaging", link: "/guides/build/windows" },
|
||||||
|
{ label: "macOS Packaging", link: "/guides/build/macos" },
|
||||||
|
{ label: "Linux Packaging", link: "/guides/build/linux" },
|
||||||
|
{ label: "MSIX Packaging", link: "/guides/build/msix" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Distribution",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Auto-Updates", link: "/guides/distribution/auto-updates" },
|
||||||
|
{ label: "File Associations", link: "/guides/distribution/file-associations" },
|
||||||
|
{ label: "Custom Protocols", link: "/guides/distribution/custom-protocols" },
|
||||||
|
{ label: "Single Instance", link: "/guides/distribution/single-instance" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Integration Patterns",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Using Gin Router", link: "/guides/patterns/gin-routing" },
|
||||||
|
{ label: "Gin Services", link: "/guides/patterns/gin-services" },
|
||||||
|
{ label: "Database Integration", link: "/guides/patterns/database" },
|
||||||
|
{ label: "REST APIs", link: "/guides/patterns/rest-api" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Advanced Topics",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Server Build", link: "/guides/server-build", badge: { text: "Experimental", variant: "caution" } },
|
||||||
|
{ label: "Custom Templates", link: "/guides/advanced/custom-templates" },
|
||||||
|
{ label: "WML (Wails Markup)", link: "/guides/advanced/wml" },
|
||||||
|
{ label: "Panic Handling", link: "/guides/advanced/panic-handling" },
|
||||||
|
{ label: "Security Best Practices", link: "/guides/advanced/security" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Reference - Comprehensive API docs (Netflix: Complete technical reference)
|
||||||
|
{
|
||||||
|
label: "API Reference",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Overview", link: "/reference/overview" },
|
||||||
|
{ label: "Application", link: "/reference/application" },
|
||||||
|
{ label: "Window", link: "/reference/window" },
|
||||||
|
{ label: "Menu", link: "/reference/menu" },
|
||||||
|
{ label: "Events", link: "/reference/events" },
|
||||||
|
{ label: "Dialogs", link: "/reference/dialogs" },
|
||||||
|
{ label: "Frontend Runtime", link: "/reference/frontend-runtime" },
|
||||||
|
{ label: "CLI", link: "/reference/cli" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Contributing
|
||||||
|
{
|
||||||
|
label: "Contributing",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Getting Started", link: "/contributing/getting-started" },
|
||||||
|
{ label: "Development Setup", link: "/contributing/setup" },
|
||||||
|
{ label: "Coding Standards", link: "/contributing/standards" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Migration & Troubleshooting
|
||||||
|
{
|
||||||
|
label: "Migration",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "From v2 to v3", link: "/migration/v2-to-v3" },
|
||||||
|
{ label: "From Electron", link: "/migration/from-electron" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: "Troubleshooting",
|
||||||
|
collapsed: true,
|
||||||
|
autogenerate: { directory: "troubleshooting" },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Community & Resources
|
||||||
|
{
|
||||||
|
label: "Community",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Links", link: "/community/links" },
|
||||||
|
{ label: "Templates", link: "/community/templates" },
|
||||||
|
{
|
||||||
|
label: "Showcase",
|
||||||
|
collapsed: true,
|
||||||
|
items: [
|
||||||
|
{ label: "Overview", link: "/community/showcase" },
|
||||||
|
{
|
||||||
|
label: "Applications",
|
||||||
|
autogenerate: {
|
||||||
|
directory: "community/showcase",
|
||||||
|
collapsed: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
{ label: "What's New", link: "/whats-new" },
|
||||||
|
{ label: "Status", link: "/status" },
|
||||||
|
{ label: "Changelog", link: "/changelog" },
|
||||||
|
{
|
||||||
|
label: "Sponsor",
|
||||||
|
link: "https://github.com/sponsors/leaanthony",
|
||||||
|
badge: { text: "❤️" },
|
||||||
|
},
|
||||||
|
{ label: "Credits", link: "/credits" },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
||||||
9082
docs/package-lock.json
generated
Normal file
31
docs/package.json
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name": "wails-docs",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "astro dev",
|
||||||
|
"start": "astro dev",
|
||||||
|
"build": "astro check && astro build",
|
||||||
|
"preview": "astro preview",
|
||||||
|
"astro": "astro"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@astrojs/check": "^0.9.4",
|
||||||
|
"@astrojs/react": "^4.1.0",
|
||||||
|
"@astrojs/starlight": "0.36.2",
|
||||||
|
"@types/react": "^19.0.1",
|
||||||
|
"@types/react-dom": "^19.0.2",
|
||||||
|
"astro": "^5.0.0",
|
||||||
|
"astro-d2": "^0.5.0",
|
||||||
|
"framer-motion": "^11.14.4",
|
||||||
|
"motion": "^11.14.4",
|
||||||
|
"react": "^19.0.0",
|
||||||
|
"react-dom": "^19.0.0",
|
||||||
|
"sharp": "^0.33.5",
|
||||||
|
"starlight-blog": "0.25.1",
|
||||||
|
"starlight-image-zoom": "^0.9.0",
|
||||||
|
"starlight-links-validator": "^0.13.4",
|
||||||
|
"starlight-showcases": "^0.2.0",
|
||||||
|
"typescript": "^5.7.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
188
docs/public/d2/docs/DEVELOPER_GUIDE-0.svg
Normal file
|
After Width: | Height: | Size: 38 KiB |
181
docs/public/d2/docs/DEVELOPER_GUIDE-1.svg
Normal file
|
After Width: | Height: | Size: 33 KiB |
1
docs/public/favicon.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" version="1.1" viewBox="0 0 550 310" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M0.883,-0.081L0.121,0.081L0.256,-0.063L0.883,-0.081Z" transform="matrix(-166.599,4.57132,4.57132,166.599,147.403,167.648)" style="fill:url(#_Linear1);fill-rule:nonzero"/></g><g><path d="M0.878,-0.285L-0.073,0.71L-1.186,0.542L0.015,0.207L-0.846,0.077L0.355,-0.258L-0.505,-0.388L0.649,-0.71L0.878,-0.285Z" transform="matrix(-106.443,-16.0669,-16.0669,106.443,428.19,188.033)" style="fill:url(#_Linear2);fill-rule:nonzero"/></g><g><path d="M0.44,-0.04L0.265,-0.056L0.177,0.437L-0.311,-0.255L0.262,-0.437L0.568,-0.437L0.44,-0.04Z" transform="matrix(-114.484,-162.408,-162.408,114.484,333.291,285.804)" style="fill:url(#_Linear3);fill-rule:nonzero"/></g><g><path d="M0.622,-0.115L0.761,-0.115L0.806,-0.013L0.826,0.182L0.622,-0.115Z" transform="matrix(238.126,298.893,298.893,-238.126,113.516,-150.536)" style="fill:url(#_Linear4);fill-rule:nonzero"/></g><g><path d="M0.467,0.005L0.49,0.062L0.271,-0.062L0.467,0.005Z" transform="matrix(-369.529,-97.4118,-97.4118,369.529,582.38,94.027)" style="fill:url(#_Linear5);fill-rule:nonzero"/></g><g><path d="M0.2,0.001L0.219,-0.018L0.614,0.012L0.519,0.089L0.282,0.068L0.2,0.135L0.463,0.194L0.374,0.266L0.138,0.186L0.047,0.033L-0.131,-0.266L0.2,0.001Z" transform="matrix(-496.156,-53.9751,-53.9751,496.156,367.888,125.085)" style="fill:url(#_Linear6);fill-rule:nonzero"/></g><g><path d="M269.095,104.527L287.764,111.419L263.632,106.75L269.095,104.527Z" transform="matrix(0.436503,-1.22916,4.88651,1.73532,-368.043,253.619)" style="fill:#fff"/></g><defs><linearGradient id="_Linear1" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-3.46945e-18,3.46945e-18,1,0,-3.05761e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear2" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,0,0,1,0,-2.75467e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear3" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-1.11022e-16,1.11022e-16,1,0,-2.61861e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear4" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(-0.801899,-0.59746,0.59746,-0.801899,1.3495,0.447457)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear5" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,-2.77556e-17,2.77556e-17,1,0,-1.92826e-06)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient><linearGradient id="_Linear6" x1="0" x2="1" y1="0" y2="0" gradientTransform="matrix(1,0,0,1,0,9.68429e-07)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#e33232;stop-opacity:1"/><stop offset="1" style="stop-color:#6b000d;stop-opacity:1"/></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
BIN
docs/public/missing.png
Normal file
|
After Width: | Height: | Size: 498 KiB |
BIN
docs/public/showcase-images/bboard.webp
Normal file
|
After Width: | Height: | Size: 8 KiB |
BIN
docs/public/showcase-images/cfntracker.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/public/showcase-images/edex-ui.webp
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
docs/public/showcase-images/emailit.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/public/showcase-images/encrypteasy.webp
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
docs/public/showcase-images/filehound.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/public/showcase-images/gamestacker.webp
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
docs/public/showcase-images/hiposter.webp
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
docs/public/showcase-images/mchat.webp
Normal file
|
After Width: | Height: | Size: 503 KiB |
BIN
docs/public/showcase-images/minecraft-mod-updater.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/public/showcase-images/minesweeper-xp.webp
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/public/showcase-images/modalfilemanager.webp
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/public/showcase-images/mollywallet.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
docs/public/showcase-images/october.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/public/showcase-images/optimus.webp
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
docs/public/showcase-images/portfall.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/public/showcase-images/resizem.webp
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/public/showcase-images/riftshare-main.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/public/showcase-images/scriptbar.webp
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
docs/public/showcase-images/tiny-rdm1.webp
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
docs/public/showcase-images/tiny-rdm2.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
docs/public/showcase-images/varly2.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/public/showcase-images/wailsterm.webp
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
docs/public/showcase-images/wally.webp
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
docs/public/showcase-images/wombat.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
docs/public/showcase-images/ytd.webp
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
docs/public/sponsors/jetbrains-grayscale.webp
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
197
docs/public/sponsors/sponsors.svg
Normal file
|
After Width: | Height: | Size: 235 KiB |
BIN
docs/public/sponsors/zsa.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
docs/src/assets/blog-images/browser.webp
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
docs/src/assets/blog-images/build-cross-windows.webp
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/src/assets/blog-images/build-darwin-amd.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/assets/blog-images/build-darwin-arm.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/assets/blog-images/build-darwin-universal.webp
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/src/assets/blog-images/devtools.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
docs/src/assets/blog-images/linux-build-cross-windows.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/src/assets/blog-images/montage.png
Normal file
|
After Width: | Height: | Size: 177 KiB |
BIN
docs/src/assets/blog-images/multiwindow.webp
Normal file
|
After Width: | Height: | Size: 269 KiB |
BIN
docs/src/assets/blog-images/remote-linux.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
docs/src/assets/blog-images/remote-mac.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/src/assets/blog-images/remote.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
docs/src/assets/blog-images/vscode.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/assets/blog-images/wails-linux.webp
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
docs/src/assets/blog-images/wails-mac.webp
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/src/assets/blog-images/wails-menus-linux.webp
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
docs/src/assets/blog-images/wails-menus-mac.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/assets/blog-images/wails-menus.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/src/assets/blog-images/wails.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
246
docs/src/assets/contributors.html
Normal file
|
|
@ -0,0 +1,246 @@
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<!--GAMFC_DELIMITER-->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/leaanthony"><img src="https://avatars.githubusercontent.com/u/1943904?v=4?s=75" width="75px;" alt="Lea Anthony"/><br /><sub><b>Lea Anthony</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Code">💻</a> <a href="#ideas-leaanthony" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-leaanthony" title="Design">🎨</a> <a href="#content-leaanthony" title="Content">🖋</a> <a href="#example-leaanthony" title="Examples">💡</a> <a href="#mentoring-leaanthony" title="Mentoring">🧑🏫</a> <a href="#projectManagement-leaanthony" title="Project Management">📆</a> <a href="#tool-leaanthony" title="Tools">🔧</a> <a href="https://github.com/wailsapp/wails/yssues?q=author%3Aleaanthony" title="Bug reports">🐛</a> <a href="#blog-leaanthony" title="Blogposts">📝</a> <a href="#maintenance-leaanthony" title="Maintenance">🚧</a> <a href="#platform-leaanthony" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aleaanthony" title="Reviewed Pull Requests">👀</a> <a href="#question-leaanthony" title="Answering Questions">💬</a> <a href="#research-leaanthony" title="Research">🔬</a> <a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Tests">⚠️</a> <a href="#tutorial-leaanthony" title="Tutorials">✅</a> <a href="#talk-leaanthony" title="Talks">📢</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aleaanthony" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=leaanthony" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stffabi"><img src="https://avatars.githubusercontent.com/u/9464631?v=4?s=75" width="75px;" alt="stffabi"/><br /><sub><b>stffabi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Code">💻</a> <a href="#ideas-stffabi" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-stffabi" title="Design">🎨</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Astffabi" title="Bug reports">🐛</a> <a href="#maintenance-stffabi" title="Maintenance">🚧</a> <a href="#platform-stffabi" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Astffabi" title="Reviewed Pull Requests">👀</a> <a href="#question-stffabi" title="Answering Questions">💬</a> <a href="#research-stffabi" title="Research">🔬</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Astffabi" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/commits?author=stffabi" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tmclane"><img src="https://avatars.githubusercontent.com/u/511975?v=4?s=75" width="75px;" alt="Travis McLane"/><br /><sub><b>Travis McLane</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Code">💻</a> <a href="#research-tmclane" title="Research">🔬</a> <a href="#platform-tmclane" title="Packaging/porting to new platform">📦</a> <a href="#ideas-tmclane" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Atmclane" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Atmclane" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Tests">⚠️</a> <a href="#question-tmclane" title="Answering Questions">💬</a> <a href="https://github.com/wailsapp/wails/commits?author=tmclane" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://misitebao.com/"><img src="https://avatars.githubusercontent.com/u/28185258?v=4?s=75" width="75px;" alt="Misite Bao"/><br /><sub><b>Misite Bao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=misitebao" title="Documentation">📖</a> <a href="#translation-misitebao" title="Translation">🌍</a> <a href="#research-misitebao" title="Research">🔬</a> <a href="#maintenance-misitebao" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bh90210"><img src="https://avatars.githubusercontent.com/u/22690219?v=4?s=75" width="75px;" alt="Byron Chris"/><br /><sub><b>Byron Chris</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bh90210" title="Code">💻</a> <a href="#research-bh90210" title="Research">🔬</a> <a href="#maintenance-bh90210" title="Maintenance">🚧</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Abh90210" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Abh90210" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/wailsapp/wails/commits?author=bh90210" title="Tests">⚠️</a> <a href="#question-bh90210" title="Answering Questions">💬</a> <a href="#ideas-bh90210" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-bh90210" title="Design">🎨</a> <a href="#platform-bh90210" title="Packaging/porting to new platform">📦</a> <a href="#infra-bh90210" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/konez2k"><img src="https://avatars.githubusercontent.com/u/32417933?v=4?s=75" width="75px;" alt="konez2k"/><br /><sub><b>konez2k</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=konez2k" title="Code">💻</a> <a href="#platform-konez2k" title="Packaging/porting to new platform">📦</a> <a href="#ideas-konez2k" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dedo1911"><img src="https://avatars.githubusercontent.com/u/1364496?v=4?s=75" width="75px;" alt="Dario Emerson"/><br /><sub><b>Dario Emerson</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=dedo1911" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Adedo1911" title="Bug reports">🐛</a> <a href="#ideas-dedo1911" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=dedo1911" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ianmjones.com/"><img src="https://avatars.githubusercontent.com/u/4710?v=4?s=75" width="75px;" alt="Ian M. Jones"/><br /><sub><b>Ian M. Jones</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ianmjones" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aianmjones" title="Bug reports">🐛</a> <a href="#ideas-ianmjones" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=ianmjones" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Aianmjones" title="Reviewed Pull Requests">👀</a> <a href="#platform-ianmjones" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/marktohark"><img src="https://avatars.githubusercontent.com/u/19359934?v=4?s=75" width="75px;" alt="marktohark"/><br /><sub><b>marktohark</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marktohark" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rh12503"><img src="https://avatars.githubusercontent.com/u/48951973?v=4?s=75" width="75px;" alt="Ryan H"/><br /><sub><b>Ryan H</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rh12503" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://codybentley.dev/"><img src="https://avatars.githubusercontent.com/u/6968902?v=4?s=75" width="75px;" alt="Cody Bentley"/><br /><sub><b>Cody Bentley</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=codydbentley" title="Code">💻</a> <a href="#platform-codydbentley" title="Packaging/porting to new platform">📦</a> <a href="#ideas-codydbentley" title="Ideas, Planning, & Feedback">🤔</a> <a href="#financial-codydbentley" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/napalu"><img src="https://avatars.githubusercontent.com/u/6690378?v=4?s=75" width="75px;" alt="Florent"/><br /><sub><b>Florent</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=napalu" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Anapalu" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/akhudek"><img src="https://avatars.githubusercontent.com/u/147633?v=4?s=75" width="75px;" alt="Alexander Hudek"/><br /><sub><b>Alexander Hudek</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=akhudek" title="Code">💻</a> <a href="#financial-akhudek" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/timkippdev"><img src="https://avatars.githubusercontent.com/u/37030721?v=4?s=75" width="75px;" alt="Tim Kipp"/><br /><sub><b>Tim Kipp</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=timkippdev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gelleson"><img src="https://avatars.githubusercontent.com/u/44272887?v=4?s=75" width="75px;" alt="Altynbek Kaliakbarov"/><br /><sub><b>Altynbek Kaliakbarov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gelleson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Chronophylos"><img src="https://avatars.githubusercontent.com/u/14890588?v=4?s=75" width="75px;" alt="Nikolai Zimmermann"/><br /><sub><b>Nikolai Zimmermann</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Chronophylos" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/k-muchmore"><img src="https://avatars.githubusercontent.com/u/16393095?v=4?s=75" width="75px;" alt="k-muchmore"/><br /><sub><b>k-muchmore</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=k-muchmore" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://peakd.com/@snider"><img src="https://avatars.githubusercontent.com/u/631881?v=4?s=75" width="75px;" alt="Snider"/><br /><sub><b>Snider</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Snider" title="Code">💻</a> <a href="#ideas-Snider" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=Snider" title="Documentation">📖</a> <a href="#financial-Snider" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/albert-sun"><img src="https://avatars.githubusercontent.com/u/54585592?v=4?s=75" width="75px;" alt="Albert Sun"/><br /><sub><b>Albert Sun</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=albert-sun" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=albert-sun" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/adalessa"><img src="https://avatars.githubusercontent.com/u/7914601?v=4?s=75" width="75px;" alt="Ariel"/><br /><sub><b>Ariel</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=adalessa" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aadalessa" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://triplebits.com/"><img src="https://avatars.githubusercontent.com/u/4365245?v=4?s=75" width="75px;" alt="Ilgıt Yıldırım"/><br /><sub><b>Ilgıt Yıldırım</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ilgityildirim" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ailgityildirim" title="Bug reports">🐛</a> <a href="#financial-ilgityildirim" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Vaelatern"><img src="https://avatars.githubusercontent.com/u/7906072?v=4?s=75" width="75px;" alt="Toyam Cox"/><br /><sub><b>Toyam Cox</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Vaelatern" title="Code">💻</a> <a href="#platform-Vaelatern" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AVaelatern" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hi019"><img src="https://avatars.githubusercontent.com/u/65871571?v=4?s=75" width="75px;" alt="hi019"/><br /><sub><b>hi019</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=hi019" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ahi019" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://artooro.com/"><img src="https://avatars.githubusercontent.com/u/393395?v=4?s=75" width="75px;" alt="Arthur Wiebe"/><br /><sub><b>Arthur Wiebe</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=artooro" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aartooro" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://sectcs.com/"><img src="https://avatars.githubusercontent.com/u/16898783?v=4?s=75" width="75px;" alt="Balakrishna Prasad Ganne"/><br /><sub><b>Balakrishna Prasad Ganne</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=aayush420" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/BillBuilt"><img src="https://avatars.githubusercontent.com/u/28831382?v=4?s=75" width="75px;" alt="BillBuilt"/><br /><sub><b>BillBuilt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=BillBuilt" title="Code">💻</a> <a href="#platform-BillBuilt" title="Packaging/porting to new platform">📦</a> <a href="#ideas-BillBuilt" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-BillBuilt" title="Answering Questions">💬</a> <a href="#financial-BillBuilt" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Juneezee"><img src="https://avatars.githubusercontent.com/u/20135478?v=4?s=75" width="75px;" alt="Eng Zer Jun"/><br /><sub><b>Eng Zer Jun</b></sub></a><br /><a href="#maintenance-Juneezee" title="Maintenance">🚧</a> <a href="https://github.com/wailsapp/wails/commits?author=Juneezee" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://lgiki.net/"><img src="https://avatars.githubusercontent.com/u/20807713?v=4?s=75" width="75px;" alt="LGiki"/><br /><sub><b>LGiki</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LGiki" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lontten"><img src="https://avatars.githubusercontent.com/u/30745595?v=4?s=75" width="75px;" alt="Lontten"/><br /><sub><b>Lontten</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=lontten" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/phoenix147"><img src="https://avatars.githubusercontent.com/u/809358?v=4?s=75" width="75px;" alt="Lukas Crepaz"/><br /><sub><b>Lukas Crepaz</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=phoenix147" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aphoenix147" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://utf9k.net/"><img src="https://avatars.githubusercontent.com/u/14816406?v=4?s=75" width="75px;" alt="Marcus Crane"/><br /><sub><b>Marcus Crane</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Amarcus-crane" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=marcus-crane" title="Documentation">📖</a> <a href="#financial-marcus-crane" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://qaisjp.com/"><img src="https://avatars.githubusercontent.com/u/923242?v=4?s=75" width="75px;" alt="Qais Patankar"/><br /><sub><b>Qais Patankar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=qaisjp" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://wakefulcloud.dev/"><img src="https://avatars.githubusercontent.com/u/38930607?v=4?s=75" width="75px;" alt="Wakeful-Cloud"/><br /><sub><b>Wakeful-Cloud</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Wakeful-Cloud" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AWakeful-Cloud" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Lyimmi"><img src="https://avatars.githubusercontent.com/u/8627125?v=4?s=75" width="75px;" alt="Zámbó, Levente"/><br /><sub><b>Zámbó, Levente</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Lyimmi" title="Code">💻</a> <a href="#platform-Lyimmi" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ALyimmi" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=Lyimmi" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Ironpark"><img src="https://avatars.githubusercontent.com/u/4973597?v=4?s=75" width="75px;" alt="Ironpark"/><br /><sub><b>Ironpark</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Ironpark" title="Code">💻</a> <a href="#ideas-Ironpark" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mondy"><img src="https://avatars.githubusercontent.com/u/3961824?v=4?s=75" width="75px;" alt="mondy"/><br /><sub><b>mondy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mondy" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=mondy" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ryben.dev/"><img src="https://avatars.githubusercontent.com/u/6241454?v=4?s=75" width="75px;" alt="Benjamin Ryan"/><br /><sub><b>Benjamin Ryan</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Aredraskal" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fallendusk"><img src="https://avatars.githubusercontent.com/u/565631?v=4?s=75" width="75px;" alt="fallendusk"/><br /><sub><b>fallendusk</b></sub></a><br /><a href="#platform-fallendusk" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/commits?author=fallendusk" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/matryer"><img src="https://avatars.githubusercontent.com/u/101659?v=4?s=75" width="75px;" alt="Mat Ryer"/><br /><sub><b>Mat Ryer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=matryer" title="Code">💻</a> <a href="#ideas-matryer" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amatryer" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abtin"><img src="https://avatars.githubusercontent.com/u/441372?v=4?s=75" width="75px;" alt="Abtin"/><br /><sub><b>Abtin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=abtin" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aabtin" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lanzafame"><img src="https://avatars.githubusercontent.com/u/5924712?v=4?s=75" width="75px;" alt="Adrian Lanzafame"/><br /><sub><b>Adrian Lanzafame</b></sub></a><br /><a href="#platform-lanzafame" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/wailsapp/wails/commits?author=lanzafame" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/polikow"><img src="https://avatars.githubusercontent.com/u/58259700?v=4?s=75" width="75px;" alt="Aleksey Polyakov"/><br /><sub><b>Aleksey Polyakov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/issues?q=author%3Apolikow" title="Bug reports">🐛</a> <a href="https://github.com/wailsapp/wails/commits?author=polikow" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexmat"><img src="https://avatars.githubusercontent.com/u/745421?v=4?s=75" width="75px;" alt="Alexander Matviychuk"/><br /><sub><b>Alexander Matviychuk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=alexmat" title="Code">💻</a> <a href="#platform-alexmat" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AlienRecall"><img src="https://avatars.githubusercontent.com/u/68950287?v=4?s=75" width="75px;" alt="AlienRecall"/><br /><sub><b>AlienRecall</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=AlienRecall" title="Code">💻</a> <a href="#platform-AlienRecall" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://blog.checkyo.tech/"><img src="https://avatars.githubusercontent.com/u/17457975?v=4?s=75" width="75px;" alt="Aman"/><br /><sub><b>Aman</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=achhabra2" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/amaury-tobias"><img src="https://avatars.githubusercontent.com/u/37311888?v=4?s=75" width="75px;" alt="Amaury Tobias Quiroz"/><br /><sub><b>Amaury Tobias Quiroz</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=amaury-tobias" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aamaury-tobias" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://blog.nms.de/"><img src="https://avatars.githubusercontent.com/u/51517?v=4?s=75" width="75px;" alt="Andreas Wenk"/><br /><sub><b>Andreas Wenk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=andywenk" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stankovic98"><img src="https://avatars.githubusercontent.com/u/29852655?v=4?s=75" width="75px;" alt="Antonio Stanković"/><br /><sub><b>Antonio Stanković</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stankovic98" title="Code">💻</a> <a href="#platform-stankovic98" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/antimatter96"><img src="https://avatars.githubusercontent.com/u/12068176?v=4?s=75" width="75px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=antimatter96" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/aschey"><img src="https://avatars.githubusercontent.com/u/5882266?v=4?s=75" width="75px;" alt="Austin Schey"/><br /><sub><b>Austin Schey</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=aschey" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aaschey" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/benjamin-thomas"><img src="https://avatars.githubusercontent.com/u/1557738?v=4?s=75" width="75px;" alt="Benjamin Thomas"/><br /><sub><b>Benjamin Thomas</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=benjamin-thomas" title="Code">💻</a> <a href="#platform-benjamin-thomas" title="Packaging/porting to new platform">📦</a> <a href="#ideas-benjamin-thomas" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.bertramtruong.com/"><img src="https://avatars.githubusercontent.com/u/1100843?v=4?s=75" width="75px;" alt="Bertram Truong"/><br /><sub><b>Bertram Truong</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bt" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Abt" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://techwizworld.net/"><img src="https://avatars.githubusercontent.com/u/175873?v=4?s=75" width="75px;" alt="Blake Bourque"/><br /><sub><b>Blake Bourque</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=TechplexEngineer" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://vk.com/raitonoberu"><img src="https://avatars.githubusercontent.com/u/64320078?v=4?s=75" width="75px;" alt="Denis"/><br /><sub><b>Denis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=raitonoberu" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/diogox"><img src="https://avatars.githubusercontent.com/u/13244408?v=4?s=75" width="75px;" alt="diogox"/><br /><sub><b>diogox</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=diogox" title="Code">💻</a> <a href="#platform-diogox" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kyoto44"><img src="https://avatars.githubusercontent.com/u/17720761?v=4?s=75" width="75px;" alt="Dmitry Gomzyakov"/><br /><sub><b>Dmitry Gomzyakov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=kyoto44" title="Code">💻</a> <a href="#platform-kyoto44" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/edwardbrowncross"><img src="https://avatars.githubusercontent.com/u/35063432?v=4?s=75" width="75px;" alt="Edward Browncross"/><br /><sub><b>Edward Browncross</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=edwardbrowncross" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://pr0gramming.ca/"><img src="https://avatars.githubusercontent.com/u/14944216?v=4?s=75" width="75px;" alt="Elie Grenon"/><br /><sub><b>Elie Grenon</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=elie-g" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fdidron"><img src="https://avatars.githubusercontent.com/u/1848786?v=4?s=75" width="75px;" alt="Florian Didron"/><br /><sub><b>Florian Didron</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fdidron" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Afdidron" title="Bug reports">🐛</a> <a href="#ideas-fdidron" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=fdidron" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Afdidron" title="Reviewed Pull Requests">👀</a> <a href="#platform-fdidron" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GargantuaX"><img src="https://avatars.githubusercontent.com/u/14013111?v=4?s=75" width="75px;" alt="GargantuaX"/><br /><sub><b>GargantuaX</b></sub></a><br /><a href="#financial-GargantuaX" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://bednya.ga/"><img src="https://avatars.githubusercontent.com/u/12101721?v=4?s=75" width="75px;" alt="Igor Minin"/><br /><sub><b>Igor Minin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Igogrek" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AIgogrek" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.jae-sung.com/"><img src="https://avatars.githubusercontent.com/u/39658806?v=4?s=75" width="75px;" alt="Jae-Sung Lee"/><br /><sub><b>Jae-Sung Lee</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=jaesung9507" title="Code">💻</a> <a href="#ideas-jaesung9507" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jarek-SRT"><img src="https://avatars.githubusercontent.com/u/3391365?v=4?s=75" width="75px;" alt="Jarek"/><br /><sub><b>Jarek</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Jarek-SRT" title="Code">💻</a> <a href="#platform-Jarek-SRT" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Junkher"><img src="https://avatars.githubusercontent.com/u/85776620?v=4?s=75" width="75px;" alt="Junker"/><br /><sub><b>Junker</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Junkher" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kraney"><img src="https://avatars.githubusercontent.com/u/5760081?v=4?s=75" width="75px;" alt="Kris Raney"/><br /><sub><b>Kris Raney</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=kraney" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Akraney" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LukenSkyne"><img src="https://avatars.githubusercontent.com/u/29918069?v=4?s=75" width="75px;" alt="Luken"/><br /><sub><b>Luken</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LukenSkyne" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://markstenglein.com/"><img src="https://avatars.githubusercontent.com/u/9255772?v=4?s=75" width="75px;" alt="Mark Stenglein"/><br /><sub><b>Mark Stenglein</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ocelotsloth" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Aocelotsloth" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/buddyabaddon"><img src="https://avatars.githubusercontent.com/u/33861511?v=4?s=75" width="75px;" alt="buddyabaddon"/><br /><sub><b>buddyabaddon</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=buddyabaddon" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MikeSchaap"><img src="https://avatars.githubusercontent.com/u/35368821?v=4?s=75" width="75px;" alt="MikeSchaap"/><br /><sub><b>MikeSchaap</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=MikeSchaap" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AMikeSchaap" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Orijhins"><img src="https://avatars.githubusercontent.com/u/47521598?v=4?s=75" width="75px;" alt="NYSSEN Michaël"/><br /><sub><b>NYSSEN Michaël</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Orijhins" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AOrijhins" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/NanoNik"><img src="https://avatars.githubusercontent.com/u/11991329?v=4?s=75" width="75px;" alt="Nan0"/><br /><sub><b>Nan0</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=NanoNik" title="Code">💻</a> <a href="#ideas-NanoNik" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=NanoNik" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3ANanoNik" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/marcio199226"><img src="https://avatars.githubusercontent.com/u/10244404?v=4?s=75" width="75px;" alt="oskar"/><br /><sub><b>oskar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marcio199226" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pierrejoye"><img src="https://avatars.githubusercontent.com/u/282408?v=4?s=75" width="75px;" alt="Pierre Joye"/><br /><sub><b>Pierre Joye</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=pierrejoye" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Apierrejoye" title="Bug reports">🐛</a> <a href="#ideas-pierrejoye" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=pierrejoye" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Rested"><img src="https://avatars.githubusercontent.com/u/2003608?v=4?s=75" width="75px;" alt="Reuben Thomas-Davis"/><br /><sub><b>Reuben Thomas-Davis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Rested" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ARested" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mewmew"><img src="https://avatars.githubusercontent.com/u/1414531?v=4?s=75" width="75px;" alt="Robin"/><br /><sub><b>Robin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mewmew" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amewmew" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://threema.id/YSB3TVF7"><img src="https://avatars.githubusercontent.com/u/70367451?v=4?s=75" width="75px;" alt="Sebastian Bauer"/><br /><sub><b>Sebastian Bauer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sebastian0x62" title="Code">💻</a> <a href="#ideas-sebastian0x62" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=sebastian0x62" title="Tests">⚠️</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Asebastian0x62" title="Reviewed Pull Requests">👀</a> <a href="#question-sebastian0x62" title="Answering Questions">💬</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sidwebworks"><img src="https://avatars.githubusercontent.com/u/58144379?v=4?s=75" width="75px;" alt="Sidharth Rathi"/><br /><sub><b>Sidharth Rathi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sidwebworks" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Asidwebworks" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sithembiso"><img src="https://avatars.githubusercontent.com/u/6559905?v=4?s=75" width="75px;" alt="Sithembiso Khumalo"/><br /><sub><b>Sithembiso Khumalo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sithembiso" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Asithembiso" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/LanguageAgnostic"><img src="https://avatars.githubusercontent.com/u/19310562?v=4?s=75" width="75px;" alt="Soheib El-Harrache"/><br /><sub><b>Soheib El-Harrache</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=LanguageAgnostic" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ALanguageAgnostic" title="Bug reports">🐛</a> <a href="#financial-LanguageAgnostic" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.sophieau.com/"><img src="https://avatars.githubusercontent.com/u/11145039?v=4?s=75" width="75px;" alt="Sophie Au"/><br /><sub><b>Sophie Au</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SophieAu" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3ASophieAu" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stefpap"><img src="https://avatars.githubusercontent.com/u/22637722?v=4?s=75" width="75px;" alt="Stefanos Papadakis"/><br /><sub><b>Stefanos Papadakis</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=stefpap" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Astefpap" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/s12chung"><img src="https://avatars.githubusercontent.com/u/263394?v=4?s=75" width="75px;" alt="Steve Chung"/><br /><sub><b>Steve Chung</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=s12chung" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3As12chung" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://tortloff.de/"><img src="https://avatars.githubusercontent.com/u/41272726?v=4?s=75" width="75px;" alt="Timm Ortloff"/><br /><sub><b>Timm Ortloff</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=TAINCER" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tomanagle"><img src="https://avatars.githubusercontent.com/u/8683577?v=4?s=75" width="75px;" alt="Tom"/><br /><sub><b>Tom</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tomanagle" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/valentintrinque"><img src="https://avatars.githubusercontent.com/u/4662842?v=4?s=75" width="75px;" alt="Valentin Trinqué"/><br /><sub><b>Valentin Trinqué</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ValentinTrinque" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AValentinTrinque" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://mattn.kaoriya.net/"><img src="https://avatars.githubusercontent.com/u/10111?v=4?s=75" width="75px;" alt="mattn"/><br /><sub><b>mattn</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mattn" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Amattn" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bearsh"><img src="https://avatars.githubusercontent.com/u/1089356?v=4?s=75" width="75px;" alt="bearsh"/><br /><sub><b>bearsh</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bearsh" title="Code">💻</a> <a href="#ideas-bearsh" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=bearsh" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chenxiao1990"><img src="https://avatars.githubusercontent.com/u/16933565?v=4?s=75" width="75px;" alt="chenxiao"/><br /><sub><b>chenxiao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=chenxiao1990" title="Code">💻</a> <a href="#ideas-chenxiao1990" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=chenxiao1990" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fengweiqiang"><img src="https://avatars.githubusercontent.com/u/22905300?v=4?s=75" width="75px;" alt="fengweiqiang"/><br /><sub><b>fengweiqiang</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fengweiqiang" title="Code">💻</a> <a href="#platform-fengweiqiang" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/flin7"><img src="https://avatars.githubusercontent.com/u/58138185?v=4?s=75" width="75px;" alt="flin7"/><br /><sub><b>flin7</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=flin7" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fred21O4"><img src="https://avatars.githubusercontent.com/u/67189813?v=4?s=75" width="75px;" alt="fred21O4"/><br /><sub><b>fred21O4</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=fred21O4" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gardc"><img src="https://avatars.githubusercontent.com/u/41453409?v=4?s=75" width="75px;" alt="gardc"/><br /><sub><b>gardc</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gardc" title="Documentation">📖</a> <a href="#tutorial-gardc" title="Tutorials">✅</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rayshoo"><img src="https://avatars.githubusercontent.com/u/52561899?v=4?s=75" width="75px;" alt="rayshoo"/><br /><sub><b>rayshoo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rayshoo" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Yz4230"><img src="https://avatars.githubusercontent.com/u/38999742?v=4?s=75" width="75px;" alt="Ishiyama Yuzuki"/><br /><sub><b>Ishiyama Yuzuki</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Yz4230" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3AYz4230" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://baiyue.one/"><img src="https://avatars.githubusercontent.com/u/43716063?v=4?s=75" width="75px;" alt="佰阅"/><br /><sub><b>佰阅</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Baiyuetribe" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/daodao97"><img src="https://avatars.githubusercontent.com/u/15009280?v=4?s=75" width="75px;" alt="刀刀"/><br /><sub><b>刀刀</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=daodao97" title="Documentation">📖</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Adaodao97" title="Bug reports">🐛</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jicg"><img src="https://avatars.githubusercontent.com/u/6479672?v=4?s=75" width="75px;" alt="归位"/><br /><sub><b>归位</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=jicg" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/issues?q=author%3Ajicg" title="Bug reports">🐛</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/skamensky"><img src="https://avatars.githubusercontent.com/u/19151369?v=4?s=75" width="75px;" alt="skamensky"/><br /><sub><b>skamensky</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=skamensky" title="Code">💻</a> <a href="#ideas-skamensky" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/wailsapp/wails/commits?author=skamensky" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=75" width="75px;" alt="dependabot[bot]"/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=dependabot[bot]" title="Code">💻</a> <a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/dsieradzki/"><img src="https://avatars.githubusercontent.com/u/10297559?v=4?s=75" width="75px;" alt="Damian Sieradzki"/><br /><sub><b>Damian Sieradzki</b></sub></a><br /><a href="#financial-dsieradzki" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/boostchicken"><img src="https://avatars.githubusercontent.com/u/427295?v=4?s=75" width="75px;" alt="John Dorman"/><br /><sub><b>John Dorman</b></sub></a><br /><a href="#financial-boostchicken" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://blog.iansinnott.com/"><img src="https://avatars.githubusercontent.com/u/3154865?v=4?s=75" width="75px;" alt="Ian Sinnott"/><br /><sub><b>Ian Sinnott</b></sub></a><br /><a href="#financial-iansinnott" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Shackelford-Arden"><img src="https://avatars.githubusercontent.com/u/7362263?v=4?s=75" width="75px;" alt="Arden Shackelford"/><br /><sub><b>Arden Shackelford</b></sub></a><br /><a href="#financial-Shackelford-Arden" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Bironou"><img src="https://avatars.githubusercontent.com/u/107761511?v=4?s=75" width="75px;" alt="Bironou"/><br /><sub><b>Bironou</b></sub></a><br /><a href="#financial-Bironou" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/CharlieGo19"><img src="https://avatars.githubusercontent.com/u/62405980?v=4?s=75" width="75px;" alt="CharlieGo_"/><br /><sub><b>CharlieGo_</b></sub></a><br /><a href="#financial-CharlieGo19" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/overnet"><img src="https://avatars.githubusercontent.com/u/6376126?v=4?s=75" width="75px;" alt="overnet"/><br /><sub><b>overnet</b></sub></a><br /><a href="#financial-overnet" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://jugglingjsons.dev/"><img src="https://avatars.githubusercontent.com/u/20739064?v=4?s=75" width="75px;" alt="jugglingjsons"/><br /><sub><b>jugglingjsons</b></sub></a><br /><a href="#financial-jugglingjsons" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://selvin.dev/"><img src="https://avatars.githubusercontent.com/u/1922523?v=4?s=75" width="75px;" alt="Selvin Ortiz"/><br /><sub><b>Selvin Ortiz</b></sub></a><br /><a href="#financial-selvindev" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zandercodes"><img src="https://avatars.githubusercontent.com/u/46308805?v=4?s=75" width="75px;" alt="ZanderCodes"/><br /><sub><b>ZanderCodes</b></sub></a><br /><a href="#financial-zandercodes" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/DonTomato"><img src="https://avatars.githubusercontent.com/u/1098084?v=4?s=75" width="75px;" alt="Michael Voronov"/><br /><sub><b>Michael Voronov</b></sub></a><br /><a href="#financial-DonTomato" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://lt.hn/"><img src="https://avatars.githubusercontent.com/u/83868036?v=4?s=75" width="75px;" alt="letheanVPN"/><br /><sub><b>letheanVPN</b></sub></a><br /><a href="#financial-letheanVPN" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://taigrr.com/"><img src="https://avatars.githubusercontent.com/u/8261498?v=4?s=75" width="75px;" alt="Tai Groot"/><br /><sub><b>Tai Groot</b></sub></a><br /><a href="#financial-taigrr" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/easy-web-it"><img src="https://avatars.githubusercontent.com/u/95484991?v=4?s=75" width="75px;" alt="easy-web-it"/><br /><sub><b>easy-web-it</b></sub></a><br /><a href="#financial-easy-web-it" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://michaelolson1996.github.io/portfolio"><img src="https://avatars.githubusercontent.com/u/45323107?v=4?s=75" width="75px;" alt="Michael Olson"/><br /><sub><b>Michael Olson</b></sub></a><br /><a href="#financial-michaelolson1996" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://eden.network/"><img src="https://avatars.githubusercontent.com/u/4912777?v=4?s=75" width="75px;" alt="EdenNetwork Italia"/><br /><sub><b>EdenNetwork Italia</b></sub></a><br /><a href="#financial-EdenNetworkItalia" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ondoki"><img src="https://avatars.githubusercontent.com/u/88536792?v=4?s=75" width="75px;" alt="ondoki"/><br /><sub><b>ondoki</b></sub></a><br /><a href="#financial-ondoki" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/questrail"><img src="https://avatars.githubusercontent.com/u/3536569?v=4?s=75" width="75px;" alt="QuEST Rail LLC"/><br /><sub><b>QuEST Rail LLC</b></sub></a><br /><a href="#financial-questrail" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Gilgames000"><img src="https://avatars.githubusercontent.com/u/22778436?v=4?s=75" width="75px;" alt="Gilgameš"/><br /><sub><b>Gilgameš</b></sub></a><br /><a href="#financial-Gilgames000" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bbergshaven"><img src="https://avatars.githubusercontent.com/u/4091634?v=4?s=75" width="75px;" alt="Bernt-Johan Bergshaven"/><br /><sub><b>Bernt-Johan Bergshaven</b></sub></a><br /><a href="#financial-bbergshaven" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bglw"><img src="https://avatars.githubusercontent.com/u/40188355?v=4?s=75" width="75px;" alt="Liam Bigelow"/><br /><sub><b>Liam Bigelow</b></sub></a><br /><a href="#financial-bglw" title="Financial">💵</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nickarellano"><img src="https://avatars.githubusercontent.com/u/13930605?v=4?s=75" width="75px;" alt="Nick Arellano"/><br /><sub><b>Nick Arellano</b></sub></a><br /><a href="#financial-nickarellano" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/fcjr"><img src="https://avatars.githubusercontent.com/u/2053002?v=4?s=75" width="75px;" alt="Frank Chiarulli Jr."/><br /><sub><b>Frank Chiarulli Jr.</b></sub></a><br /><a href="#financial-fcjr" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tylertravisty"><img src="https://avatars.githubusercontent.com/u/8620352?v=4?s=75" width="75px;" alt="Tyler"/><br /><sub><b>Tyler</b></sub></a><br /><a href="#financial-tylertravisty" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/trea"><img src="https://avatars.githubusercontent.com/u/1181448?v=4?s=75" width="75px;" alt="Trea Hauet"/><br /><sub><b>Trea Hauet</b></sub></a><br /><a href="#financial-trea" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://picatz.github.io/"><img src="https://avatars.githubusercontent.com/u/14850816?v=4?s=75" width="75px;" alt="Kent 'picat' Gruber"/><br /><sub><b>Kent 'picat' Gruber</b></sub></a><br /><a href="#financial-picatz" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tc-hib"><img src="https://avatars.githubusercontent.com/u/55949036?v=4?s=75" width="75px;" alt="tc-hib"/><br /><sub><b>tc-hib</b></sub></a><br /><a href="#financial-tc-hib" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/acheong08"><img src="https://avatars.githubusercontent.com/u/36258159?v=4?s=75" width="75px;" alt="Antonio"/><br /><sub><b>Antonio</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=acheong08" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MyNameIsAres"><img src="https://avatars.githubusercontent.com/u/32432637?v=4?s=75" width="75px;" alt="MyNameIsAres"/><br /><sub><b>MyNameIsAres</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=MyNameIsAres" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://mai.car.ons"><img src="https://avatars.githubusercontent.com/u/101958587?v=4?s=75" width="75px;" alt="Maicarons J"/><br /><sub><b>Maicarons J</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Maicarons2022" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KiddoV"><img src="https://avatars.githubusercontent.com/u/28552977?v=4?s=75" width="75px;" alt="kiddov"/><br /><sub><b>kiddov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=KiddoV" title="Documentation">📖</a> <a href="#financial-KiddoV" title="Financial">💵</a> <a href="https://github.com/wailsapp/wails/commits?author=KiddoV" title="Tests">⚠️</a> <a href="#ideas-KiddoV" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://nicolas-coutin.com/"><img src="https://avatars.githubusercontent.com/u/6564012?v=4?s=75" width="75px;" alt="Nicolas Coutin"/><br /><sub><b>Nicolas Coutin</b></sub></a><br /><a href="#financial-Ilshidur" title="Financial">💵</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ParvinEyvazov"><img src="https://avatars.githubusercontent.com/u/32189770?v=4?s=75" width="75px;" alt="Parvin Eyvazov"/><br /><sub><b>Parvin Eyvazov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ParvinEyvazov" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/github-actions"><img src="https://avatars.githubusercontent.com/in/15368?v=4?s=75" width="75px;" alt="github-actions[bot]"/><br /><sub><b>github-actions[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=github-actions[bot]" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/OlegGulevskyy"><img src="https://avatars.githubusercontent.com/u/43781031?v=4?s=75" width="75px;" alt="Oleg Gulevskyy"/><br /><sub><b>Oleg Gulevskyy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=OlegGulevskyy" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=OlegGulevskyy" title="Documentation">📖</a> <a href="#maintenance-OlegGulevskyy" title="Maintenance">🚧</a> <a href="#platform-OlegGulevskyy" title="Packaging/porting to new platform">📦</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.customct.com/"><img src="https://avatars.githubusercontent.com/u/2487495?v=4?s=75" width="75px;" alt="Richard Guay"/><br /><sub><b>Richard Guay</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=raguay" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ATenderholt"><img src="https://avatars.githubusercontent.com/u/740623?v=4?s=75" width="75px;" alt="Adam Tenderholt"/><br /><sub><b>Adam Tenderholt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ATenderholt" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/JulioDRF"><img src="https://avatars.githubusercontent.com/u/15677708?v=4?s=75" width="75px;" alt="JulioDRF"/><br /><sub><b>JulioDRF</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=JulioDRF" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://scottopell.com/"><img src="https://avatars.githubusercontent.com/u/996472?v=4?s=75" width="75px;" alt="Scott Opell"/><br /><sub><b>Scott Opell</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=scottopell" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://aven.dev/"><img src="https://avatars.githubusercontent.com/u/2055581?v=4?s=75" width="75px;" alt="Vadim Shchepotev"/><br /><sub><b>Vadim Shchepotev</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=avengerweb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://willdot.net/"><img src="https://avatars.githubusercontent.com/u/4906530?v=4?s=75" width="75px;" alt="Will Andrews"/><br /><sub><b>Will Andrews</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=willdot" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gwynforthewyn"><img src="https://avatars.githubusercontent.com/u/434656?v=4?s=75" width="75px;" alt="Gwyn"/><br /><sub><b>Gwyn</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gwynforthewyn" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/pulls?q=is%3Apr+reviewed-by%3Agwynforthewyn" title="Reviewed Pull Requests">👀</a> <a href="#question-gwynforthewyn" title="Answering Questions">💬</a> <a href="#research-gwynforthewyn" title="Research">🔬</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/xijaja"><img src="https://avatars.githubusercontent.com/u/47017666?v=4?s=75" width="75px;" alt="希嘉嘉"/><br /><sub><b>希嘉嘉</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=xijaja" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.almas.cc/"><img src="https://avatars.githubusercontent.com/u/9382335?v=4?s=75" width="75px;" alt="ALMAS"/><br /><sub><b>ALMAS</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=almas1992" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://stdout.com.cn/"><img src="https://avatars.githubusercontent.com/u/20666153?v=4?s=75" width="75px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=o8x" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/arifali123"><img src="https://avatars.githubusercontent.com/u/51419655?v=4?s=75" width="75px;" alt="Arif Ali"/><br /><sub><b>Arif Ali</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=arifali123" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hotafrika"><img src="https://avatars.githubusercontent.com/u/18332839?v=4?s=75" width="75px;" alt="Artur Siarohau"/><br /><sub><b>Artur Siarohau</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=hotafrika" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://binyam.in/"><img src="https://avatars.githubusercontent.com/u/39805353?v=4?s=75" width="75px;" alt="Binyamin Aron Green"/><br /><sub><b>Binyamin Aron Green</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=binyamin" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://bdwyertech.net/"><img src="https://avatars.githubusercontent.com/u/2973273?v=4?s=75" width="75px;" alt="Brian Dwyer"/><br /><sub><b>Brian Dwyer</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=bdwyertech" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.cilb.de/"><img src="https://avatars.githubusercontent.com/u/7283097?v=4?s=75" width="75px;" alt="Christian Kilb"/><br /><sub><b>Christian Kilb</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ckilb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/edwargix"><img src="https://avatars.githubusercontent.com/u/22877007?v=4?s=75" width="75px;" alt="David Florness"/><br /><sub><b>David Florness</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=edwargix" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/BuckeyeCoder"><img src="https://avatars.githubusercontent.com/u/95933880?v=4?s=75" width="75px;" alt="David Walton"/><br /><sub><b>David Walton</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=BuckeyeCoder" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Debdut"><img src="https://avatars.githubusercontent.com/u/7561070?v=4?s=75" width="75px;" alt="Debdut Karmakar"/><br /><sub><b>Debdut Karmakar</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Debdut" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gotid"><img src="https://avatars.githubusercontent.com/u/4010854?v=4?s=75" width="75px;" alt="Dieter Zhu"/><br /><sub><b>Dieter Zhu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=gotid" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://fredrikholmqvist.com/"><img src="https://avatars.githubusercontent.com/u/22743750?v=4?s=75" width="75px;" alt="Fredrik Holmqvist"/><br /><sub><b>Fredrik Holmqvist</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Holmqvist1990" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/giopalma"><img src="https://avatars.githubusercontent.com/u/33783684?v=4?s=75" width="75px;" alt="Giovanni Palma"/><br /><sub><b>Giovanni Palma</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=giopalma" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Nexus26404"><img src="https://avatars.githubusercontent.com/u/83110373?v=4?s=75" width="75px;" alt="Hao"/><br /><sub><b>Hao</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Nexus26404" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/i7tsov"><img src="https://avatars.githubusercontent.com/u/44977153?v=4?s=75" width="75px;" alt="Igor Sementsov"/><br /><sub><b>Igor Sementsov</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=i7tsov" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/derhasi"><img src="https://avatars.githubusercontent.com/u/118502?v=4?s=75" width="75px;" alt="Johannes Haseitl"/><br /><sub><b>Johannes Haseitl</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=derhasi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/joshbuddy"><img src="https://avatars.githubusercontent.com/u/8898?v=4?s=75" width="75px;" alt="Joshua Hull"/><br /><sub><b>Joshua Hull</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=joshbuddy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/joshm998"><img src="https://avatars.githubusercontent.com/u/1779737?v=4?s=75" width="75px;" alt="Joshua Mangiola"/><br /><sub><b>Joshua Mangiola</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=joshm998" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/prurigro"><img src="https://avatars.githubusercontent.com/u/1149238?v=4?s=75" width="75px;" alt="Kevin MacMartin"/><br /><sub><b>Kevin MacMartin</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=prurigro" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/liang-li-dev"><img src="https://avatars.githubusercontent.com/u/112530363?v=4?s=75" width="75px;" alt="Liang Li"/><br /><sub><b>Liang Li</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=liang-li-dev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://appslab.co.ke/"><img src="https://avatars.githubusercontent.com/u/7722584?v=4?s=75" width="75px;" alt="Marvin Collins Hosea"/><br /><sub><b>Marvin Collins Hosea</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=marvinhosea" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://matt.life/"><img src="https://avatars.githubusercontent.com/u/1128849?v=4?s=75" width="75px;" alt="Matt Holt"/><br /><sub><b>Matt Holt</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=mholt" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Gurkengewuerz"><img src="https://avatars.githubusercontent.com/u/10966337?v=4?s=75" width="75px;" alt="Niklas"/><br /><sub><b>Niklas</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Gurkengewuerz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Xhofe"><img src="https://avatars.githubusercontent.com/u/36558727?v=4?s=75" width="75px;" alt="Andy Hsu"/><br /><sub><b>Andy Hsu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Xhofe" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/NullCode1337"><img src="https://avatars.githubusercontent.com/u/70959549?v=4?s=75" width="75px;" alt="NullCode"/><br /><sub><b>NullCode</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=NullCode1337" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/oSethoum"><img src="https://avatars.githubusercontent.com/u/88779394?v=4?s=75" width="75px;" alt="Oussama Sethoum"/><br /><sub><b>Oussama Sethoum</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=oSethoum" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ParkourLiu"><img src="https://avatars.githubusercontent.com/u/33681340?v=4?s=75" width="75px;" alt="ParkourLiu"/><br /><sub><b>ParkourLiu</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=ParkourLiu" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/zllovesuki"><img src="https://avatars.githubusercontent.com/u/298453?v=4?s=75" width="75px;" alt="Rachel Chen"/><br /><sub><b>Rachel Chen</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=zllovesuki" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rnice01"><img src="https://avatars.githubusercontent.com/u/11394384?v=4?s=75" width="75px;" alt="Rob Nice"/><br /><sub><b>Rob Nice</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=rnice01" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/RyoTagami"><img src="https://avatars.githubusercontent.com/u/9672589?v=4?s=75" width="75px;" alt="Ryo TAGAMI"/><br /><sub><b>Ryo TAGAMI</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=RyoTagami" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/SamHennessy"><img src="https://avatars.githubusercontent.com/u/119867?v=4?s=75" width="75px;" alt="Sam Hennessy"/><br /><sub><b>Sam Hennessy</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SamHennessy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://albinodrought.com/"><img src="https://avatars.githubusercontent.com/u/852873?v=4?s=75" width="75px;" alt="Sean"/><br /><sub><b>Sean</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=AlbinoDrought" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sgosiaco"><img src="https://avatars.githubusercontent.com/u/212341?v=4?s=75" width="75px;" alt="Sean Gosiaco"/><br /><sub><b>Sean Gosiaco</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=sgosiaco" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://sheetjs.com/"><img src="https://avatars.githubusercontent.com/u/6070939?v=4?s=75" width="75px;" alt="Eric P Sheets"/><br /><sub><b>Eric P Sheets</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SheetJSDev" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.octopy.dev/"><img src="https://avatars.githubusercontent.com/u/37969970?v=4?s=75" width="75px;" alt="Supian M"/><br /><sub><b>Supian M</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=SupianIDz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Watson-Sei"><img src="https://avatars.githubusercontent.com/u/55475145?v=4?s=75" width="75px;" alt="Watson-Sei"/><br /><sub><b>Watson-Sei</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=Watson-Sei" title="Code">💻</a> <a href="https://github.com/wailsapp/wails/commits?author=Watson-Sei" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://shinshin86.com/"><img src="https://avatars.githubusercontent.com/u/8216064?v=4?s=75" width="75px;" alt="Yuki Shindo"/><br /><sub><b>Yuki Shindo</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=shinshin86" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cuigege"><img src="https://avatars.githubusercontent.com/u/26080122?v=4?s=75" width="75px;" alt="cuigege"/><br /><sub><b>cuigege</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=cuigege" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://cybertramp.net/"><img src="https://avatars.githubusercontent.com/u/30935096?v=4?s=75" width="75px;" alt="cybertramp"/><br /><sub><b>cybertramp</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=cybertramp" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/h8gi"><img src="https://avatars.githubusercontent.com/u/10811057?v=4?s=75" width="75px;" alt="hiroki yagi"/><br /><sub><b>hiroki yagi</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=h8gi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/imgbot"><img src="https://avatars.githubusercontent.com/in/4706?v=4?s=75" width="75px;" alt="imgbot[bot]"/><br /><sub><b>imgbot[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=imgbot[bot]" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tong3jie"><img src="https://avatars.githubusercontent.com/u/14191774?v=4?s=75" width="75px;" alt="juju"/><br /><sub><b>juju</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tong3jie" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://meatherly.github.io/"><img src="https://avatars.githubusercontent.com/u/1327960?v=4?s=75" width="75px;" alt="Michael Eatherly"/><br /><sub><b>Michael Eatherly</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=meatherly" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tk103331"><img src="https://avatars.githubusercontent.com/u/4404609?v=4?s=75" width="75px;" alt="tk"/><br /><sub><b>tk</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=tk103331" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apps/allcontributors"><img src="https://avatars.githubusercontent.com/in/23186?v=4?s=75" width="75px;" alt="allcontributors[bot]"/><br /><sub><b>allcontributors[bot]</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=allcontributors[bot]" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.ffactory.org/"><img src="https://avatars.githubusercontent.com/u/77320953?v=4?s=75" width="75px;" alt="wander"/><br /><sub><b>wander</b></sub></a><br /><a href="https://github.com/wailsapp/wails/commits?author=wandercn" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<!--GAMFC_DELIMITER-END-->
|
||||||
|
|
||||||
|
</div>
|
||||||