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