Compare commits
1032 Commits
remember-s
...
hide-last-
| Author | SHA1 | Date | |
|---|---|---|---|
|
eb889a7591
|
|||
|
c9696dd9c8
|
|||
|
212b4785fb
|
|||
|
|
54d6161acd | ||
|
|
b1fd84fd75 | ||
|
|
9dbdf7928a | ||
|
|
67f0e3d296 | ||
|
|
e498418c2d | ||
| 33150a42c5 | |||
| e7fe4ab9b4 | |||
| c146bab08a | |||
|
|
d1cced8d54 | ||
|
|
8849b6105c | ||
|
|
3a0acfaba1 | ||
|
|
0ec2b05070 | ||
|
|
130bbfafb4 | ||
|
|
ffc75772f9 | ||
|
|
5b3fac70ed | ||
|
|
53e3f6d86b | ||
|
|
c28ab7a57c | ||
|
|
09ce3af11e | ||
| e42c09883a | |||
| 77e3924809 | |||
| 3511b1ee91 | |||
| 78a62c8ef0 | |||
|
|
8b96b9f4e6 | ||
|
|
649a857c3a | ||
|
|
cdae2c7558 | ||
|
|
3639110c51 | ||
|
186668512e
|
|||
|
f63666fae2
|
|||
|
|
68d25059b1
|
||
|
|
9aef6b7f5b
|
||
|
|
d2e712575f
|
||
|
|
bf9674e6e4
|
||
|
|
4815390cbe
|
||
|
|
6ce903f1f6
|
||
|
|
b2c91ffce4
|
||
|
|
ae335b18bf
|
||
|
|
6391819fb2
|
||
|
|
5d0e56b7c7
|
||
|
|
50ccc7bd7f
|
||
|
|
b3a6bcf3b2
|
||
|
|
38b2988bbe
|
||
|
|
446c541dcb
|
||
|
|
31fd48ee52
|
||
| b35cc33c32 | |||
|
|
9510290c29 | ||
|
|
3b1238b9c7 | ||
|
|
3bec23ecac | ||
|
|
7b678228b6 | ||
|
|
b1292d4562 | ||
|
|
a62d782fe5 | ||
|
|
81b07eb339 | ||
|
|
02f88398b9 | ||
|
|
e80961cc09 | ||
|
|
bd7721dc26 | ||
|
|
6d974bf71c | ||
|
|
aeeb817735 | ||
|
|
b5e7033958 | ||
|
|
bdc843f30f | ||
|
|
a823fa8e14 | ||
|
|
9232386c15 | ||
|
|
3c1547718c | ||
|
|
b67a7f3e9e | ||
|
|
92850d4f64 | ||
|
|
6323eafd7e | ||
|
|
b8fe826b58 | ||
|
|
841c49238f | ||
|
|
7ab612e3d9 | ||
|
|
6d8a27688f | ||
|
|
765385319a | ||
|
|
342c49a3e5 | ||
|
|
25860e7bb2 | ||
|
|
6962f2b462 | ||
|
e48ce4c6c5
|
|||
|
1cb311cc2c
|
|||
|
|
401846abe4
|
||
|
|
16ef393350
|
||
|
|
d5742f8e4c
|
||
|
|
319063f823
|
||
|
|
5b13cf5634
|
||
|
|
da10b908b3
|
||
|
|
4568935bc5
|
||
|
|
467404a55e
|
||
|
|
fcfe1e4558
|
||
|
|
c9d87a1b9a
|
||
|
|
35ebf4dfc2
|
||
|
|
bc3c256d22
|
||
|
|
0e10e74496
|
||
|
|
ebe9097f73
|
||
|
|
d61a11b647
|
||
|
|
d980cc1f8e
|
||
|
|
bd6056ce2e
|
||
|
|
cf48fda8d0
|
||
|
|
dc344cd28c
|
||
|
|
358610575f
|
||
|
|
a7869fccbb
|
||
|
|
a50903f90a
|
||
|
|
9243705995
|
||
|
|
db4dd9eee9
|
||
|
|
22f2aba969 | ||
|
|
98f2777fda | ||
|
|
102ce43216 | ||
|
|
0c148c8a1f | ||
|
|
3cccb2eb6b | ||
|
|
af4949e26a | ||
|
|
5bb7e95624 | ||
| 814bcf694f | |||
|
|
b0382c61b1 | ||
| e2650a8bfc | |||
|
|
ac39a53b33 | ||
|
|
fb356cdf0b | ||
|
|
238e89ce16 | ||
|
|
6e041c79f7 | ||
|
|
6ef4b60d14 | ||
|
|
054bec2d9a
|
||
|
|
943a46a343
|
||
|
|
17381f6b94
|
||
|
|
18c88de407
|
||
|
|
99d21fc89b
|
||
|
|
db5c86a0d1
|
||
|
|
736ec6fb9e
|
||
|
|
fa2327325a
|
||
|
|
4fdf048040
|
||
|
|
273538bd36
|
||
|
|
0980c8c040
|
||
|
|
f0bfdeaa5a
|
||
|
|
ab7c5c18e3
|
||
|
|
6ae95ab5ec
|
||
|
eec630b2b0
|
|||
|
|
2b3d86968d | ||
|
|
935a6cae7a | ||
|
|
d4940d8386 | ||
|
71ec18f6c6
|
|||
|
caa4bfe864
|
|||
|
a87ba73160
|
|||
|
|
4324b185fe | ||
|
|
1ab9b30b85 | ||
|
|
81cf6ad297 | ||
|
|
1b3be3a13b | ||
|
|
3a2ce04d6b | ||
|
|
981821a6bc | ||
|
|
98f83769bd | ||
|
|
7684f53281 | ||
|
|
15af686a58 | ||
|
|
aad8f9e8d4 | ||
| b2ee44c0ab | |||
|
|
a696ac5084 | ||
|
|
28237c3a63 | ||
|
|
1cae4640c0 | ||
|
|
21a07d54cb | ||
|
|
1efd07b852 | ||
|
|
e5eb7d44a2 | ||
|
|
ec9a89ee4d | ||
|
|
4741c2a3e8 | ||
|
|
0111c5e2dc | ||
|
|
bed4e00b53 | ||
|
|
bf14d7138a | ||
|
|
0c5da08a42 | ||
|
|
a6e123e928 | ||
|
|
69b1173e08 | ||
|
|
c3326213e9 | ||
|
325109d7b8
|
|||
|
|
f16d76605b
|
||
|
|
3eee1b205a
|
||
|
|
9545c6446d
|
||
|
|
40a75f65ab
|
||
|
|
98f42c9896
|
||
|
|
5c22989675
|
||
|
999f16f6a4
|
|||
|
|
3f5fd6eee8
|
||
|
|
7c195aa75c
|
||
|
|
2071efc129
|
||
|
|
9db2e9b464
|
||
|
|
5f6cb568ff
|
||
|
|
045399a065
|
||
|
|
1b526143d0
|
||
|
|
8a046c0d1b
|
||
|
|
2893e4234d
|
||
|
|
973a5ce2cb
|
||
|
|
1e81e90341
|
||
| 9e7943e0e9 | |||
|
|
bb7ac4fea5 | ||
|
|
05d0e15359 | ||
|
|
d4d17fcbad | ||
|
|
c21d29a897 | ||
|
|
6e117ac39c | ||
|
|
79407f17e8 | ||
|
|
72c19fc411 | ||
|
|
24c3e61a4b | ||
|
|
74d5bee1f6 | ||
|
|
8066fa1bf8 | ||
| 26df547605 | |||
| a97532b90d | |||
|
|
e8ba1ec806 | ||
|
|
e8c265a4d8 | ||
|
|
b33dc63fe4 | ||
|
|
c4852f1309 | ||
|
|
39a4be7076 | ||
|
|
50c7edc420 | ||
|
|
67fa3c1ce5 | ||
|
|
cd671da3e7 | ||
|
|
3b60ca04f1 | ||
|
|
e2e58499f5 | ||
|
5cadf09665
|
|||
|
|
1ca7b3462f
|
||
|
|
8a552d2b0f
|
||
|
|
9fa0f18f78
|
||
|
|
db672ca048
|
||
|
|
18ad73cd35
|
||
|
|
5719e9b37e
|
||
|
|
9fb2b3c0e5
|
||
|
|
5ec66feb06
|
||
|
|
ccc301cfcc
|
||
|
|
c1b9d0b55e
|
||
|
|
d9daa27016
|
||
|
|
fa3b5d57ed
|
||
|
|
7c3e598ca6
|
||
|
|
563d5c7881
|
||
|
|
b8cba0ee17
|
||
|
|
8556586af4
|
||
|
|
5fc52bb31b
|
||
|
|
a92c9f2c38
|
||
|
|
61e137696e
|
||
|
|
8fc3b124da
|
||
|
|
7852822295
|
||
|
|
85e55953b3
|
||
|
|
077f633f33
|
||
|
|
1c3d1598a3
|
||
|
|
314608627e
|
||
|
|
aeecc04b29
|
||
|
|
341389d438
|
||
|
|
fbeae64123
|
||
|
|
7a4af31859 | ||
|
|
e106be1412 | ||
|
|
282bf80daa | ||
|
|
bcb861a61b | ||
|
|
bb0ad18913 | ||
|
|
81830c7540 | ||
|
|
68128b5ff1 | ||
|
|
aebeb26bc6 | ||
|
|
79cf3db279 | ||
|
|
dcae0d2cc7 | ||
|
|
2b12dc5920 | ||
|
|
51930e7a12 | ||
|
|
b04e09d2e0 | ||
| b6c4213515 | |||
|
|
8230c6eded | ||
|
|
e79590f795 | ||
|
|
79bced1246 | ||
|
|
896f4b55e3 | ||
|
|
52e65f9429 | ||
|
|
a22cc532e2 | ||
|
|
823227920c | ||
|
|
3e2bbce25e | ||
|
|
e05b2d9ecf | ||
|
|
d7b31a1cd8 | ||
|
|
70f01c0880 | ||
|
|
2cf5f21f78 | ||
|
|
96e8f8b6b2 | ||
|
|
370cfd1b08 | ||
|
|
046af15734 | ||
|
|
9e4ab2d54c | ||
|
|
7cf12e2e0d | ||
|
|
a63a81b387 | ||
|
|
d994cd13dc | ||
|
|
95e985cfce | ||
|
|
3a69de9274 | ||
|
|
64f5acf98c | ||
|
|
5167ab264d | ||
|
|
e02895b29f | ||
|
|
0009d11025 | ||
|
|
afc317bb52 | ||
|
|
629212ea23 | ||
|
|
ec1252200f | ||
|
|
54ea1ab803 | ||
|
|
4cf8097de4 | ||
|
|
2c7384b0a9 | ||
|
|
19e312a8fb | ||
|
|
3986308638 | ||
| fa7740948b | |||
| 892a1420f3 | |||
| ee4cbf7363 | |||
| a1b1ce949b | |||
| 902e8c3950 | |||
| b776788b38 | |||
|
|
78066773f4 | ||
|
|
0bac284eee | ||
|
|
07c95d1003 | ||
|
|
1072c5a384 | ||
|
|
5ed6e85ad8 | ||
|
|
f948dd81ca | ||
|
|
391818f230 | ||
|
|
dc74ad37a1 | ||
|
|
e1c94b7ff9 | ||
|
|
ec933452d3 | ||
|
|
977b268023 | ||
|
|
0c778af833 | ||
|
|
e75e7950b5 | ||
|
|
8d68297cce | ||
|
|
e0fd24aff5 | ||
|
|
b5c3ff45e4 | ||
|
|
786dbb21c4 | ||
|
|
5a17c330da | ||
|
|
975be63ce1 | ||
|
|
d9796bd63c | ||
|
|
25a835624a | ||
|
|
1d06683bb3 | ||
|
|
8e15a86c0a | ||
|
|
51a3008e5a | ||
|
|
f71c1b9848 | ||
|
|
151e23d524 | ||
|
|
7619891c86 | ||
|
|
cc98525f59 | ||
|
|
8cf9549981 | ||
|
|
9ebf27cd37 | ||
|
|
16a1a9f37f | ||
|
|
08d28b0f00 | ||
| d0ae3ca08a | |||
| 6e2f770876 | |||
|
|
4079bea912 | ||
| 4d01340b90 | |||
|
|
61b89c2f54 | ||
|
|
cbdff4a5f8 | ||
|
|
866afe970b | ||
|
|
87efc91527 | ||
| 4121526588 | |||
| 4adcb738a2 | |||
| 1f17f19a6e | |||
|
|
fb54115286 | ||
|
|
50dd35d089 | ||
|
|
1205b2a0e2 | ||
|
|
0a93e909ed | ||
|
|
6f3f928ac3 | ||
|
|
637ceabede | ||
|
|
c25f54f7e7 | ||
|
|
d4ae0b1346 | ||
|
|
7773618547 | ||
|
|
a4199fa299 | ||
|
|
5b9ccc4ee5 | ||
|
|
f538e03093 | ||
|
|
e625297a2e | ||
|
|
e603678872 | ||
|
|
9d77f1b2f7 | ||
| c4f7d25793 | |||
|
|
100f195a03 | ||
|
|
e599ef1ac9 | ||
|
|
033c69b92e | ||
|
|
184e566b1b | ||
|
|
8c321e479b | ||
|
|
960c84d02e | ||
|
|
02f1c2d342 | ||
|
|
c8ca3c93f6 | ||
|
|
5c6e5ca2de | ||
|
|
e3105a90c5 | ||
|
|
38dc7b046a | ||
|
|
da76ad9b66 | ||
|
|
177c55cf3d | ||
|
|
eeb6547d3e | ||
|
|
50ef6600a8 | ||
|
|
be43819de2 | ||
|
|
58017952bc | ||
|
|
409be7fc58 | ||
|
|
1bc660c9cd | ||
|
|
a56a59f81d | ||
|
|
1d5af6ca5c | ||
|
|
f81b2b677f | ||
|
|
290152c859 | ||
|
|
c4ee52fdac | ||
|
|
6f04455350 | ||
|
|
3b62945e5b | ||
|
|
b1b032d905 | ||
|
|
7c805f7f23 | ||
|
|
a2b0620175 | ||
|
|
8c6bee3d90 | ||
|
|
bba651b37c | ||
|
|
f657af275a | ||
|
|
03ded7d39f | ||
|
|
53edc7eb0b | ||
|
|
8b969021d5 | ||
|
|
1e52982a5d | ||
|
|
0038d42f71 | ||
|
|
d94b387fb9 | ||
|
|
8a2dbc95ca | ||
|
|
5865b000c0 | ||
|
|
6efb512a64 | ||
|
|
b7b8c7f175 | ||
|
|
a76e2aa677 | ||
|
|
d9f2317728 | ||
|
|
f1339e835b | ||
|
|
64f2362be3 | ||
|
5b184a40fd
|
|||
|
|
17e6191a92
|
||
|
|
1ff065d4c7
|
||
|
|
94e2c76284 | ||
|
|
1925af6897 | ||
|
|
4effaa4324 | ||
|
|
e2a4443a9c | ||
|
|
7c0e1c5ded | ||
|
|
f6e34ad999 | ||
|
|
ca5da7b5cd | ||
|
|
c08e4a2fdd | ||
|
|
37a50f6087 | ||
|
|
2040e79165 | ||
|
|
a6449020b6 | ||
|
|
75a46f4ab4 | ||
|
|
c948c7e230 | ||
|
|
c83b0fba21 | ||
|
|
b7053e8680 | ||
|
|
17183632c8 | ||
|
|
686d6d6e92 | ||
|
|
847ae7b396 | ||
|
|
ba9780fb17 | ||
|
|
42f5af0ffd | ||
|
|
55f1330fc1 | ||
|
|
4b326340a3 | ||
|
|
83f7766833 | ||
|
|
1e3b20f5b3 | ||
|
|
e508f28f7d | ||
|
|
2c139863b8 | ||
|
|
c699409129 | ||
|
|
74e6d8781a | ||
|
|
876f9c742f | ||
|
|
1e7b57eaf3 | ||
| 5615b1e1ec | |||
|
|
9d66a5ed4f | ||
|
|
5555f1afec | ||
|
|
77b1b895a5 | ||
|
|
6751bc15cc | ||
|
|
735fa97089 | ||
|
|
314774f032 | ||
|
|
262bbf26ea | ||
|
|
cdf8d043c9 | ||
|
|
1eb7c94a5a | ||
|
|
5228d8cf4d | ||
|
|
782779f0d7 | ||
|
|
18ec8e6b6c | ||
|
|
7d82d8b76f | ||
|
|
f957756df7 | ||
|
|
2cb0553723 | ||
|
|
8464e151cc | ||
|
|
2da444e7c2 | ||
| 2a19d5d831 | |||
|
|
f92509fddf | ||
|
|
51ee4046a0 | ||
|
|
1e85bb946d | ||
|
|
6639c002ed | ||
|
|
2a61440aed | ||
|
|
823c2565da | ||
|
|
b5a81e2586 | ||
|
|
6254cea600 | ||
|
|
ce63f6a96b | ||
|
|
6fa2e8b5c6 | ||
|
|
2278ab09a4 | ||
|
|
dfa72fceb1 | ||
|
|
62772615b6 | ||
|
|
9e0b9debb4 | ||
|
|
3902fe7b30 | ||
|
|
471bb4638a | ||
|
|
8c5b0ed5c4 | ||
|
|
379de6ff8e | ||
|
|
cb241741e3 | ||
|
|
1dbf7101b9 | ||
|
|
d9bbca1005 | ||
|
|
d2acf61e5a | ||
|
|
d6898c77d8 | ||
|
|
dd1fdf159b | ||
|
|
51b1b81c0e | ||
|
|
da7af491d0 | ||
|
|
90b284fb6e | ||
|
|
c1a89bd617 | ||
|
|
a20f3ab2ab | ||
|
|
7b9d0edef4 | ||
|
|
c22fc8613d | ||
|
|
f61308e573 | ||
|
|
d93b04a54c | ||
|
|
4b881e6839 | ||
|
|
63b0661728 | ||
|
|
46a66bc69d | ||
|
|
c09018be48 | ||
|
|
d71d448ac8 | ||
|
|
5834e1ee9b | ||
|
|
d51179189c | ||
|
|
b01243b101 | ||
|
|
d2a80cce4e | ||
|
|
0cc9fc1670 | ||
|
|
1279791d65 | ||
|
|
5d2fc0ed54 | ||
|
|
dcafcd9184 | ||
|
|
8481ab85de | ||
|
|
881d3a3aa1 | ||
|
|
878509090f | ||
|
|
24657ecc75 | ||
|
|
cf16a9cd10 | ||
|
|
3a9dda5eb3 | ||
|
|
c69ddd7241 | ||
|
|
bfcb3e4c88 | ||
|
|
27083669fa | ||
|
|
aaddbd847a | ||
|
|
1537501127 | ||
|
|
8b020e2bd6 | ||
|
|
ad614f3e42 | ||
|
|
01497d0288 | ||
|
|
eaad552273 | ||
|
83ecc3142e
|
|||
|
|
ef4afbc720 | ||
|
|
a5cc3aec92 | ||
|
|
881ece214d | ||
|
|
2b140d4279 | ||
|
|
b43dcd2bc7 | ||
|
|
c67a75d740 | ||
|
|
7f00ef5d9d | ||
|
|
d663155941 | ||
|
|
abfe0f642f | ||
| f0b5162205 | |||
|
|
a9bb2ef98b | ||
|
|
eff4525720 | ||
|
|
858d9dc6f0 | ||
|
|
55090bc102 | ||
|
|
40d3d273f0 | ||
|
|
f9271da11c | ||
|
|
4f881a5667 | ||
|
|
9d97886e3f | ||
|
|
e70cfbbe63 | ||
|
|
8a75537ea3 | ||
|
|
49c8d63d0b | ||
|
|
2519b0ee9f | ||
|
|
ba1589e2e2 | ||
|
|
e9a2473bad | ||
|
|
6480023c96 | ||
|
|
774da239b9 | ||
|
|
90c80645ec | ||
|
|
613ec23f7f | ||
|
|
1d73ae1d32 | ||
|
63e364ce5b
|
|||
|
|
ee5f53e4eb
|
||
|
|
9de21a730a
|
||
|
|
36c09c8657
|
||
|
|
e8ac143192
|
||
|
|
93f44939e3
|
||
|
|
48078b9b6a
|
||
|
d6d6858e0b
|
|||
|
|
0187ff1dc0
|
||
|
|
4f9fef8515
|
||
|
|
1ebadd42f0
|
||
|
|
4fb4f3a2de
|
||
|
|
f49169c03c
|
||
|
|
740c10c9b2 | ||
|
|
653f9fbcbe | ||
|
1767a677bb
|
|||
|
|
dba1799df0 | ||
|
|
2db3d7310f | ||
|
|
b2ba1e0e3b | ||
|
|
10b1cf64ae | ||
|
|
afdd3f1d43 | ||
|
|
1b8e3fe184 | ||
|
|
8ab1c6a899 | ||
|
|
e8fae19b97 | ||
|
|
63e70605fc | ||
|
|
35df9f7ab7 | ||
|
|
605d88add1 | ||
|
|
2b0a7d126d | ||
|
|
6e2c133faa | ||
|
|
9885ff1912 | ||
|
|
abb818bbd4 | ||
|
|
f1dc023e18 | ||
|
|
4a332c7ffa | ||
|
|
616f730ae5 | ||
|
|
164cea96f3 | ||
|
|
fa70c376b1 | ||
|
847f31f5a6
|
|||
|
|
fd130b78e7 | ||
|
|
0be0273121 | ||
|
|
b349de22b7 | ||
|
|
cc2d196705 | ||
|
|
53be29efc2 | ||
|
|
529ee63f29 | ||
|
|
490e8ec1fb | ||
|
|
df267ffd04 | ||
|
|
b771e8f49a | ||
|
|
a88e80a346 | ||
|
8ac9863765
|
|||
|
|
4a851501a1 | ||
|
|
4ccfe81558 | ||
|
|
e7ed9dfe86 | ||
|
|
0dce7aea45 | ||
|
|
6376c61bad | ||
|
bdd1403a7d
|
|||
|
|
23c3130a82 | ||
|
9172102f4d
|
|||
|
|
8bcd8317f1 | ||
|
6cd9d7b1da
|
|||
|
|
2c84184dbd | ||
|
|
901a6fc98f | ||
|
|
a0f6bdd8d9 | ||
|
|
8feb228ea0 | ||
|
|
b148fb735e | ||
|
|
0a9bcb6189 | ||
|
|
5a68cfa448 | ||
|
|
c99aaea598 | ||
|
|
46185c55d1 | ||
|
|
52aefc8d64 | ||
|
|
8dbdff7ff0 | ||
|
|
784fb20b4f | ||
|
|
0d9954290a | ||
|
|
13a7ee82d0 | ||
|
|
23138c5e03 | ||
|
|
213a622dde | ||
|
|
4ac3da7612 | ||
|
|
bb1f912f78 | ||
|
|
a190a5e8fb | ||
|
|
514a053dce | ||
|
|
0b199a18b4 | ||
|
|
23a125ea0f | ||
|
|
f406d27507 | ||
|
|
ceb6eb03fb | ||
|
|
b917b4e9d6 | ||
|
|
e981ae247e | ||
|
|
dcd7b5b111 | ||
|
|
a721256e9b | ||
|
|
007bcc8687 | ||
|
|
ccb94e6d69 | ||
|
|
3c9fd36654 | ||
|
|
9a9b5d5f4f | ||
|
|
d4f041aead | ||
|
8133da82c1
|
|||
|
|
fc8f211da2 | ||
|
|
cea4922442 | ||
|
|
669a313f92 | ||
|
|
ac7d6c65c7 | ||
|
|
c15f0454de | ||
|
6bddee0354
|
|||
|
|
43fc662bf6 | ||
|
|
d2b7878d03 | ||
|
|
c6d9e0b3c9 | ||
|
|
97169f4fa2 | ||
|
|
862101a3f7 | ||
|
|
a9a2a52881 | ||
|
|
c8aba00f85 | ||
|
|
bb321b6e8a | ||
|
|
6d5a152c17 | ||
|
|
4544d1548c | ||
|
|
e1b787c7ed | ||
|
|
108456fb59 | ||
|
|
0982bfbb56 | ||
|
|
a9e563663a | ||
|
|
986cc715fa | ||
|
|
76529f69d0 | ||
|
|
052ea9b727 | ||
|
|
ea4c2a1d1c | ||
|
|
3c77d58b11 | ||
|
|
3cea556827
|
||
|
|
c5bdb22a86
|
||
|
|
3142fd5700
|
||
|
|
95cf45073d | ||
|
|
efd3c95c10 | ||
|
|
d198206cc2 | ||
|
|
0b0bcedb1e | ||
|
|
5f7855d6d3 | ||
|
|
e3db84778a | ||
|
|
5363a0313f | ||
|
|
cb116b0f85 | ||
|
|
62e40d2824 | ||
|
e0b1985df5
|
|||
|
be585e914d
|
|||
|
|
e515bf7322
|
||
|
|
050f38feac
|
||
|
|
b94a435a9b
|
||
|
|
279854a9fd | ||
|
|
19ba020bd0 | ||
|
|
43a5bbd53a | ||
|
|
43630cbfa6 | ||
| ae2f48484a | |||
|
|
2c9b280a04 | ||
|
|
ba494f94ab | ||
|
|
26d2627a1c | ||
|
|
c2918aaf16 | ||
|
|
e332a7f82c | ||
|
|
8fbc9dc773 | ||
|
|
90c68fedfc | ||
|
|
ada99418f6 | ||
|
|
5492d9f499 | ||
|
|
faec79d45d | ||
|
|
846a786fd0 | ||
|
|
517f3714e8 | ||
|
|
b733799567 | ||
|
|
db8dfc5edc | ||
|
|
07c504f701 | ||
|
|
d58d777541 | ||
|
|
e951370a76 | ||
|
|
b18941383f | ||
|
|
f71957e061 | ||
|
|
68409f3440 | ||
|
|
247f313b54 | ||
|
|
79fef51f68 | ||
|
|
181d894df0 | ||
|
|
250efd9755 | ||
|
|
671b0b67ce | ||
|
|
98eddf1337 | ||
|
|
b31b917b70 | ||
|
|
c521998158 | ||
|
|
3f1f257df2 | ||
|
|
1339ec3ded | ||
|
|
770a845b36 | ||
|
|
68dd47130e | ||
|
|
8cdbc84093 | ||
|
|
6111e244de | ||
|
|
0043f0059d | ||
|
|
4413ec0ec5 | ||
|
|
0a6e40798a | ||
|
|
9a83872a22 | ||
|
|
988da17b06 | ||
|
|
5e530bfc9c | ||
|
|
0719e94fbc | ||
|
|
122775e586 | ||
|
|
d83d618829 | ||
|
|
669ca0d91c | ||
|
|
ad8d30ded1 | ||
|
|
f738aaf358 | ||
|
|
5f4c342131 | ||
|
|
fa738c4303 | ||
|
|
9511ba767a | ||
|
|
d9f78cf805 | ||
|
|
c2d81828d6 | ||
|
|
8da3ab30a5 | ||
|
|
4e8359458f | ||
|
|
c6e37bd864 | ||
|
|
8a95e40e0c | ||
|
|
184fc865bb | ||
|
|
034f31797e | ||
|
|
556a5bcf4d | ||
|
|
6de44223f2 | ||
|
|
75d87fee9d | ||
|
|
f6a295dcda | ||
|
|
55c26d22cb | ||
|
|
4c8134908c | ||
|
|
3ac7d75235 | ||
|
|
b49a5f4d29 | ||
|
|
3569919eaf | ||
|
|
55000e9d4d | ||
|
|
68a18f5e40 | ||
|
|
a18f50f250 | ||
|
|
1d4d2b0204 | ||
|
|
a9baef7a21 | ||
|
|
96ed6b7cc7 | ||
|
|
94f7e4d1e1 | ||
|
|
bdc811aa82 | ||
|
|
003348c103 | ||
|
|
1214f1839d | ||
|
|
7f6540b0c0 | ||
|
|
2be83560bc | ||
|
|
4c0c8b6678 | ||
|
|
904ae6c24d | ||
|
|
8d815fe4d6 | ||
|
|
58326f679e | ||
|
|
90180202b6 | ||
|
|
4a4a58c7b5 | ||
|
|
d694c26b83 | ||
|
|
2525799c8a | ||
|
|
b3b6fdc29e | ||
|
|
1a131cd179 | ||
|
|
adb6f66a4f | ||
|
|
a5f438b9c7 | ||
|
|
d7f04d9ab9 | ||
|
|
0b2ea46ef4 | ||
|
|
331ed96d57 | ||
|
|
701a747ed6 | ||
|
|
ab529c43eb | ||
|
|
b486d5e102 | ||
|
|
881dae0954 | ||
|
|
118c2bf2b2 | ||
|
|
7a4f82c97b | ||
|
|
d1e3a06cc6 | ||
|
|
b9d960b54b | ||
|
|
da82663634 | ||
|
|
aeafdccb02 | ||
|
|
f37957f47e | ||
|
|
b5f31ef714 | ||
|
|
907a49813f | ||
|
|
eb383c6bf0 | ||
|
|
e72e7b7196 | ||
|
|
449b9f9f1e | ||
|
|
035181b02a | ||
|
|
0ab5040caa
|
||
|
|
21cafc8f23
|
||
|
|
6c0ea0bb17
|
||
|
|
a1f3c481c5
|
||
|
|
cee5bd1a97
|
||
|
|
a43fa7349c
|
||
|
611cef712f
|
|||
|
|
28f292f692 | ||
|
|
4defab73d0 | ||
|
|
3d190a7388 | ||
|
|
4a40c9987d | ||
|
|
9735a28b44 | ||
|
|
48e8c11929 | ||
|
|
6ca6a76fdb | ||
|
|
504b21e91c | ||
|
|
afec694432 | ||
|
|
3c24e707fc | ||
|
|
28d6715fda | ||
|
|
b25d7d1c0d | ||
|
|
528d1b89b6 | ||
|
|
f05cd1b7e6 | ||
|
|
b73b1da46e | ||
|
|
f06b882139 | ||
|
|
fe177bdb9e | ||
|
|
dd498cdee2 | ||
|
|
66f17ecd96 | ||
|
|
86e9ee16a0 | ||
|
|
5f9477d55b | ||
|
|
1421c34aeb | ||
|
|
263389b2e6 | ||
|
|
cdd5327829 | ||
|
|
e649c49981 | ||
|
|
a6b430284f | ||
|
|
dd240899cf | ||
|
|
992b0f2eba | ||
|
|
9d91856ea3 | ||
|
|
7cc2825d89 | ||
|
|
5c76ffda8c | ||
|
|
f5f42528af | ||
|
|
ff6b19578e | ||
|
|
0c63f2ee26 | ||
|
|
500f8bc2ec | ||
|
|
7a3be720b2 | ||
|
|
854036b413 | ||
|
|
838ce26c64 | ||
|
|
83d2fbf7fd | ||
|
|
d5606aabca | ||
|
|
a6b508c25a | ||
|
|
a4f0eeadec | ||
|
|
e2361c1176 | ||
|
|
9d87bc11dd | ||
|
|
85e14de12d | ||
|
|
beb3605411 | ||
|
|
e3642b92d1 | ||
|
|
f190b6414c | ||
|
|
6ae326d193 | ||
|
|
851bffed0f | ||
|
|
5b820d6920 | ||
|
|
d04a29405d | ||
|
|
d3c75ce42b | ||
|
|
6731471c17 | ||
|
|
98359beb04 | ||
|
|
4686b7aca6 | ||
|
|
b80bab35b8 | ||
|
|
bfb0dbac56 | ||
|
|
fbdc5446f0 | ||
|
|
6e0ba3206d | ||
|
|
010d71d9ed | ||
|
|
deedf5577d | ||
|
|
4ddf647d5f | ||
|
|
e999e81e8f | ||
|
|
3cce42eea1 | ||
|
|
71c9bd63fc | ||
|
|
89f7c3ff30 | ||
|
|
6003a501c1 | ||
|
|
7aaea97de0 | ||
|
|
07b3146026 | ||
|
|
f36646116e | ||
|
|
6d2c382469 | ||
|
|
068b89d087 | ||
|
|
f13267aeb2 | ||
|
|
e6598928d0 | ||
|
|
a4253a613c | ||
|
|
66fd1dd444 | ||
|
|
b5c384da43 | ||
|
|
356ef45b91 | ||
|
|
f5d1401032 | ||
|
|
719cec449c | ||
|
|
56b1efc6f1 | ||
|
|
0f307ab8d5 | ||
|
|
ecc880ac85 | ||
|
|
26e2c98e72 | ||
|
|
d2f6b40625 | ||
|
|
63ad13a2d5 | ||
|
|
7894cad4f4 | ||
|
|
44bcae1485 | ||
|
|
d455d86a05 | ||
|
|
c67741983e | ||
|
|
ca779d472d | ||
|
|
f341a37902 | ||
|
|
ace8a7081b | ||
|
|
75d66434f3 | ||
|
|
61a9e44898 | ||
|
|
2861ee2c12 | ||
|
|
0f05123ef8 | ||
|
|
9f332a148f | ||
|
|
50f45288ce | ||
|
|
5840b85213 | ||
|
|
0650a62791 | ||
|
|
a4a0465605 | ||
|
|
3056ab9bfb | ||
|
|
d07ad67778 | ||
|
|
af75eed83a | ||
|
|
aa1f75ad58 | ||
|
|
f9bfa9dfa5 | ||
|
|
71b33fcd0b | ||
|
|
534969e616 | ||
|
|
75a9b4df7f | ||
|
|
a9e9701243 | ||
|
|
cb4adf06f1 | ||
|
|
97fc415b8c | ||
|
|
d49cf5a505 | ||
|
|
89e01d823a | ||
|
|
6edb3b1a40 | ||
|
|
d591dc0a7a | ||
|
|
3b436f9d58 | ||
|
|
4cf92756f1 | ||
|
|
6834367386 | ||
|
|
afe3dcf039 | ||
|
|
091a8ae090 | ||
|
|
ed30b123db | ||
|
|
bfad2ab42d | ||
|
|
227734d286 | ||
|
|
909701ce7b | ||
|
|
54674104ea | ||
|
|
aab9e97a25 | ||
|
|
c10ce4b1ba | ||
|
|
88801c2762 | ||
|
|
003482c971 | ||
|
|
c4f0e833ff | ||
|
|
5db22ae244 | ||
|
|
88f938d11c | ||
|
|
4171252b18 | ||
|
|
460f536fa3 | ||
|
|
c3e94f367c | ||
| bf78c0a3a0 | |||
|
|
eb41846bb9 | ||
|
|
f7946b1a7c | ||
|
|
84cfeb1604 | ||
|
|
4c37bfc128 | ||
|
|
548af2bf9d | ||
|
|
692146fe00 | ||
|
|
40134b4365 | ||
|
|
9a547077c1 | ||
|
|
0d71cc18ad | ||
|
|
d10554ab6c | ||
|
|
2656c30832 | ||
|
|
39b6dfb47e | ||
|
|
5ca5420ce2 | ||
|
|
4703ed80a7 | ||
|
|
f7e407e030 | ||
|
|
e547e26d99 | ||
|
|
f6044a9eea | ||
|
|
26bd50c948 | ||
|
|
6e0af0ba10 | ||
|
|
44b7ae2054 | ||
|
|
9cc21fc860 | ||
|
|
c9526b7aa6 | ||
|
|
055b7af1a3 | ||
|
|
de0b1dbda2 | ||
|
|
7605af84b5 | ||
|
|
d45eadef35 | ||
|
|
9cae934062 | ||
|
|
7fb5cdf6c0 | ||
|
|
49bbe62d2a | ||
|
|
705accd309 | ||
|
|
3375ccc4fa | ||
|
|
a9fecc3047 | ||
|
|
31b3ad9825 | ||
|
|
2bde3a9217 | ||
|
|
6050116314 | ||
|
|
a2cac142c0 | ||
|
|
8a20e5845e | ||
|
|
641e2564fb | ||
|
|
50810033c0 | ||
|
|
fab4e231b6 | ||
|
|
42ff49a803 | ||
|
|
8c878cbc4c | ||
|
|
face4268bf | ||
|
|
fed6c47835 | ||
|
|
8e9fb308f9 | ||
|
|
89b48db92d | ||
|
|
9581cc994d | ||
|
|
34e32bc930 | ||
|
|
dfcef0ba95 | ||
|
|
3c11ba53ce | ||
|
|
9759787c95 | ||
|
|
eef428ce4f | ||
|
|
d69647e071 | ||
|
|
c22f5e90a3 | ||
|
|
f2fe02032e | ||
|
|
da2bdad18d | ||
|
|
c7cc8df5ba | ||
|
|
92df446d72 | ||
|
|
7ea2af6172 | ||
|
|
184eea6e68 | ||
|
|
82372d1bf5 | ||
|
|
39f59eb798 | ||
|
|
639deec1a2 | ||
|
|
18780002bb | ||
|
|
722180bb9a | ||
|
|
366a584934 | ||
|
|
9ee09c3b59 | ||
|
|
e8caf3a7f4 | ||
|
|
b4ff6ee614 | ||
|
|
ed652db3d3 | ||
|
|
3d01c29148 | ||
|
|
1c1bb599ed | ||
|
|
25e6c77d9b | ||
|
|
5aae81c47d | ||
|
|
6b2fd4cec1 | ||
|
|
d486af6704 | ||
|
|
323f920848 | ||
|
|
c58c200acb | ||
|
|
c3786bf849 | ||
|
|
a0e882db64 | ||
|
|
eedf734dae | ||
|
|
cfa06797b7 | ||
|
|
824279742c | ||
|
|
2cdbadd09d | ||
|
|
1ea70c8427 | ||
|
|
09876c06d0 | ||
|
|
7a063f8aa0 | ||
|
|
b8ac026a3d | ||
|
|
c18853c957 | ||
|
|
0a09dbfe1c | ||
|
|
78e840734a | ||
|
|
1ccb300dd1 | ||
|
|
049a32db41 | ||
|
|
d82add1080 | ||
|
9d42715d76
|
|||
|
|
14fd06c052
|
||
|
|
e2ab3a41b4
|
||
|
|
6d7c2af504
|
||
|
|
f5fbd1d3c1
|
||
|
|
c4333280dd
|
||
|
|
6b6a98b71f
|
||
|
|
fb8c470e9d |
52
.github/ISSUE_TEMPLATE/app_release.md
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
name: App release process
|
||||||
|
about: Begin preparing for a new app release
|
||||||
|
title: 'Release: '
|
||||||
|
labels: release-tasks
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
A new version release. Please attempt to follow the release process steps below in the order they are shown.
|
||||||
|
|
||||||
|
## TestFlight release candidates
|
||||||
|
|
||||||
|
### Release candidate 1
|
||||||
|
|
||||||
|
**Version:** _[Enter full build information for the release candidate, including major and minor version number, build number, and commit hash]_
|
||||||
|
|
||||||
|
1. [ ] Merge in all needed changes to `master`
|
||||||
|
2. [ ] Check CI, make sure it is passing
|
||||||
|
3. [ ] Prepare preliminary changelog as a draft PR: _[Enter PR link to changelog here]_
|
||||||
|
4. [ ] Make a _release_ build and submit to the internal TestFlight group via our new Release candidate workflow in Xcode Cloud.
|
||||||
|
5. [ ] Prepare short screencast style video with main changes for the announcement
|
||||||
|
6. [ ] Publish release build to these TestFlight groups:
|
||||||
|
- [ ] Alpha testers group
|
||||||
|
- [ ] Translators group
|
||||||
|
- [ ] Purple group
|
||||||
|
7. [ ] Publish announcement on Nostr
|
||||||
|
|
||||||
|
|
||||||
|
_[Duplicate this release candidate section if there is more than one release candidate]_
|
||||||
|
|
||||||
|
|
||||||
|
## App Store release
|
||||||
|
|
||||||
|
1. [ ] Release candidate checks:
|
||||||
|
- [ ] Release candidate has been on Purple TestFlight for at least one week
|
||||||
|
- [ ] No blocker issues came from feedback from Purple users (double-check)
|
||||||
|
- [ ] Check with stakeholders
|
||||||
|
- [ ] Check with developers & product for any release showstoppers (e.g., critical newfound bugs)
|
||||||
|
2. [ ] Thorough check on release notes
|
||||||
|
3. [ ] Submit to App Store review (with manual publishing setting enabled)
|
||||||
|
4. [ ] Get App Store approval from Apple
|
||||||
|
5. [ ] Prepare announcement
|
||||||
|
7. [ ] Publish on the App Store and make announcement
|
||||||
|
8. [ ] Publish changelog and tag commit hash corresponding to the release
|
||||||
|
9. [ ] Perform a version bump on the repository, in preparation for the next release
|
||||||
|
|
||||||
|
|
||||||
|
## Notes/others
|
||||||
|
|
||||||
|
_Enter any relevant notes here_
|
||||||
|
|
||||||
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: 'Bug: '
|
||||||
|
labels: bug, Needs recreation
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**What happens**
|
||||||
|
When I perform action ___, _____ happens.
|
||||||
|
|
||||||
|
**What I expect to happen**
|
||||||
|
I expect _______ to happen.
|
||||||
|
|
||||||
|
**Link to noteID, npub**
|
||||||
|
Provide link to relevant noteID, npub etc.
|
||||||
|
|
||||||
|
**Screenshots/video recording**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
|
||||||
|
** Versions **
|
||||||
|
Damus version: [e.g. 1.7.2 (1()]
|
||||||
|
Operating system version: [e.g. iOS 17.2.1]
|
||||||
|
Device: e.g. iPhone 13 Pro
|
||||||
|
|
||||||
|
**Steps To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Open Damus
|
||||||
|
2. Tap on ___
|
||||||
|
3. Action ____
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
27
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: 'Feature Request:'
|
||||||
|
labels: feature
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Have a go at filling out the User Story template below
|
||||||
|
|
||||||
|
As a Damus user who is _____________, I would like to _________________, so that I achieve ___________.
|
||||||
|
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
** When does this problem happen? **
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
37
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
## Summary
|
||||||
|
|
||||||
|
_[Please provide a summary of the changes in this PR.]_
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] I have read (or I am familiar with) the [Contribution Guidelines](../docs/CONTRIBUTING.md)
|
||||||
|
- [ ] I have tested the changes in this PR
|
||||||
|
- [ ] I have opened or referred to an existing github issue related to this change.
|
||||||
|
- [ ] My PR is either small, or I have split it into smaller logical commits that are easier to review
|
||||||
|
- [ ] I have added the signoff line to all my commits. See [Signing off your work](../docs/CONTRIBUTING.md#sign-your-work---the-developers-certificate-of-origin)
|
||||||
|
- [ ] I have added appropriate changelog entries for the changes in this PR. See [Adding changelog entries](../docs/CONTRIBUTING.md#add-changelog-changed-changelog-fixed-etc)
|
||||||
|
- [ ] I do not need to add a changelog entry. Reason: _[Please provide a reason]_
|
||||||
|
- [ ] I have added appropriate `Closes:` or `Fixes:` tags in the commit messages wherever applicable, or made sure those are not needed. See [Submitting patches](https://github.com/damus-io/damus/blob/master/docs/CONTRIBUTING.md#submitting-patches)
|
||||||
|
|
||||||
|
## Test report
|
||||||
|
|
||||||
|
_Please provide a test report for the changes in this PR. You can use the template below, but feel free to modify it as needed._
|
||||||
|
|
||||||
|
**Device:** _[Please specify the device you used for testing]_
|
||||||
|
|
||||||
|
**iOS:** _[Please specify the iOS version you used for testing]_
|
||||||
|
|
||||||
|
**Damus:** _[Please specify the Damus version or commit hash you used for testing]_
|
||||||
|
|
||||||
|
**Setup:** _[Please provide a brief description of the setup you used for testing, if applicable]_
|
||||||
|
|
||||||
|
**Steps:** _[Please provide a list of steps you took to test the changes in this PR]_
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- [ ] PASS
|
||||||
|
- [ ] Partial PASS
|
||||||
|
- Details: _[Please provide details of the partial pass]_
|
||||||
|
|
||||||
|
## Other notes
|
||||||
|
|
||||||
|
_[Please provide any other information that you think is relevant to this PR.]_
|
||||||
1
.mailmap
@@ -4,3 +4,4 @@ Suhail Saqan <suhail.saqan@gmail.com> <43693074+suhailsaqan@users.noreply.github
|
|||||||
cr0bar <cr0bar@cr0.bar> <cr0bar@users.noreply.github.com>
|
cr0bar <cr0bar@cr0.bar> <cr0bar@users.noreply.github.com>
|
||||||
Swift <scoder1747@gmail.com> <120697811+scoder1747@users.noreply.github.com>
|
Swift <scoder1747@gmail.com> <120697811+scoder1747@users.noreply.github.com>
|
||||||
Daniel D'Aquino <daniel@daquino.me> <patches@damus.io>
|
Daniel D'Aquino <daniel@daquino.me> <patches@damus.io>
|
||||||
|
Transifex <transifex@transifex.com> <43880903+transifex-integration[bot]@users.noreply.github.com>
|
||||||
|
|||||||
5
ACKNOWLEDGEMENTS.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
### Acknowledgements and licenses
|
||||||
|
|
||||||
|
1. This product contains code derived from [Nostr SDK iOS](https://github.com/nostr-sdk/nostr-sdk-ios). [License](https://github.com/nostr-sdk/nostr-sdk-ios/blob/40df800c6749d7ce0b6fd7328e76cbc0dc71c87b/LICENSE)
|
||||||
|
2. This product includes software developed by the "Marcin Krzyzanowski" (http://krzyzanowskim.com/). [License](https://github.com/krzyzanowskim/CryptoSwift/blob/e74bbbfbef939224b242ae7c342a90e60b88b5ce/LICENSE)
|
||||||
|
|
||||||
385
CHANGELOG.md
@@ -1,3 +1,387 @@
|
|||||||
|
## [1.13.1] - 2025-03-21
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed an issue where threads would not load properly (Daniel D’Aquino)
|
||||||
|
|
||||||
|
|
||||||
|
[1.13.1]: https://github.com/damus-io/damus/releases/tag/v1.13.1
|
||||||
|
|
||||||
|
|
||||||
|
## [1.13] - 2025-03-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added local persistence of note drafts (Daniel D’Aquino)
|
||||||
|
- Added user-friendly error view for errors around the app that would not fit in other places (Daniel D’Aquino)
|
||||||
|
- Coinos connection button in Wallet view (ericholguin)
|
||||||
|
- Added Alby Go to mobile wallets selection menu (Tomek ⚡ K)
|
||||||
|
- Minor accessibility improvements around picture editing and onboarding (Daniel D’Aquino)
|
||||||
|
- Profile image cropping tools (Daniel D’Aquino)
|
||||||
|
- Added Conversations tab to profiles (Terry Yiu)
|
||||||
|
- Added profile pictures to push notifications (William Casarin)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Don't show reposts for the same note more than once in your home feed (William Casarin)
|
||||||
|
- Improved profile image bandwidth optimization (Daniel D’Aquino)
|
||||||
|
- Improved reliability of picture selector (Daniel D’Aquino)
|
||||||
|
- Changed spaces to newlines in new posts to provide cleaner separation between text, uploaded media, and quoted notes (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed issue where some push notifications would not open in the app and leave users confused (Daniel D’Aquino)
|
||||||
|
- Fixed issue where app would need a restart for new NWC wallets to work (Daniel D’Aquino)
|
||||||
|
- Fixed overly sensitive horizontal swipe on thread chat view (Daniel D’Aquino)
|
||||||
|
- Trim whitespaces from Lightning addresses (Terry Yiu)
|
||||||
|
- Fixed translation export script by upgrading nostr-sdk-swift dependency to support Mac Catalyst (Terry Yiu)
|
||||||
|
- Fixed issue where users continue to receive push notifications after logout (Daniel D’Aquino)
|
||||||
|
- Fixed an issue where events on a thread view would occasionally disappear (Daniel D’Aquino)
|
||||||
|
- Improved robustness of the URL handler (Daniel D’Aquino)
|
||||||
|
- Translate notes even if they are in a preferred language but not the current language as that is what users expect (Terry Yiu)
|
||||||
|
- Cancel ongoing uploading operations after the user cancels the post (Swift Coder)
|
||||||
|
- Fixed link and photo sharing support on macOS (Swift Coder)
|
||||||
|
- Fix bug where profile view was showing more than just the notes and replies on the notes / notes & replies tabs (Terry Yiu)
|
||||||
|
- Fixed reposts banner to be localizable (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed language filtering from Universe feed because language detection can be inaccurate (Terry Yiu)
|
||||||
|
- Removed mystery tabs meant to fix tab switching bug that no longer exists (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[1.13](https://github.com/damus-io/damus/releases/tag/v1.13): https://github.com/damus-io/damus/releases/tag/v1.13
|
||||||
|
|
||||||
|
|
||||||
|
## [1.12.3] - 2025-02-06
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Purple members who have been active for more than a year now get a special badge (Daniel D’Aquino)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved clarity of the mute button to indicate it can be used for blocking a user (Daniel D’Aquino)
|
||||||
|
- Made the microphone access request message more clear to users (Daniel D’Aquino)
|
||||||
|
|
||||||
|
[v1.12.3]: https://github.com/damus-io/damus/releases/tag/v1.12.3
|
||||||
|
|
||||||
|
|
||||||
|
## [1.12](https://github.com/damus-io/damus/releases/tag/v1.12) - 2024-12-20
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Render Gif and video files while composing posts (Swift Coder)
|
||||||
|
- Add profile info text in stretchable banner with follow button (Swift Coder)
|
||||||
|
- Paste Gif image similar to jpeg and png files (Swift Coder)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved UX around the label for searching words (Daniel D’Aquino)
|
||||||
|
- Improved accessibility support on some elements (Daniel D’Aquino)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed issue where the "next" button would appear hidden and hard to click on the create account view (Daniel D’Aquino)
|
||||||
|
- Fix non scrollable wallet screen (Swift Coder)
|
||||||
|
- Fixed suggested users category titles to be localizable (Terry Yiu)
|
||||||
|
- Fixed GradientFollowButton to have consistent width and autoscale text limited to 1 line (Terry Yiu)
|
||||||
|
- Fixed right-to-left localization issues (Terry Yiu)
|
||||||
|
- Fixed AddMuteItemView to trim leading and trailing whitespaces from mute text and disallow adding text with only whitespaces (Terry Yiu)
|
||||||
|
- Fixed SideMenuView text to autoscale and limit to 1 line (Terry Yiu)
|
||||||
|
- Fixed an issue where a profile would need to be input twice in the search to be found (Daniel D’Aquino)
|
||||||
|
- Fixed non-breaking spaces in localized strings (Terry Yiu)
|
||||||
|
- Fixed localization issue on Add mute item button (Terry Yiu)
|
||||||
|
- Replace non-breaking spaces with regular spaces as Apple's NSLocalizedString macro does not seem to work with it (Terry Yiu)
|
||||||
|
- Fixed localization issues in RelayConfigView (Terry Yiu)
|
||||||
|
- Fix duplicate uploads (Swift Coder)
|
||||||
|
- Remove duplicate pubkey from Follow Suggestion list (Swift Coder)
|
||||||
|
- Fix Page control indicator (Swift Coder)
|
||||||
|
- Fix damus sharing issues (Swift Coder)
|
||||||
|
- Fixed issue where banner edit button is unclickable (Daniel D’Aquino)
|
||||||
|
- Handle empty notification pages by displaying suitable text (Swift Coder)
|
||||||
|
|
||||||
|
[v1.12](https://github.com/damus-io/damus/releases/tag/v1.12): [https://github.com/damus-io/damus/releases/tag/v1.12]
|
||||||
|
|
||||||
|
|
||||||
|
## [v1.11(10)](https://github.com/damus-io/damus/releases/tag/v1.11-10) - 2024-11-18
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add Damus Share Feature (Swift)
|
||||||
|
- Added new easy to use video controls for full screen video (Daniel D’Aquino)
|
||||||
|
- Add Edit, Share, and Tap-gesture in Profile pic image viewer (Swift Coder)
|
||||||
|
- Disappearing header, tabbar, and post button on scroll (ericholguin)
|
||||||
|
- Add Apple translation popovers for notes for iOS 17.4+ and macOS 14.4+ (Terry Yiu)
|
||||||
|
- Added NDB search functionality to the universe view (ericholguin)
|
||||||
|
- Added mute button to ProfileActionSheet (chungwwei)
|
||||||
|
- Added mute action to selected text menu (ericholguin)
|
||||||
|
- Added support for pasting images from the clipboard to the post composer (Swift Coder)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved image carousel image fill behavior (Daniel D’Aquino)
|
||||||
|
- Improved video syncing and bandwidth usage when switching between timeline video and full screen mode (Daniel D’Aquino)
|
||||||
|
- Swipe to dismiss on full screen carousel now shows an opacity effect for improved UX (Daniel D’Aquino)
|
||||||
|
- Removed event contents from full screen media carousel for cleaner view (Daniel D’Aquino)
|
||||||
|
- Add share button for images on full screen image carousel view (Swift)
|
||||||
|
- Changed boldness of font in side menu labels. (ericholguin)
|
||||||
|
- Changed search notes button with searched keyword (ericholguin)
|
||||||
|
- Changed opacity of tabbar and post button (ericholguin)
|
||||||
|
- Allow multiple images to be uploaded at the same time (swiftcoder) (William Casarin)
|
||||||
|
- Changed side menu design (ericholguin)
|
||||||
|
- Truncate fulltext search results (William Casarin)
|
||||||
|
- Expanded profile search results to 128 (William Casarin)
|
||||||
|
- Expand nostrdb text search results to 128 items (William Casarin)
|
||||||
|
- Use LazyVStack in text search results (William Casarin)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed missing tab bar on navigation (Swift Coder)
|
||||||
|
- Fixed some issues where QR code would not work, and improved UX (Daniel D’Aquino)
|
||||||
|
- Fixed iOS 18 gesture issues that would take user to the thread view when clicking on a video or unmuting it (Daniel D’Aquino)
|
||||||
|
- Fixed several issues that would cause video to automatically play or pause incorrectly (Daniel D’Aquino)
|
||||||
|
- Fixed issue where full screen video would disappear when going to landscape mode (Daniel D’Aquino)
|
||||||
|
- Fixed portrait video size on full screen carousel (Daniel D’Aquino)
|
||||||
|
- Fix avatar image on qrcode view (Swift Coder)
|
||||||
|
- Fix banner image upload (Swift Coder)
|
||||||
|
- Fix dismiss button visibility (Swift Coder)
|
||||||
|
- Fix quote repost counting (William Casarin)
|
||||||
|
- Fixed overlapping text in Universe View (ericholguin)
|
||||||
|
- Fixed localization issues and exported strings (Terry Yiu)
|
||||||
|
- Fix sensitive long-press gesture on event chat bubble in iOS 18 (Daniel D’Aquino)
|
||||||
|
- Fixed bottom padding for tabbar (ericholguin)
|
||||||
|
- Fixed localization build failures (Terry Yiu)
|
||||||
|
- Fixed back nav button placement in profile edit view (ericholguin)
|
||||||
|
- Friend profiles will now more likely show up in profile search (William Casarin)
|
||||||
|
- Fix broken QR code scanner and fix landscape mode (Terry Yiu)
|
||||||
|
|
||||||
|
[1.11(10)](https://github.com/damus-io/damus/releases/tag/v1.11-10): https://github.com/damus-io/damus/releases/tag/v1.11-10
|
||||||
|
|
||||||
|
## [1.10.1] - 2024-09-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Push notification support (Daniel D’Aquino)
|
||||||
|
- Added profile edit safe guards (Eric Holguin)
|
||||||
|
- Tor relay icon (ericholguin)
|
||||||
|
- Add highlighter for web pages (Daniel D’Aquino)
|
||||||
|
- Add support for adding comments when creating a highlight (Daniel D’Aquino)
|
||||||
|
- Add support for rendering highlights with comments (Daniel D’Aquino)
|
||||||
|
- Ability to create highlights (ericholguin)
|
||||||
|
- Highlights (NIP-84) (ericholguin)
|
||||||
|
- Revamp emoji picker to be less error-prone and add search, frequently used, and multiple skin tone support capabilities (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improve notification view filtering UX (Daniel D’Aquino)
|
||||||
|
- Improve visibility of friends filter button (Daniel D’Aquino)
|
||||||
|
- Changed the default banner from ostriches to damoose (Eric Holguin)
|
||||||
|
- Changed image and banner url text fields to new sheet view (Eric Holguin)
|
||||||
|
- Onboarding design (ericholguin)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix items that became unclickable on iOS 18 (Daniel D’Aquino)
|
||||||
|
- Fix many reconnection issues (William Casarin)
|
||||||
|
- Fixed issue where theme would be changed to black and can't be switched back on iOS 18 (cr0bar)
|
||||||
|
- Fixed some scenarios where the contact list would never be saved locally and cause issues when switching relays. (Daniel D’Aquino)
|
||||||
|
- Fix albyhub zaps not appearing (William Casarin)
|
||||||
|
- Fix inadvertent escape from mention suggestion menu when typing a space character (Daniel D’Aquino)
|
||||||
|
- Fix profile view toolbar alignment bug in iOS 18 (Terry Yiu)
|
||||||
|
- Create Account model now uses correct metadata (ericholguin)
|
||||||
|
- Restore localization for custom tabs (William Casarin)
|
||||||
|
- Fix iOS 18 reflection runtime error for custom picker (William Casarin)
|
||||||
|
|
||||||
|
|
||||||
|
[1.10.1]: https://github.com/damus-io/damus/releases/tag/v1.10.1
|
||||||
|
|
||||||
|
|
||||||
|
## [1.9.1 (4)] - 2024-08-13
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix crash when viewing notes with invalid image dimension metadata (Daniel D’Aquino)
|
||||||
|
|
||||||
|
[1.9.1 (4)]: https://github.com/damus-io/damus/releases/tag/v1.9.1-4
|
||||||
|
|
||||||
|
|
||||||
|
## [1.9 (14)] - 2024-07-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Completely new threads experience that is easier and more pleasant to use (Daniel D’Aquino)
|
||||||
|
- Add emoji search to emoji picker (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Added first aid contact damus support email (alltheseas)
|
||||||
|
- Disable mutiny wallet button (William Casarin)
|
||||||
|
- Make friends show up first when searching for profiles (Terry Yiu)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix crash on profile page when there are profile updates (William Casarin)
|
||||||
|
- Fix crash when adding duplicate mute items (William Casarin)
|
||||||
|
- Fix pretty bad crash when building flatbuffer profiles (William Casarin)
|
||||||
|
- Fix reactions view to not show reactions from replies on parent note (Terry Yiu)
|
||||||
|
- Fix missing Mute button in profile view menu (Terry Yiu)
|
||||||
|
- Fixed wallet not disconnecting when a user logs out (ericholguin)
|
||||||
|
- Fix stale feed issue when follow list is too big (Daniel D’Aquino)
|
||||||
|
|
||||||
|
[1.9 (14)]: https://github.com/damus-io/damus/releases/tag/v1.9-14
|
||||||
|
|
||||||
|
## [1.8] - 2024-05-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added nip10 marker replies (William Casarin)
|
||||||
|
- Add marker nip10 support when reading notes (William Casarin)
|
||||||
|
- Added title image and tags to longform events (ericholguin)
|
||||||
|
- Add First Aid solution for users who do not have a contact list created for their account (Daniel D’Aquino)
|
||||||
|
- Relay fees metadata (ericholguin)
|
||||||
|
- Added callbackuri for a better ux when connecting mutiny wallet nwc (ericholguin)
|
||||||
|
- Add event content preview to the full screen carousel (Daniel D’Aquino)
|
||||||
|
- Show list of quoted reposts in threads (William Casarin)
|
||||||
|
- Proxy Tags are now viewable on Selected Events (ericholguin)
|
||||||
|
- Connect to Mutiny Wallet Button (ericholguin)
|
||||||
|
- Add ability to mute words, add new mutelist interface (Charlie) (William Casarin)
|
||||||
|
- Add ability to mute hashtag from SearchView (Charlie Fish)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Change reactions to use a native looking emoji picker (Terry Yiu)
|
||||||
|
- Relay detail design (ericholguin)
|
||||||
|
- Updated Zeus logo (ericholguin)
|
||||||
|
- Improve UX around video playback (Daniel D’Aquino)
|
||||||
|
- Moved paste nwc button to main wallet view (ericholguin)
|
||||||
|
- Errors with an NWC will show as an alert (ericholguin)
|
||||||
|
- Relay config view user interface (ericholguin)
|
||||||
|
- Always strip GPS data from images (kernelkind)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix thread bug where a quote isn't picked up as a reply (William Casarin)
|
||||||
|
- Fixed threads not loading sometimes (William Casarin)
|
||||||
|
- Fixed issue where some replies were including the q tag (William Casarin)
|
||||||
|
- Fixed issue where timeline was scrolling when it isn't supposed to (William Casarin)
|
||||||
|
- Fix issue where bootstrap relays would inadvertently be added to the user's list on connectivity issues (Daniel D’Aquino)
|
||||||
|
- Fix broken GIF uploads (Daniel D’Aquino)
|
||||||
|
- Fix ghost notifications caused by Purple impending expiration notifications (Daniel D’Aquino)
|
||||||
|
- Improve reliability of contact list creation during onboarding (Daniel D’Aquino)
|
||||||
|
- Fix emoji reactions being cut off (ericholguin)
|
||||||
|
- Fix image indicators to limit number of dots to not spill screen beyond visible margins (ericholguin)
|
||||||
|
- Fix bug that would cause connection issues with relays defined with a trailing slash URL, and an inability to delete them. (Daniel D’Aquino)
|
||||||
|
- Issue where NWC Scanner view would not dismiss after a failed scan/paste (ericholguin)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[1.8]: https://github.com/damus-io/damus/releases/tag/v1.8
|
||||||
|
|
||||||
|
## [1.7-rc2] - 2024-02-28
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add support for Apple In-App purchases (Daniel D’Aquino)
|
||||||
|
- Notification reminders for Damus Purple impending expiration (Daniel D’Aquino)
|
||||||
|
- Damus Purple membership! (William Casarin)
|
||||||
|
- Fixed minor spacing and padding issues in onboarding views (ericholguin)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Disable inline text suggestions on 17.0 as they interfere with mention generation (William Casarin)
|
||||||
|
- EULA is not shown by default (ericholguin)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix welcome screen not showing if the user enters the app directly after a successful checkout without going through the link (Daniel D’Aquino)
|
||||||
|
- Fix profile not updating bug (William Casarin)
|
||||||
|
- Fix nostrscripts not loading (William Casarin)
|
||||||
|
- Fix crash when accessing cached purple accounts (William Casarin)
|
||||||
|
- Hide member signup date on reposts (kernelkind)
|
||||||
|
- Fixed previews not rendering (ericholguin)
|
||||||
|
- Fix load media formatting on small screens (kernelkind)
|
||||||
|
- Fix shared nevents that are too long (kernelkind)
|
||||||
|
- Fix many nostrdb transaction related crashes (William Casarin)
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed copying public key action (ericholguin)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[1.7-rc2]: https://github.com/damus-io/damus/releases/tag/v1.7-rc2
|
||||||
|
|
||||||
|
## [1.7-2] - 2024-01-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- New fulltext search engine (William Casarin)
|
||||||
|
|
||||||
|
- Add "Always show onboarding suggestions" developer setting (Daniel D’Aquino)
|
||||||
|
- Add NIP-42 relay auth support (Charlie Fish)
|
||||||
|
- Add ability to hide suggested hashtags (ericholguin)
|
||||||
|
- Add ability to mute hashtag from SearchView (Charlie Fish)
|
||||||
|
- Add ability to preview media taken with camera (Suhail Saqan)
|
||||||
|
- Add ability to search for naddr, nprofiles, nevents (kernelkind)
|
||||||
|
- Add experimental push notification support (Daniel D’Aquino)
|
||||||
|
- Add naddr link support (kernelkind)
|
||||||
|
- Add regional relay recommendations to Relay configuration view (currently for Japanese users only) (Daniel D’Aquino)
|
||||||
|
- Add regional relays for Germany (Daniel D’Aquino)
|
||||||
|
- Add regional relays for Thailand (Daniel D’Aquino)
|
||||||
|
- Added a custom camera view (Suhail Saqan)
|
||||||
|
- Always convert damus.io links to inline mentions (William Casarin)
|
||||||
|
- Unfurl profile name on remote push notifications (Daniel D’Aquino)
|
||||||
|
- Zap notification support for push notifications (Daniel D’Aquino)
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Generate nprofile/nevent links in share menus (kernelkind)
|
||||||
|
- Improve push notification support to match local notification support (Daniel D’Aquino)
|
||||||
|
- Move mute thread in menu so it's not clicked by accident (alltheseas)
|
||||||
|
- Prioritize friends when autocompleting (Charlie Fish)
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Add workaround to fix note language recognition and reduce wasteful translation requests (Terry Yiu)
|
||||||
|
- Allow mentioning users with punctuation characters in their names (kernelkind)
|
||||||
|
- Fix broken mentions when there is text is directly after (kernelkind)
|
||||||
|
- Fix crash on very large notes (Daniel D’Aquino)
|
||||||
|
- Fix crash when logging out and switching accounts (William Casarin)
|
||||||
|
- Fix duplicate notes getting written to nostrdb (William Casarin)
|
||||||
|
- Fix issue where adding relays might not work on corrupted contact lists (Charlie Fish)
|
||||||
|
- Fix onboarding post view not being dismissed under certain conditions (Daniel D’Aquino)
|
||||||
|
- Fix performance issue with gifs (William Casarin)
|
||||||
|
- Fix persistent local notifications even after logout (William Casarin)
|
||||||
|
- Fixed bug where sometimes notes from other profiles appear on profile pages (Charlie Fish)
|
||||||
|
- Remove extra space at the end of DM messages (kernelkind)
|
||||||
|
- Save current viewed image index when switching to fullscreen (kernelkind)
|
||||||
|
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed old nsec key warning, nsec automatically convert to npub when posting (kernelkind)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[1.7-2]: https://github.com/damus-io/damus/releases/tag/v1.7-2
|
||||||
## [1.6-25] - 2023-10-31
|
## [1.6-25] - 2023-10-31
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -1651,4 +2035,3 @@
|
|||||||
|
|
||||||
|
|
||||||
[0.1.2]: https://github.com/damus-io/damus/releases/tag/v0.1.2
|
[0.1.2]: https://github.com/damus-io/damus/releases/tag/v0.1.2
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>com.apple.developer.usernotifications.communication</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.developer.kernel.extended-virtual-addressing</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
@@ -10,5 +14,9 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>com.apple.security.network.client</key>
|
<key>com.apple.security.network.client</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>keychain-access-groups</key>
|
||||||
|
<array>
|
||||||
|
<string>$(AppIdentifierPrefix)com.jb55.damus2</string>
|
||||||
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
//
|
|
||||||
// NostrEventInfoFromPushNotification.swift
|
|
||||||
// DamusNotificationService
|
|
||||||
//
|
|
||||||
// Created by Daniel D’Aquino on 2023-11-13.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
/// The representation of a JSON-encoded Nostr Event used by the push notification server
|
|
||||||
/// Needs to match with https://gitlab.com/soapbox-pub/strfry-policies/-/raw/433459d8084d1f2d6500fdf916f22caa3b4d7be5/src/types.ts
|
|
||||||
struct NostrEventInfoFromPushNotification: Codable {
|
|
||||||
let id: String // Hex-encoded
|
|
||||||
let sig: String // Hex-encoded
|
|
||||||
let kind: NostrKind
|
|
||||||
let tags: [[String]]
|
|
||||||
let pubkey: String // Hex-encoded
|
|
||||||
let content: String
|
|
||||||
let created_at: Int
|
|
||||||
|
|
||||||
static func from(dictionary: [AnyHashable: Any]) -> NostrEventInfoFromPushNotification? {
|
|
||||||
guard let id = dictionary["id"] as? String,
|
|
||||||
let sig = dictionary["sig"] as? String,
|
|
||||||
let kind_int = dictionary["kind"] as? UInt32,
|
|
||||||
let kind = NostrKind(rawValue: kind_int),
|
|
||||||
let tags = dictionary["tags"] as? [[String]],
|
|
||||||
let pubkey = dictionary["pubkey"] as? String,
|
|
||||||
let content = dictionary["content"] as? String,
|
|
||||||
let created_at = dictionary["created_at"] as? Int else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return NostrEventInfoFromPushNotification(id: id, sig: sig, kind: kind, tags: tags, pubkey: pubkey, content: content, created_at: created_at)
|
|
||||||
}
|
|
||||||
|
|
||||||
func reactionEmoji() -> String? {
|
|
||||||
guard self.kind == NostrKind.like else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch self.content {
|
|
||||||
case "", "+":
|
|
||||||
return "❤️"
|
|
||||||
case "-":
|
|
||||||
return "👎"
|
|
||||||
default:
|
|
||||||
return self.content
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
45
DamusNotificationService/NotificationExtensionState.swift
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// NotificationExtensionState.swift
|
||||||
|
// DamusNotificationService
|
||||||
|
//
|
||||||
|
// Created by Daniel D’Aquino on 2023-11-27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct NotificationExtensionState: HeadlessDamusState {
|
||||||
|
let ndb: Ndb
|
||||||
|
let settings: UserSettingsStore
|
||||||
|
let contacts: Contacts
|
||||||
|
let mutelist_manager: MutelistManager
|
||||||
|
let keypair: Keypair
|
||||||
|
let profiles: Profiles
|
||||||
|
let zaps: Zaps
|
||||||
|
let lnurls: LNUrls
|
||||||
|
|
||||||
|
init?() {
|
||||||
|
guard let ndb = Ndb(owns_db_file: false) else { return nil }
|
||||||
|
self.ndb = ndb
|
||||||
|
|
||||||
|
guard let keypair = get_saved_keypair() else { return nil }
|
||||||
|
|
||||||
|
// dumb stuff needed for property wrappers
|
||||||
|
UserSettingsStore.pubkey = keypair.pubkey
|
||||||
|
self.settings = UserSettingsStore()
|
||||||
|
|
||||||
|
self.contacts = Contacts(our_pubkey: keypair.pubkey)
|
||||||
|
self.mutelist_manager = MutelistManager(user_keypair: keypair)
|
||||||
|
self.keypair = keypair
|
||||||
|
self.profiles = Profiles(ndb: ndb)
|
||||||
|
self.zaps = Zaps(our_pubkey: keypair.pubkey)
|
||||||
|
self.lnurls = LNUrls()
|
||||||
|
}
|
||||||
|
|
||||||
|
@discardableResult
|
||||||
|
func add_zap(zap: Zapping) -> Bool {
|
||||||
|
// store generic zap mapping
|
||||||
|
self.zaps.add_zap(zap: zap)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,16 +11,17 @@ import UserNotifications
|
|||||||
struct NotificationFormatter {
|
struct NotificationFormatter {
|
||||||
static var shared = NotificationFormatter()
|
static var shared = NotificationFormatter()
|
||||||
|
|
||||||
// TODO: These is a very generic notification formatter. Once we integrate NostrDB into the extension, we should reuse various functions present in `HomeModel.swift`
|
// MARK: - Formatting with NdbNote
|
||||||
func formatMessage(event: NostrEventInfoFromPushNotification) -> UNNotificationContent? {
|
|
||||||
|
func format_message(event: NdbNote) -> UNMutableNotificationContent? {
|
||||||
let content = UNMutableNotificationContent()
|
let content = UNMutableNotificationContent()
|
||||||
if let event_json_data = try? JSONEncoder().encode(event), // Must be encoded, as the notification completion handler requires this object to conform to `NSSecureCoding`
|
if let event_json_data = try? JSONEncoder().encode(event), // Must be encoded, as the notification completion handler requires this object to conform to `NSSecureCoding`
|
||||||
let event_json_string = String(data: event_json_data, encoding: .utf8) {
|
let event_json_string = String(data: event_json_data, encoding: .utf8) {
|
||||||
content.userInfo = [
|
content.userInfo = [
|
||||||
"nostr_event_info": event_json_string
|
NDB_NOTE_JSON_USER_INFO_KEY: event_json_string
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
switch event.kind {
|
switch event.known_kind {
|
||||||
case .text:
|
case .text:
|
||||||
content.title = NSLocalizedString("Someone posted a note", comment: "Title label for push notification where someone posted a note")
|
content.title = NSLocalizedString("Someone posted a note", comment: "Title label for push notification where someone posted a note")
|
||||||
content.body = event.content
|
content.body = event.content
|
||||||
@@ -30,7 +31,7 @@ struct NotificationFormatter {
|
|||||||
content.body = NSLocalizedString("(Contents are encrypted)", comment: "Label on push notification indicating that the contents of the message are encrypted")
|
content.body = NSLocalizedString("(Contents are encrypted)", comment: "Label on push notification indicating that the contents of the message are encrypted")
|
||||||
break
|
break
|
||||||
case .like:
|
case .like:
|
||||||
guard let reactionEmoji = event.reactionEmoji() else {
|
guard let reactionEmoji = to_reaction_emoji(ev: event) else {
|
||||||
content.title = NSLocalizedString("Someone reacted to your note", comment: "Generic title label for push notifications where someone reacted to the user's post")
|
content.title = NSLocalizedString("Someone reacted to your note", comment: "Generic title label for push notifications where someone reacted to the user's post")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -45,4 +46,98 @@ struct NotificationFormatter {
|
|||||||
}
|
}
|
||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Formatting with LocalNotification
|
||||||
|
|
||||||
|
func format_message(displayName: String, notify: LocalNotification) -> (content: UNMutableNotificationContent, identifier: String)? {
|
||||||
|
let content = UNMutableNotificationContent()
|
||||||
|
var title = ""
|
||||||
|
var identifier = ""
|
||||||
|
|
||||||
|
switch notify.type {
|
||||||
|
case .tagged:
|
||||||
|
title = String(format: NSLocalizedString("Tagged by %@", comment: "Tagged by heading in local notification"), displayName)
|
||||||
|
identifier = "myMentionNotification"
|
||||||
|
case .mention:
|
||||||
|
title = String(format: NSLocalizedString("Mentioned by %@", comment: "Mentioned by heading in local notification"), displayName)
|
||||||
|
identifier = "myMentionNotification"
|
||||||
|
case .repost:
|
||||||
|
title = String(format: NSLocalizedString("Reposted by %@", comment: "Reposted by heading in local notification"), displayName)
|
||||||
|
identifier = "myBoostNotification"
|
||||||
|
case .like:
|
||||||
|
title = String(format: NSLocalizedString("%@ reacted with %@", comment: "Reacted by heading in local notification"), displayName, to_reaction_emoji(ev: notify.event) ?? "")
|
||||||
|
identifier = "myLikeNotification"
|
||||||
|
case .dm:
|
||||||
|
title = displayName
|
||||||
|
identifier = "myDMNotification"
|
||||||
|
case .zap, .profile_zap:
|
||||||
|
// not handled here. Try `format_message(displayName: String, notify: LocalNotification, state: HeadlessDamusState) async -> (content: UNMutableNotificationContent, identifier: String)?`
|
||||||
|
return nil
|
||||||
|
case .reply:
|
||||||
|
title = String(format: NSLocalizedString("%@ replied to your note", comment: "Heading for local notification indicating a new reply"), displayName)
|
||||||
|
identifier = "myReplyNotification"
|
||||||
|
}
|
||||||
|
content.title = title
|
||||||
|
content.body = notify.content
|
||||||
|
content.sound = UNNotificationSound.default
|
||||||
|
content.userInfo = notify.to_lossy().to_user_info()
|
||||||
|
|
||||||
|
return (content, identifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
func format_message(displayName: String, notify: LocalNotification, state: HeadlessDamusState) async -> (content: UNMutableNotificationContent, identifier: String)? {
|
||||||
|
// Try sync method first and return if it works
|
||||||
|
if let sync_formatted_message = self.format_message(displayName: displayName, notify: notify) {
|
||||||
|
return sync_formatted_message
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it does not work, try async formatting methods
|
||||||
|
let content = UNMutableNotificationContent()
|
||||||
|
|
||||||
|
switch notify.type {
|
||||||
|
case .zap, .profile_zap:
|
||||||
|
guard let zap = await get_zap(from: notify.event, state: state) else {
|
||||||
|
Log.debug("format_message: async get_zap failed", for: .push_notifications)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
content.title = Self.zap_notification_title(zap)
|
||||||
|
content.body = Self.zap_notification_body(profiles: state.profiles, zap: zap)
|
||||||
|
content.sound = UNNotificationSound.default
|
||||||
|
content.userInfo = LossyLocalNotification(type: .zap, mention: .note(notify.event.id)).to_user_info()
|
||||||
|
return (content, "myZapNotification")
|
||||||
|
default:
|
||||||
|
// The sync method should have taken care of this.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Formatting zap utility notifications
|
||||||
|
|
||||||
|
static func zap_notification_title(_ zap: Zap) -> String {
|
||||||
|
if zap.private_request != nil {
|
||||||
|
return NSLocalizedString("Private Zap", comment: "Title of notification when a private zap is received.")
|
||||||
|
} else {
|
||||||
|
return NSLocalizedString("Zap", comment: "Title of notification when a non-private zap is received.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static func zap_notification_body(profiles: Profiles, zap: Zap, locale: Locale = Locale.current) -> String {
|
||||||
|
let src = zap.request.ev
|
||||||
|
let pk = zap.is_anon ? ANON_PUBKEY : src.pubkey
|
||||||
|
|
||||||
|
let profile_txn = profiles.lookup(id: pk)
|
||||||
|
let profile = profile_txn?.unsafeUnownedValue
|
||||||
|
let name = Profile.displayName(profile: profile, pubkey: pk).displayName.truncate(maxLength: 50)
|
||||||
|
|
||||||
|
let sats = NSNumber(value: (Double(zap.invoice.amount) / 1000.0))
|
||||||
|
let formattedSats = format_msats_abbrev(zap.invoice.amount)
|
||||||
|
|
||||||
|
if src.content.isEmpty {
|
||||||
|
let format = localizedStringFormat(key: "zap_notification_no_message", locale: locale)
|
||||||
|
return String(format: format, locale: locale, sats.decimalValue as NSDecimalNumber, formattedSats, name)
|
||||||
|
} else {
|
||||||
|
let format = localizedStringFormat(key: "zap_notification_with_message", locale: locale)
|
||||||
|
return String(format: format, locale: locale, sats.decimalValue as NSDecimalNumber, formattedSats, name, src.content)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,34 +5,151 @@
|
|||||||
// Created by Daniel D’Aquino on 2023-11-10.
|
// Created by Daniel D’Aquino on 2023-11-10.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
import Kingfisher
|
||||||
|
import ImageIO
|
||||||
import UserNotifications
|
import UserNotifications
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import UniformTypeIdentifiers
|
||||||
|
import Intents
|
||||||
|
|
||||||
class NotificationService: UNNotificationServiceExtension {
|
class NotificationService: UNNotificationServiceExtension {
|
||||||
|
|
||||||
var contentHandler: ((UNNotificationContent) -> Void)?
|
var contentHandler: ((UNNotificationContent) -> Void)?
|
||||||
var bestAttemptContent: UNMutableNotificationContent?
|
var bestAttemptContent: UNMutableNotificationContent?
|
||||||
|
|
||||||
|
private func configureKingfisherCache() {
|
||||||
|
guard let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Constants.DAMUS_APP_GROUP_IDENTIFIER) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let cachePath = groupURL.appendingPathComponent(Constants.IMAGE_CACHE_DIRNAME)
|
||||||
|
if let cache = try? ImageCache(name: "sharedCache", cacheDirectoryURL: cachePath) {
|
||||||
|
KingfisherManager.shared.cache = cache
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
||||||
|
configureKingfisherCache()
|
||||||
|
|
||||||
self.contentHandler = contentHandler
|
self.contentHandler = contentHandler
|
||||||
|
|
||||||
let ndb: Ndb? = try? Ndb(owns_db_file: false)
|
guard let nostr_event_json = request.content.userInfo["nostr_event"] as? String,
|
||||||
|
let nostr_event = NdbNote.owned_from_json(json: nostr_event_json)
|
||||||
// Modify the notification content here...
|
else {
|
||||||
guard let nostrEventInfoDictionary = request.content.userInfo["nostr_event"] as? [AnyHashable: Any],
|
// No nostr event detected. Just display the original notification
|
||||||
let nostrEventInfo = NostrEventInfoFromPushNotification.from(dictionary: nostrEventInfoDictionary) else {
|
|
||||||
contentHandler(request.content)
|
contentHandler(request.content)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log that we got a push notification
|
// Log that we got a push notification
|
||||||
if let pubkey = Pubkey(hex: nostrEventInfo.pubkey),
|
Log.debug("Got nostr event push notification from pubkey %s", for: .push_notifications, nostr_event.pubkey.hex())
|
||||||
let txn = ndb?.lookup_profile(pubkey) {
|
|
||||||
Log.debug("Got push notification from %s (%s)", for: .push_notifications, (txn.unsafeUnownedValue?.profile?.display_name ?? "Unknown"), nostrEventInfo.pubkey)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let improvedContent = NotificationFormatter.shared.formatMessage(event: nostrEventInfo) {
|
guard let state = NotificationExtensionState() else {
|
||||||
contentHandler(improvedContent)
|
Log.debug("Failed to open nostrdb", for: .push_notifications)
|
||||||
|
|
||||||
|
// Something failed to initialize so let's go for the next best thing
|
||||||
|
guard let improved_content = NotificationFormatter.shared.format_message(event: nostr_event) else {
|
||||||
|
// We cannot format this nostr event. Suppress notification.
|
||||||
|
contentHandler(UNNotificationContent())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
contentHandler(improved_content)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let sender_profile = {
|
||||||
|
let txn = state.ndb.lookup_profile(nostr_event.pubkey)
|
||||||
|
let profile = txn?.unsafeUnownedValue?.profile
|
||||||
|
let picture = ((profile?.picture.map { URL(string: $0) }) ?? URL(string: robohash(nostr_event.pubkey)))!
|
||||||
|
return ProfileBuf(picture: picture,
|
||||||
|
name: profile?.name,
|
||||||
|
display_name: profile?.display_name,
|
||||||
|
nip05: profile?.nip05)
|
||||||
|
}()
|
||||||
|
let sender_pubkey = nostr_event.pubkey
|
||||||
|
|
||||||
|
// Don't show notification details that match mute list.
|
||||||
|
// TODO: Remove this code block once we get notification suppression entitlement from Apple. It will be covered by the `guard should_display_notification` block
|
||||||
|
if state.mutelist_manager.is_event_muted(nostr_event) {
|
||||||
|
// We cannot really suppress muted notifications until we have the notification supression entitlement.
|
||||||
|
// The best we can do if we ever get those muted notifications (which we generally won't due to server-side processing) is to obscure the details
|
||||||
|
let content = UNMutableNotificationContent()
|
||||||
|
content.title = NSLocalizedString("Muted event", comment: "Title for a push notification which has been muted")
|
||||||
|
content.body = NSLocalizedString("This is an event that has been muted according to your mute list rules. We cannot suppress this notification, but we obscured the details to respect your preferences", comment: "Description for a push notification which has been muted, and explanation that we cannot suppress it")
|
||||||
|
content.sound = UNNotificationSound.default
|
||||||
|
contentHandler(content)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard should_display_notification(state: state, event: nostr_event, mode: .push) else {
|
||||||
|
Log.debug("should_display_notification failed", for: .push_notifications)
|
||||||
|
// We should not display notification for this event. Suppress notification.
|
||||||
|
// contentHandler(UNNotificationContent())
|
||||||
|
// TODO: We cannot really suppress until we have the notification supression entitlement. Show the raw notification
|
||||||
|
contentHandler(request.content)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let notification_object = generate_local_notification_object(from: nostr_event, state: state) else {
|
||||||
|
Log.debug("generate_local_notification_object failed", for: .push_notifications)
|
||||||
|
// We could not process this notification. Probably an unsupported nostr event kind. Suppress.
|
||||||
|
// contentHandler(UNNotificationContent())
|
||||||
|
// TODO: We cannot really suppress until we have the notification supression entitlement. Show the raw notification
|
||||||
|
contentHandler(request.content)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Task {
|
||||||
|
let sender_dn = DisplayName(name: sender_profile.name, display_name: sender_profile.display_name, pubkey: sender_pubkey)
|
||||||
|
guard let (improvedContent, _) = await NotificationFormatter.shared.format_message(displayName: sender_dn.displayName, notify: notification_object, state: state) else {
|
||||||
|
|
||||||
|
Log.debug("NotificationFormatter.format_message failed", for: .push_notifications)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
var options: [AnyHashable: Any] = [:]
|
||||||
|
if let imageSource = CGImageSourceCreateWithURL(sender_profile.picture as CFURL, nil),
|
||||||
|
let uti = CGImageSourceGetType(imageSource) {
|
||||||
|
options[UNNotificationAttachmentOptionsTypeHintKey] = uti
|
||||||
|
}
|
||||||
|
|
||||||
|
let attachment = try UNNotificationAttachment(identifier: sender_profile.picture.absoluteString, url: sender_profile.picture, options: options)
|
||||||
|
improvedContent.attachments = [attachment]
|
||||||
|
} catch {
|
||||||
|
Log.error("failed to get notification attachment: %s", for: .push_notifications, error.localizedDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
let kind = nostr_event.known_kind
|
||||||
|
|
||||||
|
// these aren't supported yet
|
||||||
|
if !(kind == .text || kind == .dm) {
|
||||||
|
contentHandler(improvedContent)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// rich communication notifications for kind1, dms, etc
|
||||||
|
|
||||||
|
let message_intent = await message_intent_from_note(ndb: state.ndb,
|
||||||
|
sender_profile: sender_profile,
|
||||||
|
content: improvedContent.body,
|
||||||
|
note: nostr_event,
|
||||||
|
our_pubkey: state.keypair.pubkey)
|
||||||
|
|
||||||
|
improvedContent.threadIdentifier = nostr_event.thread_id().hex()
|
||||||
|
improvedContent.categoryIdentifier = "COMMUNICATION"
|
||||||
|
|
||||||
|
let interaction = INInteraction(intent: message_intent, response: nil)
|
||||||
|
interaction.direction = .incoming
|
||||||
|
do {
|
||||||
|
try await interaction.donate()
|
||||||
|
let updated = try improvedContent.updating(from: message_intent)
|
||||||
|
contentHandler(updated)
|
||||||
|
} catch {
|
||||||
|
Log.error("failed to donate interaction: %s", for: .push_notifications, error.localizedDescription)
|
||||||
|
contentHandler(improvedContent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,3 +162,162 @@ class NotificationService: UNNotificationServiceExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ProfileBuf {
|
||||||
|
let picture: URL
|
||||||
|
let name: String?
|
||||||
|
let display_name: String?
|
||||||
|
let nip05: String?
|
||||||
|
}
|
||||||
|
|
||||||
|
func message_intent_from_note(ndb: Ndb, sender_profile: ProfileBuf, content: String, note: NdbNote, our_pubkey: Pubkey) async -> INSendMessageIntent {
|
||||||
|
let sender_pk = note.pubkey
|
||||||
|
let sender = await profile_to_inperson(name: sender_profile.name,
|
||||||
|
display_name: sender_profile.display_name,
|
||||||
|
picture: sender_profile.picture.absoluteString,
|
||||||
|
nip05: sender_profile.nip05,
|
||||||
|
pubkey: sender_pk,
|
||||||
|
our_pubkey: our_pubkey)
|
||||||
|
|
||||||
|
let conversationIdentifier = note.thread_id().hex()
|
||||||
|
var recipients: [INPerson] = []
|
||||||
|
var pks: [Pubkey] = []
|
||||||
|
let meta = INSendMessageIntentDonationMetadata()
|
||||||
|
|
||||||
|
// gather recipients
|
||||||
|
if let recipient_note_id = note.direct_replies() {
|
||||||
|
let replying_to = ndb.lookup_note(recipient_note_id)
|
||||||
|
if let replying_to_pk = replying_to?.unsafeUnownedValue?.pubkey {
|
||||||
|
meta.isReplyToCurrentUser = replying_to_pk == our_pubkey
|
||||||
|
|
||||||
|
if replying_to_pk != sender_pk {
|
||||||
|
// we push the actual person being replied to first
|
||||||
|
pks.append(replying_to_pk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let pubkeys = Array(note.referenced_pubkeys)
|
||||||
|
meta.recipientCount = pubkeys.count
|
||||||
|
if pubkeys.contains(sender_pk) {
|
||||||
|
meta.recipientCount -= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
for pk in pubkeys.prefix(3) {
|
||||||
|
if pk == sender_pk || pks.contains(pk) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !meta.isReplyToCurrentUser && pk == our_pubkey {
|
||||||
|
meta.mentionsCurrentUser = true
|
||||||
|
}
|
||||||
|
|
||||||
|
pks.append(pk)
|
||||||
|
}
|
||||||
|
|
||||||
|
for pk in pks {
|
||||||
|
let recipient = await pubkey_to_inperson(ndb: ndb, pubkey: pk, our_pubkey: our_pubkey)
|
||||||
|
recipients.append(recipient)
|
||||||
|
}
|
||||||
|
|
||||||
|
// we enable default formatting this way
|
||||||
|
var groupName = INSpeakableString(spokenPhrase: "")
|
||||||
|
|
||||||
|
// otherwise we just say its a DM
|
||||||
|
if note.known_kind == .dm {
|
||||||
|
groupName = INSpeakableString(spokenPhrase: "DM")
|
||||||
|
}
|
||||||
|
|
||||||
|
let intent = INSendMessageIntent(recipients: recipients,
|
||||||
|
outgoingMessageType: .outgoingMessageText,
|
||||||
|
content: content,
|
||||||
|
speakableGroupName: groupName,
|
||||||
|
conversationIdentifier: conversationIdentifier,
|
||||||
|
serviceName: "kind\(note.kind)",
|
||||||
|
sender: sender,
|
||||||
|
attachments: nil)
|
||||||
|
intent.donationMetadata = meta
|
||||||
|
|
||||||
|
// this is needed for recipients > 0
|
||||||
|
if let img = sender.image {
|
||||||
|
intent.setImage(img, forParameterNamed: \.speakableGroupName)
|
||||||
|
}
|
||||||
|
|
||||||
|
return intent
|
||||||
|
}
|
||||||
|
|
||||||
|
func pubkey_to_inperson(ndb: Ndb, pubkey: Pubkey, our_pubkey: Pubkey) async -> INPerson {
|
||||||
|
let profile_txn = ndb.lookup_profile(pubkey)
|
||||||
|
let profile = profile_txn?.unsafeUnownedValue?.profile
|
||||||
|
let name = profile?.name
|
||||||
|
let display_name = profile?.display_name
|
||||||
|
let nip05 = profile?.nip05
|
||||||
|
let picture = profile?.picture
|
||||||
|
|
||||||
|
return await profile_to_inperson(name: name,
|
||||||
|
display_name: display_name,
|
||||||
|
picture: picture,
|
||||||
|
nip05: nip05,
|
||||||
|
pubkey: pubkey,
|
||||||
|
our_pubkey: our_pubkey)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetch_pfp(picture: URL) async throws -> RetrieveImageResult {
|
||||||
|
try await withCheckedThrowingContinuation { continuation in
|
||||||
|
KingfisherManager.shared.retrieveImage(with: Kingfisher.ImageResource(downloadURL: picture)) { result in
|
||||||
|
switch result {
|
||||||
|
case .success(let img):
|
||||||
|
continuation.resume(returning: img)
|
||||||
|
case .failure(let error):
|
||||||
|
continuation.resume(throwing: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func profile_to_inperson(name: String?, display_name: String?, picture: String?, nip05: String?, pubkey: Pubkey, our_pubkey: Pubkey) async -> INPerson {
|
||||||
|
let npub = pubkey.npub
|
||||||
|
let handle = INPersonHandle(value: npub, type: .unknown)
|
||||||
|
var aliases: [INPersonHandle] = []
|
||||||
|
|
||||||
|
if let nip05 {
|
||||||
|
aliases.append(INPersonHandle(value: nip05, type: .emailAddress))
|
||||||
|
}
|
||||||
|
|
||||||
|
let nostrName = DisplayName(name: name, display_name: display_name, pubkey: pubkey)
|
||||||
|
let nameComponents = nostrName.nameComponents()
|
||||||
|
let displayName = nostrName.displayName
|
||||||
|
let contactIdentifier = npub
|
||||||
|
let customIdentifier = npub
|
||||||
|
let suggestionType = INPersonSuggestionType.socialProfile
|
||||||
|
|
||||||
|
var image: INImage? = nil
|
||||||
|
|
||||||
|
if let picture,
|
||||||
|
let url = URL(string: picture),
|
||||||
|
let img = try? await fetch_pfp(picture: url),
|
||||||
|
let imgdata = img.data()
|
||||||
|
{
|
||||||
|
image = INImage(imageData: imgdata)
|
||||||
|
} else {
|
||||||
|
Log.error("Failed to fetch pfp (%s) for %s", for: .push_notifications, picture ?? "nil", displayName)
|
||||||
|
}
|
||||||
|
|
||||||
|
let person = INPerson(personHandle: handle,
|
||||||
|
nameComponents: nameComponents,
|
||||||
|
displayName: displayName,
|
||||||
|
image: image,
|
||||||
|
contactIdentifier: contactIdentifier,
|
||||||
|
customIdentifier: customIdentifier,
|
||||||
|
isMe: pubkey == our_pubkey,
|
||||||
|
suggestionType: suggestionType
|
||||||
|
)
|
||||||
|
|
||||||
|
return person
|
||||||
|
}
|
||||||
|
|
||||||
|
func robohash(_ pk: Pubkey) -> String {
|
||||||
|
return "https://robohash.org/" + pk.hex()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
27
DamusNotificationService/PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>1C8F.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -1,3 +1,32 @@
|
|||||||
dependencies: [
|
// swift-tools-version: 6.0
|
||||||
.Package(url: "https://github.com/jb55/secp256k1.swift.git", branch: "main")
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
]
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "damus",
|
||||||
|
platforms: [
|
||||||
|
.iOS(.v16),
|
||||||
|
.macOS(.v12)
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(
|
||||||
|
name: "damus",
|
||||||
|
targets: ["damus"]),
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
.package(url: "https://github.com/jb55/secp256k1.swift.git", branch: "main")
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "damus",
|
||||||
|
dependencies: [
|
||||||
|
.product(name: "secp256k1", package: "secp256k1.swift")
|
||||||
|
],
|
||||||
|
path: "damus"),
|
||||||
|
.testTarget(
|
||||||
|
name: "damusTests",
|
||||||
|
dependencies: ["damus"],
|
||||||
|
path: "damusTests"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|||||||
27
PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>1C8F.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
125
Purple.storekit
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
{
|
||||||
|
"identifier" : "64C21A2D",
|
||||||
|
"nonRenewingSubscriptions" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"products" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"settings" : {
|
||||||
|
"_applicationInternalID" : "1628663131",
|
||||||
|
"_developerTeamID" : "XK7H4JAB3D",
|
||||||
|
"_failTransactionsEnabled" : false,
|
||||||
|
"_lastSynchronizedDate" : 704848066.26849198,
|
||||||
|
"_locale" : "en_US",
|
||||||
|
"_storefront" : "USA",
|
||||||
|
"_storeKitErrors" : [
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Load Products"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Purchase"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Verification"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "App Store Sync"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Subscription Status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "App Transaction"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Manage Subscriptions Sheet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Refund Request Sheet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"current" : null,
|
||||||
|
"enabled" : false,
|
||||||
|
"name" : "Offer Code Redeem Sheet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"subscriptionGroups" : [
|
||||||
|
{
|
||||||
|
"id" : "21283177",
|
||||||
|
"localizations" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"name" : "Purple",
|
||||||
|
"subscriptions" : [
|
||||||
|
{
|
||||||
|
"adHocOffers" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"codeOffers" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"displayPrice" : "6.99",
|
||||||
|
"familyShareable" : false,
|
||||||
|
"groupNumber" : 1,
|
||||||
|
"internalID" : "6446591615",
|
||||||
|
"introductoryOffer" : null,
|
||||||
|
"localizations" : [
|
||||||
|
{
|
||||||
|
"description" : "Support damus development with Damus Purple!",
|
||||||
|
"displayName" : "Damus Purple",
|
||||||
|
"locale" : "en_CA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"productID" : "purple",
|
||||||
|
"recurringSubscriptionPeriod" : "P1M",
|
||||||
|
"referenceName" : "Purple",
|
||||||
|
"subscriptionGroupID" : "21283177",
|
||||||
|
"type" : "RecurringSubscription"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"adHocOffers" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"codeOffers" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"displayPrice" : "69.99",
|
||||||
|
"familyShareable" : false,
|
||||||
|
"groupNumber" : 2,
|
||||||
|
"internalID" : "6448764101",
|
||||||
|
"introductoryOffer" : null,
|
||||||
|
"localizations" : [
|
||||||
|
|
||||||
|
],
|
||||||
|
"productID" : "purpleyearly",
|
||||||
|
"recurringSubscriptionPeriod" : "P1Y",
|
||||||
|
"referenceName" : "Purple Yearly",
|
||||||
|
"subscriptionGroupID" : "21283177",
|
||||||
|
"type" : "RecurringSubscription"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version" : {
|
||||||
|
"major" : 3,
|
||||||
|
"minor" : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
52
README.md
@@ -2,26 +2,56 @@
|
|||||||
|
|
||||||
# damus
|
# damus
|
||||||
|
|
||||||
A twitter-like [nostr][nostr] client for iPhone, iPad and MacOS.
|
A twitter-like [nostr][nostr] client for iPhone, iPad and MacOS.
|
||||||
|
|
||||||
<img src="./ss.png" width="50%" height="50%" />
|
<img src="./ss.png" width="50%" height="50%" />
|
||||||
|
|
||||||
[nostr]: https://github.com/fiatjaf/nostr
|
[nostr]: https://github.com/fiatjaf/nostr
|
||||||
|
|
||||||
|
## How is Damus better than X/Twitter?
|
||||||
|
There are no toxic algorithms.\
|
||||||
|
You can send or receive zaps (satoshis) without asking for permission.\
|
||||||
|
[There is no central database](https://fiatjaf.com/nostr.html). Therefore, Damus is censorship resistant.\
|
||||||
|
There are no ads.\
|
||||||
|
You don't have to reveal sensitive personal information to sign up.\
|
||||||
|
No email is required. \
|
||||||
|
No phone number is required. \
|
||||||
|
Damus is free and open source software. \
|
||||||
|
There is no Big Tech moat. Therefore, seamless interoperability with thousands or millions of other nostr apps is possible, and is how [Damus and nostr win](https://www.youtube.com/watch?v=qTixqS-W1yo).
|
||||||
|
|
||||||
|
## If there are no ads, how is Damus funded?
|
||||||
|
Damus offers a paid subscription 🟣 purple 🟣 https://damus.io/purple/. \
|
||||||
|
Initial benefits include a unique subscriber number, subscriber badge, and auto-translate powered by DeepL.
|
||||||
|
|
||||||
|
Damus has also graciously received donations or grants from hundreds of Damus users, [Opensats](https://opensats.org/), and the [Human Rights Foundation](https://hrf.org/).
|
||||||
|
|
||||||
## Spec Compliance
|
## Spec Compliance
|
||||||
|
|
||||||
damus implements the following [Nostr Implementation Possibilities][nips]
|
damus implements the following [Nostr Implementation Possibilities][nips]
|
||||||
|
|
||||||
- [NIP-01: Basic protocol flow][nip01]
|
- [NIP-01: Basic protocol flow][nip01]
|
||||||
|
- [NIP-04: Encrypted direct message][nip04]
|
||||||
- [NIP-08: Mentions][nip08]
|
- [NIP-08: Mentions][nip08]
|
||||||
- [NIP-10: Reply conventions][nip10]
|
- [NIP-10: Reply conventions][nip10]
|
||||||
- [NIP-12: Generic tag queries (hashtags)][nip12]
|
- [NIP-12: Generic tag queries (hashtags)][nip12]
|
||||||
|
- [NIP-19: bech32-encoded entities][NIP19]
|
||||||
|
- [NIP-21: nostr: URI scheme][NIP21]
|
||||||
|
- [NIP-25: Reactions][NIP25]
|
||||||
|
- [NIP-42: Authentication of clients to relays][nip42]
|
||||||
|
- [NIP-56: Reporting][nip56]
|
||||||
|
|
||||||
[nips]: https://github.com/nostr-protocol/nips
|
[nips]: https://github.com/nostr-protocol/nips
|
||||||
[nip01]: https://github.com/nostr-protocol/nips/blob/master/01.md
|
[nip01]: https://github.com/nostr-protocol/nips/blob/master/01.md
|
||||||
|
[nip04]: https://github.com/nostr-protocol/nips/blob/master/04.md
|
||||||
[nip08]: https://github.com/nostr-protocol/nips/blob/master/08.md
|
[nip08]: https://github.com/nostr-protocol/nips/blob/master/08.md
|
||||||
[nip10]: https://github.com/nostr-protocol/nips/blob/master/10.md
|
[nip10]: https://github.com/nostr-protocol/nips/blob/master/10.md
|
||||||
[nip12]: https://github.com/nostr-protocol/nips/blob/master/12.md
|
[nip12]: https://github.com/nostr-protocol/nips/blob/master/12.md
|
||||||
|
[nip19]: https://github.com/nostr-protocol/nips/blob/master/19.md
|
||||||
|
[nip21]: https://github.com/nostr-protocol/nips/blob/master/21.md
|
||||||
|
[nip25]: https://github.com/nostr-protocol/nips/blob/master/25.md
|
||||||
|
[nip42]: https://github.com/nostr-protocol/nips/blob/master/42.md
|
||||||
|
[nip56]: https://github.com/nostr-protocol/nips/blob/master/56.md
|
||||||
|
|
||||||
|
|
||||||
## Getting Started on Damus
|
## Getting Started on Damus
|
||||||
|
|
||||||
@@ -32,7 +62,7 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
|||||||
- Relays: You can add more relays to send your notes to by tapping the "+".
|
- Relays: You can add more relays to send your notes to by tapping the "+".
|
||||||
- Find more relays to add: https://nostr.info/relays/
|
- Find more relays to add: https://nostr.info/relays/
|
||||||
- Public Key (pubkey): Your public, personal address and how people can find and tag you
|
- Public Key (pubkey): Your public, personal address and how people can find and tag you
|
||||||
- Secret Key: Your *private* key unique to you. Never share your private key publically and share with other clients at your own risk!
|
- Secret Key: Your *private* key unique to you. Never share your private key publicly and share with other clients at your own risk!
|
||||||
- Save your keys somewhere safe
|
- Save your keys somewhere safe
|
||||||
- Log out
|
- Log out
|
||||||
|
|
||||||
@@ -46,19 +76,15 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
|||||||
1. Search their username in the search bar at the top of the 🔍 Global Feed and click their profile
|
1. Search their username in the search bar at the top of the 🔍 Global Feed and click their profile
|
||||||
2. Tap the 🔑 icon which will copy their pubkey to your clipboard
|
2. Tap the 🔑 icon which will copy their pubkey to your clipboard
|
||||||
3. Go back to your 🏠 Personal Feed and tap the blue + button to compose your Note
|
3. Go back to your 🏠 Personal Feed and tap the blue + button to compose your Note
|
||||||
4. Add @ direcly followed by the pubkey (e.g., `@npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s`)
|
4. Add @ directly followed by the pubkey (e.g., `@npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s`)
|
||||||
- You can also long-press a Note to grab their User ID aka pubkey or Note ID to link directly to a Note.
|
- You can also tap the ellipsis menu of a Note (three dots in top right of note) to grab their User ID aka pubkey or Note ID to link directly to a Note.
|
||||||
- Currently you can't delete your Notes in the iOS app
|
- Currently you can't delete your Notes in the iOS app
|
||||||
- Share images by pasting the image url which you can grab from imgbb, imgur, etc. (i.e., `https://i.ibb.co/2SHZbwm/alpha60.jpg`). Currently images only load for people you follow in the 🏠 Personal Feed. Images are not automatically loaded in 🔍 Global Feed
|
- Share images by pasting the image url which you can grab from nostr.build, imgbb, imgur, etc. (i.e., `https://i.ibb.co/2SHZbwm/alpha60.jpg`). Currently images only load for people you follow in the 🏠 Personal Feed. Images are not automatically loaded in 🔍 Global Feed
|
||||||
- Engaging with Notes
|
- Engaging with Notes
|
||||||
- 💬 Replying to a Note: Tap the chat icon underneath the note. This will show up in the users’ notifications and in your 🏠 Personal and 🔍 Global Feeds
|
- 💬 Replying to a Note: Tap the chat icon underneath the note. This will show up in the users’ notifications and in your 🏠 Personal and 🔍 Global Feeds
|
||||||
- ♺ Reposts: Tap the repost icon which will show up in your 🏠 Personal and 🔍 Global Feeds
|
- ♺ Reposts: Tap the repost icon which will show up in your 🏠 Personal and 🔍 Global Feeds
|
||||||
- ♡ Likes: Tap the heart icon. Users will not get a notification, and cannot see who liked their note (currently, web clients can see your pfp only)
|
- ♡ Likes: Tap the heart icon. Users will not get a notification, and cannot see who liked their note (currently, web clients can see your pfp only)
|
||||||
- Formatting Notes (may not format as intended in other web clients)
|
|
||||||
- Italics: 1 asterisk `*italic*`
|
|
||||||
- Bold: 2 asterisk `**bold**`
|
|
||||||
- Strikethrough: 1 tildes `~strikethrough~`
|
|
||||||
- Code: 1 back-tick `` `code` ``
|
|
||||||
|
|
||||||
#### 💬 Encrypted DMs (chat app, bottom navigation)
|
#### 💬 Encrypted DMs (chat app, bottom navigation)
|
||||||
- Tap the chat icon and you'll notice there's nothing to see at first. Go to a user profile and tap the 💬 chat icon next to the follow button to begin a DM
|
- Tap the chat icon and you'll notice there's nothing to see at first. Go to a user profile and tap the 💬 chat icon next to the follow button to begin a DM
|
||||||
@@ -76,7 +102,9 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
|||||||
4. For PFP, insert a URL containing your image (support video: https://cdn.jb55.com/vid/pfp-editor.mp4)
|
4. For PFP, insert a URL containing your image (support video: https://cdn.jb55.com/vid/pfp-editor.mp4)
|
||||||
5. Save
|
5. Save
|
||||||
|
|
||||||
|
|
||||||
#### ⚡️ Request Sats
|
#### ⚡️ Request Sats
|
||||||
|
Paste an invoice from your favorite LN wallet.
|
||||||
(Sats or Satoshis are the smallest denomination of bitcoin)
|
(Sats or Satoshis are the smallest denomination of bitcoin)
|
||||||
|
|
||||||
**Alby (browser extension)**
|
**Alby (browser extension)**
|
||||||
@@ -117,6 +145,8 @@ Your internet protocol (IP) address is exposed to the relays you connect to, and
|
|||||||
|
|
||||||
The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.
|
The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.
|
||||||
|
|
||||||
|
It is public information which other profiles (npubs) you are exchanging DMs with. The content of the DMs is encrypted.
|
||||||
|
|
||||||
### Translations
|
### Translations
|
||||||
|
|
||||||
Translators welcome! Join the [Transifex][transifex] project.
|
Translators welcome! Join the [Transifex][transifex] project.
|
||||||
@@ -127,8 +157,10 @@ All user-facing strings must have a comment in order to provide context to trans
|
|||||||
|
|
||||||
### Awards
|
### Awards
|
||||||
|
|
||||||
|
Damus lead dev and founder Will awards developers with satoshis!
|
||||||
There may be nostr badges awarded for contributors in the future... :)
|
There may be nostr badges awarded for contributors in the future... :)
|
||||||
|
|
||||||
|
|
||||||
First contributors:
|
First contributors:
|
||||||
|
|
||||||
1. @randymcmillan
|
1. @randymcmillan
|
||||||
|
|||||||
@@ -485,11 +485,37 @@ static inline int parse_str(struct cursor *cur, const char *str) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int is_whitespace(char c) {
|
static inline int is_whitespace(int c) {
|
||||||
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
|
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int is_underscore(char c) {
|
|
||||||
|
static inline int next_char_is_whitespace(unsigned char *curChar, unsigned char *endChar) {
|
||||||
|
unsigned char * next = curChar + 1;
|
||||||
|
if(next > endChar) return 0;
|
||||||
|
else if(next == endChar) return 1;
|
||||||
|
return is_whitespace(*next);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int char_disallowed_at_end_url(char c){
|
||||||
|
return c == '.' || c == ',';
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int is_final_url_char(unsigned char *curChar, unsigned char *endChar){
|
||||||
|
if(is_whitespace(*curChar)){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(next_char_is_whitespace(curChar, endChar)) {
|
||||||
|
// next char is whitespace so this char could be the final char in the url
|
||||||
|
return char_disallowed_at_end_url(*curChar);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// next char isn't whitespace so it can't be a final char
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int is_underscore(int c) {
|
||||||
return c == '_';
|
return c == '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,6 +696,23 @@ static inline int consume_until_whitespace(struct cursor *cur, int or_end) {
|
|||||||
return or_end;
|
return or_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int consume_until_end_url(struct cursor *cur, int or_end) {
|
||||||
|
char c;
|
||||||
|
int consumedAtLeastOne = 0;
|
||||||
|
|
||||||
|
while (cur->p < cur->end) {
|
||||||
|
c = *cur->p;
|
||||||
|
|
||||||
|
if (is_final_url_char(cur->p, cur->end))
|
||||||
|
return consumedAtLeastOne;
|
||||||
|
|
||||||
|
cur->p++;
|
||||||
|
consumedAtLeastOne = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return or_end;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int consume_until_non_alphanumeric(struct cursor *cur, int or_end) {
|
static inline int consume_until_non_alphanumeric(struct cursor *cur, int or_end) {
|
||||||
char c;
|
char c;
|
||||||
int consumedAtLeastOne = 0;
|
int consumedAtLeastOne = 0;
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ static int consume_url_fragment(struct cursor *cur)
|
|||||||
|
|
||||||
cur->p++;
|
cur->p++;
|
||||||
|
|
||||||
return consume_until_whitespace(cur, 1);
|
return consume_until_end_url(cur, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int consume_url_path(struct cursor *cur)
|
static int consume_url_path(struct cursor *cur)
|
||||||
@@ -134,7 +134,7 @@ static int consume_url_path(struct cursor *cur)
|
|||||||
while (cur->p < cur->end) {
|
while (cur->p < cur->end) {
|
||||||
c = *cur->p;
|
c = *cur->p;
|
||||||
|
|
||||||
if (c == '?' || c == '#' || is_whitespace(c)) {
|
if (c == '?' || c == '#' || is_final_url_char(cur->p, cur->end)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@ static int consume_url_host(struct cursor *cur)
|
|||||||
while (cur->p < cur->end) {
|
while (cur->p < cur->end) {
|
||||||
c = *cur->p;
|
c = *cur->p;
|
||||||
// TODO: handle IDNs
|
// TODO: handle IDNs
|
||||||
if (is_alphanumeric(c) || c == '.' || c == '-')
|
if ((is_alphanumeric(c) || c == '.' || c == '-') && !is_final_url_char(cur->p, cur->end))
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
cur->p++;
|
cur->p++;
|
||||||
|
|||||||
@@ -7,8 +7,10 @@
|
|||||||
|
|
||||||
#include "nostr_bech32.h"
|
#include "nostr_bech32.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "endian.h"
|
||||||
#include "cursor.h"
|
#include "cursor.h"
|
||||||
#include "bech32.h"
|
#include "bech32.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define MAX_TLVS 16
|
#define MAX_TLVS 16
|
||||||
|
|
||||||
@@ -145,6 +147,11 @@ static int tlvs_to_relays(struct nostr_tlvs *tlvs, struct relays *relays) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t decode_tlv_u32(const uint8_t *bytes) {
|
||||||
|
beint32_t *be32_bytes = (beint32_t*)bytes;
|
||||||
|
return be32_to_cpu(*be32_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_nostr_bech32_nevent(struct cursor *cur, struct bech32_nevent *nevent) {
|
static int parse_nostr_bech32_nevent(struct cursor *cur, struct bech32_nevent *nevent) {
|
||||||
struct nostr_tlvs tlvs;
|
struct nostr_tlvs tlvs;
|
||||||
struct nostr_tlv *tlv;
|
struct nostr_tlv *tlv;
|
||||||
@@ -166,6 +173,13 @@ static int parse_nostr_bech32_nevent(struct cursor *cur, struct bech32_nevent *n
|
|||||||
nevent->pubkey = NULL;
|
nevent->pubkey = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(find_tlv(&tlvs, TLV_KIND, &tlv)) {
|
||||||
|
nevent->kind = decode_tlv_u32(tlv->value);
|
||||||
|
nevent->has_kind = true;
|
||||||
|
} else {
|
||||||
|
nevent->has_kind = false;
|
||||||
|
}
|
||||||
|
|
||||||
return tlvs_to_relays(&tlvs, &nevent->relays);
|
return tlvs_to_relays(&tlvs, &nevent->relays);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +201,11 @@ static int parse_nostr_bech32_naddr(struct cursor *cur, struct bech32_naddr *nad
|
|||||||
|
|
||||||
naddr->pubkey = tlv->value;
|
naddr->pubkey = tlv->value;
|
||||||
|
|
||||||
|
if(!find_tlv(&tlvs, TLV_KIND, &tlv)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
naddr->kind = decode_tlv_u32(tlv->value);
|
||||||
|
|
||||||
return tlvs_to_relays(&tlvs, &naddr->relays);
|
return tlvs_to_relays(&tlvs, &naddr->relays);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "str_block.h"
|
#include "str_block.h"
|
||||||
#include "cursor.h"
|
#include "cursor.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
#define MAX_RELAYS 10
|
#define MAX_RELAYS 10
|
||||||
|
|
||||||
@@ -45,6 +47,8 @@ struct bech32_nevent {
|
|||||||
struct relays relays;
|
struct relays relays;
|
||||||
const u8 *event_id;
|
const u8 *event_id;
|
||||||
const u8 *pubkey; // optional
|
const u8 *pubkey; // optional
|
||||||
|
uint32_t kind;
|
||||||
|
bool has_kind;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bech32_nprofile {
|
struct bech32_nprofile {
|
||||||
@@ -56,6 +60,7 @@ struct bech32_naddr {
|
|||||||
struct relays relays;
|
struct relays relays;
|
||||||
struct str_block identifier;
|
struct str_block identifier;
|
||||||
const u8 *pubkey;
|
const u8 *pubkey;
|
||||||
|
uint32_t kind;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bech32_nrelay {
|
struct bech32_nrelay {
|
||||||
|
|||||||
@@ -1,5 +1,40 @@
|
|||||||
{
|
{
|
||||||
|
"originHash" : "06318d35ee2e6bd681b95591e67da33a9461b48a3c652e58bd9d1a6f0d82bdac",
|
||||||
"pins" : [
|
"pins" : [
|
||||||
|
{
|
||||||
|
"identity" : "codescanner",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/twostraws/CodeScanner.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "9fa582f4b36c69c2a55bff5fb3377eb170ae273c"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "cryptoswift",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "e74bbbfbef939224b242ae7c342a90e60b88b5ce"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "emojikit",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/tyiu/EmojiKit",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "47a4b1402de26be0299dcb4d667c1faaf21a7874",
|
||||||
|
"version" : "0.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "emojipicker",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/tyiu/EmojiPicker.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "3f48903721eae223238ff0af17c22d6373d33813",
|
||||||
|
"version" : "0.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identity" : "gsplayer",
|
"identity" : "gsplayer",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
@@ -14,8 +49,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/onevcat/Kingfisher",
|
"location" : "https://github.com/onevcat/Kingfisher",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "415b1d97fb38bda1e5a6b2dde63354720832110b",
|
"revision" : "4c6b067f96953ee19526e49e4189403a2be21fb3",
|
||||||
"version" : "7.6.1"
|
"version" : "8.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -26,6 +61,15 @@
|
|||||||
"revision" : "40b4b38b3b1c83f7088c76189a742870e0ca06a9"
|
"revision" : "40b4b38b3b1c83f7088c76189a742870e0ca06a9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-collections",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/apple/swift-collections.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "ee97538f5b81ae89698fd95938896dec5217b148",
|
||||||
|
"version" : "1.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identity" : "swift-markdown-ui",
|
"identity" : "swift-markdown-ui",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
@@ -51,7 +95,32 @@
|
|||||||
"revision" : "74203046135342e4a4a627476dd6caf8b28fe11b",
|
"revision" : "74203046135342e4a4a627476dd6caf8b28fe11b",
|
||||||
"version" : "509.0.0"
|
"version" : "509.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swift-trie",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/tyiu/swift-trie",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "4c50bff6c168f74425f70476be62a072980d2da7",
|
||||||
|
"version" : "0.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swiftycrop",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/benedom/SwiftyCrop",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "454d0a0d4faf6f3a19c8d817ab9d7d27524bd79f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identity" : "swipeactions",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/damus-io/SwipeActions.git",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "33d99756c3112e1a07c1732e3cddc5ad5bd0c5f4"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version" : 2
|
"version" : 3
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1500"
|
LastUpgradeVersion = "1520"
|
||||||
wasCreatedForAppExtension = "YES"
|
wasCreatedForAppExtension = "YES"
|
||||||
version = "2.0">
|
version = "2.0">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
<RemoteRunnable
|
<RemoteRunnable
|
||||||
runnableDebuggingMode = "1"
|
runnableDebuggingMode = "1"
|
||||||
BundleIdentifier = "com.jb55.damus2"
|
BundleIdentifier = "com.jb55.damus2"
|
||||||
RemotePath = "/Users/danielnogueira/Library/Developer/CoreSimulator/Devices/99E60B35-CE5D-4B45-AC35-00818C0AF3CB/data/Containers/Bundle/Application/5A083DD0-FDE2-43D7-9172-2F97FAD18F20/damus.app">
|
RemotePath = "/Users/danielnogueira/Library/Developer/CoreSimulator/Devices/99E60B35-CE5D-4B45-AC35-00818C0AF3CB/data/Containers/Bundle/Application/7D0A5302-D07E-4C7C-B509-A7C552BD5A65/damus.app">
|
||||||
</RemoteRunnable>
|
</RemoteRunnable>
|
||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1540"
|
||||||
|
wasCreatedForAppExtension = "YES"
|
||||||
|
version = "2.0">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES"
|
||||||
|
buildArchitectures = "Automatic">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "D703D7162C66E47100A400EA"
|
||||||
|
BuildableName = "HighlighterActionExtension.appex"
|
||||||
|
BlueprintName = "HighlighterActionExtension"
|
||||||
|
ReferencedContainer = "container:damus.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||||
|
BuildableName = "damus.app"
|
||||||
|
BlueprintName = "damus"
|
||||||
|
ReferencedContainer = "container:damus.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
shouldAutocreateTestPlan = "YES">
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = ""
|
||||||
|
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
|
||||||
|
launchStyle = "0"
|
||||||
|
askForAppToLaunch = "Yes"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES"
|
||||||
|
launchAutomaticallySubstyle = "2">
|
||||||
|
<RemoteRunnable
|
||||||
|
runnableDebuggingMode = "1"
|
||||||
|
BundleIdentifier = "com.apple.mobilesafari"
|
||||||
|
RemotePath = "/Library/Developer/CoreSimulator/Volumes/iOS_21F79/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 17.5.simruntime/Contents/Resources/RuntimeRoot/Applications/MobileSafari.app">
|
||||||
|
</RemoteRunnable>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||||
|
BuildableName = "damus.app"
|
||||||
|
BlueprintName = "damus"
|
||||||
|
ReferencedContainer = "container:damus.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
askForAppToLaunch = "Yes"
|
||||||
|
launchAutomaticallySubstyle = "2">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||||
|
BuildableName = "damus.app"
|
||||||
|
BlueprintName = "damus"
|
||||||
|
ReferencedContainer = "container:damus.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1500"
|
LastUpgradeVersion = "1520"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1500"
|
LastUpgradeVersion = "1520"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</TestableReference>
|
</TestableReference>
|
||||||
<TestableReference
|
<TestableReference
|
||||||
skipped = "YES">
|
skipped = "NO">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4CE6DEFC27F7A08200C66700"
|
BlueprintIdentifier = "4CE6DEFC27F7A08200C66700"
|
||||||
@@ -71,6 +71,9 @@
|
|||||||
ReferencedContainer = "container:damus.xcodeproj">
|
ReferencedContainer = "container:damus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<StoreKitConfigurationFileReference
|
||||||
|
identifier = "../../Purple.storekit">
|
||||||
|
</StoreKitConfigurationFileReference>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
21
damus/Assets.xcassets/Backgrounds/purple-blue-gradient-1.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "shadow-2.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Backgrounds/purple-blue-gradient-1.imageset/shadow-2.png
vendored
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
21
damus/Assets.xcassets/Backgrounds/purple-gradient-1.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "shadow.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Backgrounds/purple-gradient-1.imageset/shadow.png
vendored
Normal file
|
After Width: | Height: | Size: 511 KiB |
20
damus/Assets.xcassets/Colors/Bitcoin.colorset/Contents.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x1A",
|
||||||
|
"green" : "0x93",
|
||||||
|
"red" : "0xF7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0xD7",
|
||||||
|
"green" : "0xD1",
|
||||||
|
"red" : "0xD1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x13",
|
||||||
|
"green" : "0x11",
|
||||||
|
"red" : "0x11"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0xF9",
|
||||||
|
"green" : "0xF3",
|
||||||
|
"red" : "0xF3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x25",
|
||||||
|
"green" : "0x22",
|
||||||
|
"red" : "0x22"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "244",
|
||||||
|
"green" : "218",
|
||||||
|
"red" : "244"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "92",
|
||||||
|
"green" : "45",
|
||||||
|
"red" : "93"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "236",
|
||||||
|
"green" : "194",
|
||||||
|
"red" : "238"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "109",
|
||||||
|
"green" : "49",
|
||||||
|
"red" : "111"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "197",
|
||||||
|
"green" : "67",
|
||||||
|
"red" : "204"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "255",
|
||||||
|
"green" : "194",
|
||||||
|
"red" : "255"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0xF2",
|
||||||
|
"green" : "0xD8",
|
||||||
|
"red" : "0xF4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "1.000",
|
||||||
|
"blue" : "0x45",
|
||||||
|
"green" : "0x17",
|
||||||
|
"red" : "0x47"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
6
damus/Assets.xcassets/Illustrations/Contents.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 187 KiB |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "profile-banner.jpeg",
|
"filename" : "damoose.jpeg",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
BIN
damus/Assets.xcassets/Illustrations/damoose.imageset/damoose.jpeg
vendored
Normal file
|
After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 547 KiB After Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
6
damus/Assets.xcassets/Logos/Contents.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
328
damus/Assets.xcassets/Logos/activityPub.imageset/ActivityPub-logo.svg
vendored
Normal file
@@ -0,0 +1,328 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="500"
|
||||||
|
height="130"
|
||||||
|
viewBox="0 0 132.29166 34.395832"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
sodipodi:docname="ActivityPub-logo.svg">
|
||||||
|
<title
|
||||||
|
id="title4590">ActivityPub logo</title>
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
id="AP-4-0"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5e5e5e;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5660" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5640"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5638" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5634"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5632" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5628"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5626" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="AP-3-7"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#c678c5;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5498" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="AP-2-3"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6d6d6d;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5230" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="AP1-5"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f1007e;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5212" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP-3-7"
|
||||||
|
id="linearGradient5749"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3319.292"
|
||||||
|
y1="-1291.2802"
|
||||||
|
x2="3344.3645"
|
||||||
|
y2="-1291.2802" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP1-5"
|
||||||
|
id="linearGradient7297-7"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3241.6836"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3254.9529"
|
||||||
|
y2="-1355.4329" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP-2-3"
|
||||||
|
id="linearGradient7303-7"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3225.7603"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3239.0295"
|
||||||
|
y2="-1355.4329" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP1-5"
|
||||||
|
id="linearGradient8308"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3241.6836"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3254.9529"
|
||||||
|
y2="-1355.4329" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP1-5"
|
||||||
|
id="linearGradient8310"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3241.6836"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3254.9529"
|
||||||
|
y2="-1355.4329" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP1-5"
|
||||||
|
id="linearGradient8312"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3241.6836"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3254.9529"
|
||||||
|
y2="-1355.4329" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP-2-3"
|
||||||
|
id="linearGradient8314"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="3225.7603"
|
||||||
|
y1="-1355.4329"
|
||||||
|
x2="3239.0295"
|
||||||
|
y2="-1355.4329"
|
||||||
|
gradientTransform="matrix(3.7000834,0,0,3.7000834,-11935.582,4544.6634)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP-2-3"
|
||||||
|
id="linearGradient5188"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.42732603,0,0,0.42732603,-1363.3009,454.91899)"
|
||||||
|
x1="3269.126"
|
||||||
|
y1="-1354.6217"
|
||||||
|
x2="3322.1943"
|
||||||
|
y2="-1354.6217" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP-2-3"
|
||||||
|
id="linearGradient4523"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(3.5811973,0,0,3.5811973,-11532.084,4918.1922)"
|
||||||
|
x1="3269.126"
|
||||||
|
y1="-1354.6217"
|
||||||
|
x2="3322.1943"
|
||||||
|
y2="-1354.6217" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#AP1-5"
|
||||||
|
id="linearGradient4526"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(3.5811973,0,0,3.5811973,-11528.758,4918.1922)"
|
||||||
|
x1="3323.9951"
|
||||||
|
y1="-1356.5363"
|
||||||
|
x2="3349.0676"
|
||||||
|
y2="-1356.5363" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="0.14509804"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.5"
|
||||||
|
inkscape:cx="395.506"
|
||||||
|
inkscape:cy="-201.19903"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-global="true"
|
||||||
|
showguides="false"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
showborder="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
borderlayer="false"
|
||||||
|
units="px">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4572"
|
||||||
|
enabled="false"
|
||||||
|
originx="7.1437514"
|
||||||
|
originy="-404.28382" />
|
||||||
|
<inkscape:grid
|
||||||
|
type="axonomgrid"
|
||||||
|
id="grid4574"
|
||||||
|
units="mm"
|
||||||
|
empspacing="12"
|
||||||
|
originx="7.1437514"
|
||||||
|
originy="-404.28382"
|
||||||
|
enabled="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="3278.981,1256.5057"
|
||||||
|
orientation="0,1"
|
||||||
|
id="guide5059"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="3278.981,1238.2495"
|
||||||
|
orientation="0,1"
|
||||||
|
id="guide5061"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title>ActivityPub logo</dc:title>
|
||||||
|
<cc:license
|
||||||
|
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
|
||||||
|
<dc:date>2017-04-15</dc:date>
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Robert Martinez</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>ActivityPub</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
</cc:Work>
|
||||||
|
<cc:License
|
||||||
|
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||||
|
<cc:permits
|
||||||
|
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||||
|
</cc:License>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
style="opacity:1"
|
||||||
|
transform="translate(7.1437516,141.67967)">
|
||||||
|
<path
|
||||||
|
style="fill:#000000;stroke-width:0.26458335"
|
||||||
|
d=""
|
||||||
|
id="path5497"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<g
|
||||||
|
id="g5197"
|
||||||
|
transform="translate(1.3229166)">
|
||||||
|
<g
|
||||||
|
id="g5132-90"
|
||||||
|
style="fill:url(#linearGradient7297-7);fill-opacity:1"
|
||||||
|
transform="matrix(0.9789804,0,0,0.9789804,-3157.9561,1202.4422)">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.2553682,0,0,0.2553682,2615.9213,-1125.3113)"
|
||||||
|
id="g5080-78"
|
||||||
|
style="fill:url(#linearGradient8312);fill-opacity:1">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5404-0-0"
|
||||||
|
d="m 2450.431,-937.13662 51.9615,30 v 12 l -51.9615,30 v -12 l 41.5693,-24 -41.5692,-24 z"
|
||||||
|
style="fill:url(#linearGradient8308);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccc"
|
||||||
|
style="fill:url(#linearGradient8310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 2450.431,-913.13662 20.7847,12 -20.7847,12 z"
|
||||||
|
id="path5406-6-3"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5127-1"
|
||||||
|
style="fill:url(#linearGradient7303-7);fill-opacity:1"
|
||||||
|
transform="matrix(0.9789804,0,0,0.9789804,-3157.9561,1202.4422)">
|
||||||
|
<path
|
||||||
|
id="path5467-2-0"
|
||||||
|
transform="matrix(0.27026418,0,0,0.27026418,3225.7603,-1228.2597)"
|
||||||
|
d="M 49.097656,-504.56641 0,-476.2207 v 11.33789 l 39.277344,-22.67578 v 45.35351 l 9.820312,5.66992 z m -19.638672,34.01563 -19.6406246,11.33789 19.6406246,11.33789 z"
|
||||||
|
style="fill:url(#linearGradient8314);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25000042px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5203"
|
||||||
|
transform="matrix(2.2173353,0,0,2.2173353,-35.445741,150.88402)">
|
||||||
|
<g
|
||||||
|
id="g4523">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="scscscscsscscscscscccccccccccccccscsccccscscccccccccccscsccccscsccccccccccccscscccsccccscscsccccscccccccccccccccccccccccccccccscssccccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="text5037-6"
|
||||||
|
transform="matrix(0.1193249,0,0,0.1193249,12.763965,-131.94382)"
|
||||||
|
d="m 263.22656,34.349609 c -1.66644,0 -2.95278,0.477436 -3.85742,1.429688 -0.90464,0.904639 -1.35742,2.069669 -1.35742,3.498047 0,1.428378 0.45278,2.59536 1.35742,3.5 0.90464,0.857027 2.19098,1.285156 3.85742,1.285156 1.66644,0 2.99818,-0.428129 3.99805,-1.285156 0.99986,-0.857027 1.5,-2.024009 1.5,-3.5 0,-1.475991 -0.50014,-2.665673 -1.5,-3.570313 -0.99987,-0.904639 -2.33161,-1.357422 -3.99805,-1.357422 z m 43.95117,0 c -1.66644,0 -2.95082,0.477436 -3.85546,1.429688 -0.90464,0.904639 -1.35743,2.069669 -1.35743,3.498047 0,1.428378 0.45279,2.59536 1.35743,3.5 0.90464,0.857027 2.18902,1.285156 3.85546,1.285156 1.66645,0 3.00014,-0.428129 4,-1.285156 0.99987,-0.857027 1.5,-2.024009 1.5,-3.5 0,-1.475991 -0.50013,-2.665673 -1.5,-3.570313 -0.99986,-0.904639 -2.33355,-1.357422 -4,-1.357422 z m -118.46166,0.357422 -14.49805,50.351563 h 8.92774 l 2.92773,-11.285156 h 11.78516 l 3.07031,11.285156 h 9.42773 L 195.78638,34.707031 Z m 58.71166,5.285157 -8.49804,2.642578 v 6.71289 h -3.92774 v 7.570313 h 3.92774 v 18.71289 c 0,3.713784 0.66684,6.356519 2,7.927735 1.38076,1.571216 3.42866,2.355468 6.14258,2.355468 1.5236,0 2.9747,-0.189411 4.35546,-0.570312 1.38077,-0.333288 2.59511,-0.761418 3.64258,-1.285156 L 254,77.273438 c -0.66658,0.285675 -1.28607,0.49974 -1.85742,0.642578 -0.57135,0.142837 -1.2155,0.214843 -1.92969,0.214843 -1.04748,0 -1.78438,-0.430082 -2.21289,-1.287109 -0.3809,-0.857027 -0.57227,-2.308127 -0.57227,-4.355469 V 56.917969 h 6.92774 v -7.570313 h -6.92774 z m 80.23243,0 -8.49805,2.642578 v 6.71289 h -3.92969 v 7.570313 h 3.92969 v 18.71289 c 0,3.713784 0.66489,6.356519 1.99805,7.927735 1.38076,1.571216 3.42866,2.355468 6.14257,2.355468 1.52361,0 2.97666,-0.189411 4.35743,-0.570312 1.38076,-0.333288 2.5951,-0.761418 3.64257,-1.285156 l -1.07226,-6.785156 c -0.66658,0.285675 -1.28607,0.49974 -1.85742,0.642578 -0.57135,0.142837 -1.21355,0.214843 -1.92774,0.214843 -1.04747,0 -1.78437,-0.430082 -2.21289,-1.287109 -0.3809,-0.857027 -0.57226,-2.308127 -0.57226,-4.355469 V 56.917969 h 6.92773 v -7.570313 h -6.92773 z m -135.65894,6.855468 h 0.28516 l 1.14453,7.857422 2.85547,11.640625 h -8.2832 l 2.78515,-11.570312 z m 31.94605,1.572266 c -4.33275,0 -7.61963,1.570458 -9.85743,4.71289 -2.23779,3.142433 -3.35546,7.833061 -3.35546,14.070313 0,2.856756 0.21406,5.452139 0.64257,7.785156 0.47613,2.285405 1.23768,4.261293 2.28516,5.927735 1.04748,1.618828 2.38117,2.880516 4,3.785156 1.66644,0.857027 3.71238,1.285156 6.14062,1.285156 1.66645,0 3.33356,-0.238718 5,-0.714844 1.66645,-0.476126 3.09485,-1.190326 4.28516,-2.142578 l -1.78516,-6.570312 c -0.71418,0.476126 -1.50039,0.881555 -2.35742,1.214844 -0.80941,0.285675 -1.80968,0.427734 -3,0.427734 -2.23779,0 -3.88025,-1.022971 -4.92773,-3.070313 -0.99987,-2.047342 -1.5,-4.690077 -1.5,-7.927734 0,-3.856621 0.50013,-6.641415 1.5,-8.355469 0.99986,-1.761666 2.50027,-2.642578 4.5,-2.642578 1.09509,0 2.02335,0.117406 2.78515,0.355469 0.80942,0.19045 1.64298,0.501174 2.5,0.929687 l 2,-7.070312 c -1.04747,-0.571351 -2.26181,-1.048787 -3.64257,-1.429688 -1.33316,-0.3809 -3.07033,-0.570312 -5.21289,-0.570312 z m 35.06445,0.927734 v 35.710938 h 8.5 V 49.347656 Z m 11.05469,0 12.64257,36.066406 h 5.7129 l 11.99804,-36.066406 h -9.14062 l -4.42774,18.570313 -0.78711,5.71289 h -0.28515 l -0.85742,-5.642578 -4.92774,-18.640625 z m 32.89843,0 v 35.710938 h 8.49805 V 49.347656 Z m 33.53125,0 12.42774,35.710938 c -0.28568,1.571216 -0.64375,2.832904 -1.07227,3.785156 -0.42851,0.952252 -0.92865,1.641799 -1.5,2.070312 -0.52374,0.476127 -1.11858,0.714844 -1.78515,0.714844 -0.61897,0.04761 -1.23846,-0.04905 -1.85743,-0.287109 l -1.42773,7.285156 c 0.66658,0.380901 1.45278,0.642319 2.35742,0.785156 0.95225,0.190451 1.92787,0.28711 2.92774,0.28711 1.42837,0 2.64271,-0.430083 3.64257,-1.28711 1.04748,-0.809414 1.97575,-1.999096 2.78516,-3.570312 0.80941,-1.571216 1.57097,-3.475098 2.28516,-5.712891 0.71419,-2.237792 1.47574,-4.761168 2.28515,-7.570312 l 8.92774,-32.210938 h -8.71289 l -4.14258,19.998047 -0.64258,5.642578 h -0.35742 l -0.92774,-5.572265 -5,-20.06836 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:8.52205467px;line-height:2.53632545px;font-family:'PT Sans Narrow';-inkscape-font-specification:'PT Sans Narrow Bold Condensed';letter-spacing:0.22319667px;word-spacing:2.60024095px;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#linearGradient4523);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.27365798px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
id="text5065-3"
|
||||||
|
transform="matrix(0.1193249,0,0,0.1193249,12.763965,-131.94382)"
|
||||||
|
d="m 386.9082,34.349609 c -2.04734,0 -4.09523,0.119359 -6.14258,0.357422 -2.04734,0.190451 -3.92657,0.476521 -5.64062,0.857422 v 49.494141 h 8.99805 V 67.845703 c 0.19045,0.04761 0.49922,0.09497 0.92773,0.142578 l 1.42969,0.142578 h 1.35742 0.92773 c 2.04735,0 4.02324,-0.30877 5.92774,-0.927734 1.95212,-0.618964 3.66659,-1.619234 5.14258,-3 1.47599,-1.380766 2.64102,-3.165289 3.49804,-5.355469 0.90464,-2.19018 1.35743,-4.857568 1.35743,-8 0,-3.47572 -0.52284,-6.285167 -1.57032,-8.427734 -1.04747,-2.19018 -2.40582,-3.879997 -4.07226,-5.070313 -1.66644,-1.190315 -3.57033,-1.976521 -5.71289,-2.357421 -2.09496,-0.428514 -4.23756,-0.642579 -6.42774,-0.642579 z m 51.72461,0.714844 v 48.564453 c 1.14271,0.571352 2.76052,1.09614 4.85547,1.572266 2.14257,0.476126 4.47653,0.71289 7,0.71289 4.61842,0 8.25948,-1.570458 10.92578,-4.71289 2.66631,-3.190045 4,-8.164791 4,-14.925781 0,-6.237252 -0.95292,-10.761169 -2.85742,-13.570313 -1.85689,-2.809144 -4.47497,-4.214844 -7.85547,-4.214844 -3.19004,0 -5.64141,1.047624 -7.35547,3.142578 h -0.21484 V 35.064453 Z m -50.86719,7.285156 c 0.99987,0 1.95279,0.142059 2.85743,0.427735 0.90464,0.285675 1.68889,0.761158 2.35547,1.427734 0.71418,0.618964 1.26167,1.477176 1.64257,2.572266 0.42852,1.09509 0.64258,2.428784 0.64258,4 0,1.856891 -0.21406,3.402697 -0.64258,4.640625 -0.42851,1.190315 -1.02335,2.143233 -1.78515,2.857422 -0.71419,0.666576 -1.54775,1.142058 -2.5,1.427734 -0.95225,0.285676 -1.95057,0.429687 -2.99805,0.429687 -0.28568,10e-7 -0.83316,-0.02465 -1.64258,-0.07227 -0.7618,-0.09522 -1.28659,-0.189931 -1.57226,-0.285156 v -17.06836 c 0.95225,-0.238063 2.16658,-0.357422 3.64257,-0.357422 z m 20.31836,6.998047 v 23.210938 c 0,2.666306 0.21407,4.880911 0.64258,6.642578 0.42852,1.714054 1.04606,3.070448 1.85547,4.070312 0.80942,0.999865 1.78699,1.691365 2.92969,2.072266 1.1427,0.428513 2.45174,0.642578 3.92773,0.642578 2.28541,0 4.18929,-0.547488 5.71289,-1.642578 1.57122,-1.09509 2.81021,-2.476137 3.71485,-4.142578 h 0.21289 l 1.5,4.857422 h 6.42773 c -0.3809,-1.523604 -0.64232,-3.215374 -0.78515,-5.072266 -0.14284,-1.904504 -0.21485,-3.833039 -0.21485,-5.785156 V 49.347656 h -8.49804 v 23.853516 c -0.38091,1.380765 -1.02505,2.572401 -1.92969,3.572266 -0.90464,0.952252 -2.02232,1.427734 -3.35547,1.427734 -1.38077,0 -2.33368,-0.547488 -2.85742,-1.642578 -0.52374,-1.09509 -0.78516,-3.046325 -0.78516,-5.855469 V 49.347656 Z m 43.83204,6.927735 c 1.61882,0 2.80851,0.858211 3.57031,2.572265 0.7618,1.666441 1.14258,4.307223 1.14258,7.925782 0,4.094684 -0.47549,7.023489 -1.42774,8.785156 -0.95225,1.714054 -2.3333,2.572265 -4.14258,2.572265 -1.61882,0 -2.92787,-0.26337 -3.92773,-0.787109 V 59.990234 c 0.80941,-2.475855 2.40453,-3.714843 4.78516,-3.714843 z"
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:condensed;font-size:8.52205467px;line-height:2.53632545px;font-family:'PT Sans Narrow';-inkscape-font-specification:'PT Sans Narrow Bold Condensed';letter-spacing:0.22319667px;word-spacing:2.60024095px;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:url(#linearGradient4526);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.24196777px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 18 KiB |
12
damus/Assets.xcassets/Logos/activityPub.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "ActivityPub-logo.svg",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
23
damus/Assets.xcassets/Logos/alby.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "alby.svg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "alby.svg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "alby.svg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
12
damus/Assets.xcassets/Logos/atproto.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "atproto.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Logos/atproto.imageset/atproto.png
vendored
Normal file
|
After Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 215 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
12
damus/Assets.xcassets/Logos/coinos.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "coinos.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Logos/coinos.imageset/coinos.png
vendored
Normal file
|
After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
12
damus/Assets.xcassets/Logos/mutiny.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "mutiny.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Logos/mutiny.imageset/mutiny.png
vendored
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
12
damus/Assets.xcassets/Logos/rss.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "rss.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Logos/rss.imageset/rss.png
vendored
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
12
damus/Assets.xcassets/Logos/tor.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "tor.svg.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
damus/Assets.xcassets/Logos/tor.imageset/tor.svg.png
vendored
Normal file
|
After Width: | Height: | Size: 4.2 KiB |