+32
-5
README.md
+32
-5
README.md
···
2
3
A (somewhat barebones) atproto app for creating custom sites without hosting!
4
5
- Lexicons are located at [`./lexicons`](./lexicons/)
6
- Server backend is located at [`./server`](./server/)
7
- Upload CLI is located at [`./upload`](./upload/)
8
- Web GUI **will be** located at [`./web-gui`](./web-gui/)
9
- Fuse tool **will be** located at [`./fuse`](./fuse/)
10
11
-
TODO:
12
13
- [x] Resolve `handle.host` and `did.did-method.host` domains to records/blobs
14
- [x] Backfill network
···
16
- [x] Store blobs for CDN (max ~0.25gb per user)
17
- [x] Moderate illegal content or hope that people are niceys
18
(Hope that people are niceys)
19
-
- [ ] Finish CLI tool
20
-
- [ ] Sign in via app password
21
-
- [ ] Clear old site
22
-
- [ ] Upload new site
23
- [ ] Fuse uploader
24
- [ ] Web GUI uploader
···
2
3
A (somewhat barebones) atproto app for creating custom sites without hosting!
4
5
+
> [!CAUTION]
6
+
> This software is super duper alpha and not tested thoroughly! Use at your own risk!
7
+
8
- Lexicons are located at [`./lexicons`](./lexicons/)
9
- Server backend is located at [`./server`](./server/)
10
- Upload CLI is located at [`./upload`](./upload/)
11
- Web GUI **will be** located at [`./web-gui`](./web-gui/)
12
- Fuse tool **will be** located at [`./fuse`](./fuse/)
13
14
+
## How to:
15
+
16
+
**View someones site?**
17
+
> Head to `https://<handle>.atcities.dev/` or `https://<did>.did-<method>.atcities.dev/`.
18
+
19
+
**Upload your own site?**
20
+
> Use the upload cli. Installation guide below.
21
+
22
+
**Self host atcities.dev?**
23
+
> Clone this repo and setup the `.env` file for `/server`, then run `deno run run`
24
+
25
+
### CLI installation guide.
26
+
27
+
1. Build from source:
28
+
Prerequisites: `git` `cargo` `rust`
29
+
```sh
30
+
git clone https://tangled.org/@vielle.dev/atcities.dev
31
+
cd atcities.dev/upload
32
+
cargo build
33
+
sudo cp ./target/debug/atcities-upload /bin
34
+
# Reload your shell environment
35
+
atcities-upload --version
36
+
```
37
+
38
+
## Todo:
39
40
- [x] Resolve `handle.host` and `did.did-method.host` domains to records/blobs
41
- [x] Backfill network
···
43
- [x] Store blobs for CDN (max ~0.25gb per user)
44
- [x] Moderate illegal content or hope that people are niceys
45
(Hope that people are niceys)
46
+
- [x] Finish CLI tool
47
+
- [x] Sign in via app password
48
+
- [x] Clear old site
49
+
- [x] Upload new site
50
- [ ] Fuse uploader
51
- [ ] Web GUI uploader
+1
server/deno.json
+1
server/deno.json
···
1
{
2
"tasks": {
3
"dev": "deno run --watch --allow-net --allow-env --allow-sys --allow-read=/usr/bin/ldd,./blobs,./src --allow-write=./blobs --allow-ffi --env-file src/index.ts",
4
"lexgen": "deno run --allow-env --allow-sys --allow-read=.. --allow-write=./src/lexicons --no-prompt @atcute/lex-cli generate -c ./lex.config.js && cat ./src/lexicons/index.ts | sed \"s/.js/.ts/\" > ./src/lexicons/index.ts",
5
"dk": "deno run -A --node-modules-dir npm:drizzle-kit"
6
},
···
1
{
2
"tasks": {
3
"dev": "deno run --watch --allow-net --allow-env --allow-sys --allow-read=/usr/bin/ldd,./blobs,./src --allow-write=./blobs --allow-ffi --env-file src/index.ts",
4
+
"run": "deno run --allow-net --allow-env --allow-sys --allow-read=/usr/bin/ldd,./blobs,./src --allow-write=./blobs --allow-ffi --env-file src/index.ts",
5
"lexgen": "deno run --allow-env --allow-sys --allow-read=.. --allow-write=./src/lexicons --no-prompt @atcute/lex-cli generate -c ./lex.config.js && cat ./src/lexicons/index.ts | sed \"s/.js/.ts/\" > ./src/lexicons/index.ts",
6
"dk": "deno run -A --node-modules-dir npm:drizzle-kit"
7
},
+44
-102
upload/Cargo.lock
+44
-102
upload/Cargo.lock
···
158
dependencies = [
159
"proc-macro2",
160
"quote",
161
-
"syn 2.0.106",
162
]
163
164
[[package]]
165
name = "atcities-upload"
166
-
version = "0.1.0"
167
dependencies = [
168
"clap",
169
"env_logger",
···
291
"proc-macro2",
292
"quote",
293
"rustversion",
294
-
"syn 2.0.106",
295
]
296
297
[[package]]
···
526
"heck 0.5.0",
527
"proc-macro2",
528
"quote",
529
-
"syn 2.0.106",
530
]
531
532
[[package]]
···
697
"proc-macro2",
698
"quote",
699
"strsim",
700
-
"syn 2.0.106",
701
]
702
703
[[package]]
···
708
dependencies = [
709
"darling_core",
710
"quote",
711
-
"syn 2.0.106",
712
]
713
714
[[package]]
···
748
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
749
dependencies = [
750
"data-encoding",
751
-
"syn 2.0.106",
752
]
753
754
[[package]]
···
801
dependencies = [
802
"proc-macro2",
803
"quote",
804
-
"syn 2.0.106",
805
]
806
807
[[package]]
···
856
"heck 0.5.0",
857
"proc-macro2",
858
"quote",
859
-
"syn 2.0.106",
860
]
861
862
[[package]]
···
1001
dependencies = [
1002
"proc-macro2",
1003
"quote",
1004
-
"syn 2.0.106",
1005
]
1006
1007
[[package]]
···
1634
"getrandom 0.2.16",
1635
"http",
1636
"jacquard-api",
1637
-
"jacquard-common 0.6.0",
1638
-
"jacquard-derive 0.6.0",
1639
"jacquard-identity",
1640
"jacquard-oauth",
1641
"jose-jwk",
···
1663
dependencies = [
1664
"bon",
1665
"bytes",
1666
-
"jacquard-common 0.6.0",
1667
-
"jacquard-derive 0.6.0",
1668
"miette",
1669
"serde",
1670
"serde_ipld_dagcbor",
···
1673
1674
[[package]]
1675
name = "jacquard-common"
1676
-
version = "0.5.4"
1677
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1678
-
checksum = "cf91dfa4ade1ca83c9afccee4ece7ed72b6607a0853d88623958d4e7c5382eb3"
1679
-
dependencies = [
1680
-
"base64 0.22.1",
1681
-
"bon",
1682
-
"bytes",
1683
-
"chrono",
1684
-
"cid",
1685
-
"getrandom 0.3.4",
1686
-
"http",
1687
-
"ipld-core",
1688
-
"k256",
1689
-
"langtag",
1690
-
"miette",
1691
-
"multibase",
1692
-
"multihash",
1693
-
"ouroboros",
1694
-
"p256",
1695
-
"rand 0.9.2",
1696
-
"regex",
1697
-
"reqwest",
1698
-
"serde",
1699
-
"serde_html_form",
1700
-
"serde_ipld_dagcbor",
1701
-
"serde_json",
1702
-
"signature",
1703
-
"smol_str",
1704
-
"thiserror 2.0.17",
1705
-
"tokio",
1706
-
"trait-variant",
1707
-
"url",
1708
-
]
1709
-
1710
-
[[package]]
1711
-
name = "jacquard-common"
1712
version = "0.6.0"
1713
source = "registry+https://github.com/rust-lang/crates.io-index"
1714
checksum = "f7f1bab0279ae2e29c3383f132a05b9c708585fab62e94292affdf352ce13242"
···
1747
1748
[[package]]
1749
name = "jacquard-derive"
1750
-
version = "0.5.4"
1751
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1752
-
checksum = "4f7db8498da87d842297b169a0080eed751bce173c56626b5fa71261fe72f804"
1753
-
dependencies = [
1754
-
"proc-macro2",
1755
-
"quote",
1756
-
"syn 2.0.106",
1757
-
]
1758
-
1759
-
[[package]]
1760
-
name = "jacquard-derive"
1761
version = "0.6.0"
1762
source = "registry+https://github.com/rust-lang/crates.io-index"
1763
checksum = "a4741844c0638498156338e6230a81ecb54d0a061ffc6f4f54e97b94972a01fb"
1764
dependencies = [
1765
"proc-macro2",
1766
"quote",
1767
-
"syn 2.0.106",
1768
]
1769
1770
[[package]]
···
1778
"hickory-resolver",
1779
"http",
1780
"jacquard-api",
1781
-
"jacquard-common 0.6.0",
1782
"miette",
1783
"percent-encoding",
1784
"reqwest",
···
1804
"dashmap",
1805
"elliptic-curve",
1806
"http",
1807
-
"jacquard-common 0.6.0",
1808
"jacquard-identity",
1809
"jose-jwa",
1810
"jose-jwk",
···
1848
dependencies = [
1849
"proc-macro2",
1850
"quote",
1851
-
"syn 2.0.106",
1852
]
1853
1854
[[package]]
···
1953
1954
[[package]]
1955
name = "lexicons"
1956
-
version = "0.1.0"
1957
dependencies = [
1958
"bon",
1959
"bytes",
1960
-
"jacquard-common 0.5.4",
1961
-
"jacquard-derive 0.5.4",
1962
"miette",
1963
"serde",
1964
"thiserror 2.0.17",
···
2088
dependencies = [
2089
"proc-macro2",
2090
"quote",
2091
-
"syn 2.0.106",
2092
]
2093
2094
[[package]]
···
2333
dependencies = [
2334
"proc-macro2",
2335
"quote",
2336
-
"syn 2.0.106",
2337
]
2338
2339
[[package]]
···
2375
"proc-macro2",
2376
"proc-macro2-diagnostics",
2377
"quote",
2378
-
"syn 2.0.106",
2379
]
2380
2381
[[package]]
···
2529
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
2530
dependencies = [
2531
"proc-macro2",
2532
-
"syn 2.0.106",
2533
]
2534
2535
[[package]]
···
2614
dependencies = [
2615
"proc-macro2",
2616
"quote",
2617
-
"syn 2.0.106",
2618
"version_check",
2619
"yansi",
2620
]
···
3102
dependencies = [
3103
"proc-macro2",
3104
"quote",
3105
-
"syn 2.0.106",
3106
]
3107
3108
[[package]]
···
3177
version = "1.3.0"
3178
source = "registry+https://github.com/rust-lang/crates.io-index"
3179
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
3180
-
3181
-
[[package]]
3182
-
name = "signal-hook-registry"
3183
-
version = "1.4.6"
3184
-
source = "registry+https://github.com/rust-lang/crates.io-index"
3185
-
checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
3186
-
dependencies = [
3187
-
"libc",
3188
-
]
3189
3190
[[package]]
3191
name = "signature"
···
3283
"quote",
3284
"serde",
3285
"sha2",
3286
-
"syn 2.0.106",
3287
"thiserror 1.0.69",
3288
]
3289
···
3339
3340
[[package]]
3341
name = "syn"
3342
-
version = "2.0.106"
3343
source = "registry+https://github.com/rust-lang/crates.io-index"
3344
-
checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
3345
dependencies = [
3346
"proc-macro2",
3347
"quote",
···
3376
dependencies = [
3377
"proc-macro2",
3378
"quote",
3379
-
"syn 2.0.106",
3380
]
3381
3382
[[package]]
···
3459
dependencies = [
3460
"proc-macro2",
3461
"quote",
3462
-
"syn 2.0.106",
3463
]
3464
3465
[[package]]
···
3470
dependencies = [
3471
"proc-macro2",
3472
"quote",
3473
-
"syn 2.0.106",
3474
]
3475
3476
[[package]]
···
3549
"bytes",
3550
"libc",
3551
"mio",
3552
-
"parking_lot",
3553
"pin-project-lite",
3554
-
"signal-hook-registry",
3555
"socket2 0.6.1",
3556
"tokio-macros",
3557
"windows-sys 0.61.2",
···
3565
dependencies = [
3566
"proc-macro2",
3567
"quote",
3568
-
"syn 2.0.106",
3569
]
3570
3571
[[package]]
···
3665
dependencies = [
3666
"proc-macro2",
3667
"quote",
3668
-
"syn 2.0.106",
3669
]
3670
3671
[[package]]
···
3685
dependencies = [
3686
"proc-macro2",
3687
"quote",
3688
-
"syn 2.0.106",
3689
]
3690
3691
[[package]]
···
3850
"log",
3851
"proc-macro2",
3852
"quote",
3853
-
"syn 2.0.106",
3854
"wasm-bindgen-shared",
3855
]
3856
···
3885
dependencies = [
3886
"proc-macro2",
3887
"quote",
3888
-
"syn 2.0.106",
3889
"wasm-bindgen-backend",
3890
"wasm-bindgen-shared",
3891
]
···
3994
dependencies = [
3995
"proc-macro2",
3996
"quote",
3997
-
"syn 2.0.106",
3998
]
3999
4000
[[package]]
···
4005
dependencies = [
4006
"proc-macro2",
4007
"quote",
4008
-
"syn 2.0.106",
4009
]
4010
4011
[[package]]
···
4412
dependencies = [
4413
"proc-macro2",
4414
"quote",
4415
-
"syn 2.0.106",
4416
"synstructure",
4417
]
4418
···
4433
dependencies = [
4434
"proc-macro2",
4435
"quote",
4436
-
"syn 2.0.106",
4437
]
4438
4439
[[package]]
···
4453
dependencies = [
4454
"proc-macro2",
4455
"quote",
4456
-
"syn 2.0.106",
4457
"synstructure",
4458
]
4459
···
4496
dependencies = [
4497
"proc-macro2",
4498
"quote",
4499
-
"syn 2.0.106",
4500
]
···
158
dependencies = [
159
"proc-macro2",
160
"quote",
161
+
"syn 2.0.107",
162
]
163
164
[[package]]
165
name = "atcities-upload"
166
+
version = "1.0.1"
167
dependencies = [
168
"clap",
169
"env_logger",
···
291
"proc-macro2",
292
"quote",
293
"rustversion",
294
+
"syn 2.0.107",
295
]
296
297
[[package]]
···
526
"heck 0.5.0",
527
"proc-macro2",
528
"quote",
529
+
"syn 2.0.107",
530
]
531
532
[[package]]
···
697
"proc-macro2",
698
"quote",
699
"strsim",
700
+
"syn 2.0.107",
701
]
702
703
[[package]]
···
708
dependencies = [
709
"darling_core",
710
"quote",
711
+
"syn 2.0.107",
712
]
713
714
[[package]]
···
748
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
749
dependencies = [
750
"data-encoding",
751
+
"syn 2.0.107",
752
]
753
754
[[package]]
···
801
dependencies = [
802
"proc-macro2",
803
"quote",
804
+
"syn 2.0.107",
805
]
806
807
[[package]]
···
856
"heck 0.5.0",
857
"proc-macro2",
858
"quote",
859
+
"syn 2.0.107",
860
]
861
862
[[package]]
···
1001
dependencies = [
1002
"proc-macro2",
1003
"quote",
1004
+
"syn 2.0.107",
1005
]
1006
1007
[[package]]
···
1634
"getrandom 0.2.16",
1635
"http",
1636
"jacquard-api",
1637
+
"jacquard-common",
1638
+
"jacquard-derive",
1639
"jacquard-identity",
1640
"jacquard-oauth",
1641
"jose-jwk",
···
1663
dependencies = [
1664
"bon",
1665
"bytes",
1666
+
"jacquard-common",
1667
+
"jacquard-derive",
1668
"miette",
1669
"serde",
1670
"serde_ipld_dagcbor",
···
1673
1674
[[package]]
1675
name = "jacquard-common"
1676
version = "0.6.0"
1677
source = "registry+https://github.com/rust-lang/crates.io-index"
1678
checksum = "f7f1bab0279ae2e29c3383f132a05b9c708585fab62e94292affdf352ce13242"
···
1711
1712
[[package]]
1713
name = "jacquard-derive"
1714
version = "0.6.0"
1715
source = "registry+https://github.com/rust-lang/crates.io-index"
1716
checksum = "a4741844c0638498156338e6230a81ecb54d0a061ffc6f4f54e97b94972a01fb"
1717
dependencies = [
1718
"proc-macro2",
1719
"quote",
1720
+
"syn 2.0.107",
1721
]
1722
1723
[[package]]
···
1731
"hickory-resolver",
1732
"http",
1733
"jacquard-api",
1734
+
"jacquard-common",
1735
"miette",
1736
"percent-encoding",
1737
"reqwest",
···
1757
"dashmap",
1758
"elliptic-curve",
1759
"http",
1760
+
"jacquard-common",
1761
"jacquard-identity",
1762
"jose-jwa",
1763
"jose-jwk",
···
1801
dependencies = [
1802
"proc-macro2",
1803
"quote",
1804
+
"syn 2.0.107",
1805
]
1806
1807
[[package]]
···
1906
1907
[[package]]
1908
name = "lexicons"
1909
+
version = "1.0.0"
1910
dependencies = [
1911
"bon",
1912
"bytes",
1913
+
"jacquard-common",
1914
+
"jacquard-derive",
1915
"miette",
1916
"serde",
1917
"thiserror 2.0.17",
···
2041
dependencies = [
2042
"proc-macro2",
2043
"quote",
2044
+
"syn 2.0.107",
2045
]
2046
2047
[[package]]
···
2286
dependencies = [
2287
"proc-macro2",
2288
"quote",
2289
+
"syn 2.0.107",
2290
]
2291
2292
[[package]]
···
2328
"proc-macro2",
2329
"proc-macro2-diagnostics",
2330
"quote",
2331
+
"syn 2.0.107",
2332
]
2333
2334
[[package]]
···
2482
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
2483
dependencies = [
2484
"proc-macro2",
2485
+
"syn 2.0.107",
2486
]
2487
2488
[[package]]
···
2567
dependencies = [
2568
"proc-macro2",
2569
"quote",
2570
+
"syn 2.0.107",
2571
"version_check",
2572
"yansi",
2573
]
···
3055
dependencies = [
3056
"proc-macro2",
3057
"quote",
3058
+
"syn 2.0.107",
3059
]
3060
3061
[[package]]
···
3130
version = "1.3.0"
3131
source = "registry+https://github.com/rust-lang/crates.io-index"
3132
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
3133
3134
[[package]]
3135
name = "signature"
···
3227
"quote",
3228
"serde",
3229
"sha2",
3230
+
"syn 2.0.107",
3231
"thiserror 1.0.69",
3232
]
3233
···
3283
3284
[[package]]
3285
name = "syn"
3286
+
version = "2.0.107"
3287
source = "registry+https://github.com/rust-lang/crates.io-index"
3288
+
checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
3289
dependencies = [
3290
"proc-macro2",
3291
"quote",
···
3320
dependencies = [
3321
"proc-macro2",
3322
"quote",
3323
+
"syn 2.0.107",
3324
]
3325
3326
[[package]]
···
3403
dependencies = [
3404
"proc-macro2",
3405
"quote",
3406
+
"syn 2.0.107",
3407
]
3408
3409
[[package]]
···
3414
dependencies = [
3415
"proc-macro2",
3416
"quote",
3417
+
"syn 2.0.107",
3418
]
3419
3420
[[package]]
···
3493
"bytes",
3494
"libc",
3495
"mio",
3496
"pin-project-lite",
3497
"socket2 0.6.1",
3498
"tokio-macros",
3499
"windows-sys 0.61.2",
···
3507
dependencies = [
3508
"proc-macro2",
3509
"quote",
3510
+
"syn 2.0.107",
3511
]
3512
3513
[[package]]
···
3607
dependencies = [
3608
"proc-macro2",
3609
"quote",
3610
+
"syn 2.0.107",
3611
]
3612
3613
[[package]]
···
3627
dependencies = [
3628
"proc-macro2",
3629
"quote",
3630
+
"syn 2.0.107",
3631
]
3632
3633
[[package]]
···
3792
"log",
3793
"proc-macro2",
3794
"quote",
3795
+
"syn 2.0.107",
3796
"wasm-bindgen-shared",
3797
]
3798
···
3827
dependencies = [
3828
"proc-macro2",
3829
"quote",
3830
+
"syn 2.0.107",
3831
"wasm-bindgen-backend",
3832
"wasm-bindgen-shared",
3833
]
···
3936
dependencies = [
3937
"proc-macro2",
3938
"quote",
3939
+
"syn 2.0.107",
3940
]
3941
3942
[[package]]
···
3947
dependencies = [
3948
"proc-macro2",
3949
"quote",
3950
+
"syn 2.0.107",
3951
]
3952
3953
[[package]]
···
4354
dependencies = [
4355
"proc-macro2",
4356
"quote",
4357
+
"syn 2.0.107",
4358
"synstructure",
4359
]
4360
···
4375
dependencies = [
4376
"proc-macro2",
4377
"quote",
4378
+
"syn 2.0.107",
4379
]
4380
4381
[[package]]
···
4395
dependencies = [
4396
"proc-macro2",
4397
"quote",
4398
+
"syn 2.0.107",
4399
"synstructure",
4400
]
4401
···
4438
dependencies = [
4439
"proc-macro2",
4440
"quote",
4441
+
"syn 2.0.107",
4442
]
+2
-2
upload/Cargo.toml
+2
-2
upload/Cargo.toml
···
4
5
[package]
6
name = "atcities-upload"
7
-
version = "0.1.0"
8
edition = "2024"
9
10
[dependencies]
···
13
ignore = "0.4.23"
14
regex = "1.12.2"
15
mime_guess = "2.0.5"
16
-
tokio = { version = "1.48.0", features = ["full"] }
17
jacquard = "0.6.0"
18
reqwest = "0.12.24"
19
env_logger = "0.11.8"
+3
-3
upload/lexicons/Cargo.toml
+3
-3
upload/lexicons/Cargo.toml
+16
-2
upload/src/main.rs
+16
-2
upload/src/main.rs
···
179
let mut create_records = new_sitemap
180
.into_iter()
181
.map(|(k, v)| {
182
let rkey =
183
utils::url_to_rkey(k).wrap_err("Invalid file path. Could not be converted to rkey")?;
184
let rkey = RecordKey(Rkey::new_owned(rkey).into_diagnostic()?);
···
267
)
268
.await?;
269
270
-
println!("Site is now updated. Live at {}", utils::site_handle(config.user));
271
} else {
272
let oauth = oauth::client::OAuthClient::with_memory_store();
273
let session = oauth
···
303
)
304
.await?;
305
306
-
println!("Site is now updated. Live at {}", utils::site_handle(config.user));
307
};
308
309
Ok(())
···
179
let mut create_records = new_sitemap
180
.into_iter()
181
.map(|(k, v)| {
182
+
let k = match k.as_str() {
183
+
"404.html" => String::from("404"),
184
+
"index.html" => String::from("/"),
185
+
_ => match k.strip_suffix("/index.html") {
186
+
Some(k) => format!("/{k}/"),
187
+
None => format!("/{k}"),
188
+
}
189
+
};
190
let rkey =
191
utils::url_to_rkey(k).wrap_err("Invalid file path. Could not be converted to rkey")?;
192
let rkey = RecordKey(Rkey::new_owned(rkey).into_diagnostic()?);
···
275
)
276
.await?;
277
278
+
println!(
279
+
"Site is now updated. Live at {}",
280
+
utils::site_handle(config.user)
281
+
);
282
} else {
283
let oauth = oauth::client::OAuthClient::with_memory_store();
284
let session = oauth
···
314
)
315
.await?;
316
317
+
println!(
318
+
"Site is now updated. Live at {}",
319
+
utils::site_handle(config.user)
320
+
);
321
};
322
323
Ok(())
+4
-2
upload/src/utils.rs
+4
-2
upload/src/utils.rs