[WIP] A (somewhat barebones) atproto app for creating custom sites without hosting!

Compare changes

Choose any two refs to compare.

Changed files
+86 -116
server
upload
+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 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
··· 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
··· 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
··· 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"
+4 -4
upload/src/main.rs
··· 179 179 let mut create_records = new_sitemap 180 180 .into_iter() 181 181 .map(|(k, v)| { 182 - let k = if k == "404.html" { 183 - String::from("404") 184 - } else { 185 - match k.strip_suffix("/index.html") { 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 186 Some(k) => format!("/{k}/"), 187 187 None => format!("/{k}"), 188 188 }