From 5c2dbaf41e726980bf25193f9a4e14dcf677755d Mon Sep 17 00:00:00 2001 From: "pdewey.com" Date: Fri, 2 Jan 2026 20:03:11 -0500 Subject: [PATCH] pds.solanaceae.net config and nix flake for building --- .gitignore | 4 +- README.md | 2 +- config.ts | 51 +++++++++++++ flake.lock | 26 +++++++ flake.nix | 125 ++++++++++++++++++++++++++++++++ index.html | 6 +- public/favicon.ico | Bin 15406 -> 15406 bytes public/moo.webp | 0 src/App.svelte | 15 +--- src/lib/AccountComponent.svelte | 102 +++++++++++++------------- src/lib/PostComponent.svelte | 46 ++++++------ vite.config.ts | 5 +- 12 files changed, 287 insertions(+), 95 deletions(-) create mode 100644 config.ts create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 public/moo.webp diff --git a/.gitignore b/.gitignore index 991a625..3d601a2 100644 --- a/.gitignore +++ b/.gitignore @@ -151,5 +151,5 @@ dist .yarn/install-state.gz .pnp.* -# Config files -config.ts \ No newline at end of file +# deno cache +.deno-cache diff --git a/README.md b/README.md index 8416cb9..debd3b6 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ An example of a caddy file you can use handle @pds { reverse_proxy http://localhost:3000 } - + # If none matches goes to landing page handle /* { root * /srv/landing diff --git a/config.ts b/config.ts new file mode 100644 index 0000000..a3a3afd --- /dev/null +++ b/config.ts @@ -0,0 +1,51 @@ +/** + * Configuration module for the PDS Dashboard + */ +export class Config { + /** + * The base URL of the PDS (Personal Data Server). + * @default none + */ + static readonly PDS_URL: string = "https://pds.solanaceae.net"; + + /** + * Theme to be used + * @default "default" + */ + static readonly THEME: string = "dark"; + + /** + * The base URL of the frontend service for linking to replies/quotes/accounts etc. + * @default "https://deer.social" // or https://bsky.app if you're boring + */ + // static readonly FRONTEND_URL: string = "https://deer.social"; + static readonly FRONTEND_URL: string = "https://reddwarf.app"; + + /** + * The base URL of the frontend service for linking to user profiles. + * @default "https://deer.social/profile" or whatever. (needs /profile since aturi doesn't use that path) + */ + static readonly FRONTEND_PROFILE_URL: string = "https://aturi.to"; + + /** + * Maximum number of posts to fetch from the PDS per request + * Should be around 20 for about 10 users on the pds + * The more users you have, the lower the number should be + * since sorting is slow and is done on the frontend + * @default 20 + */ + static readonly MAX_POSTS: number = 20; + + /** + * Footer text for the dashboard, you probably want to change this. Supports HTML. + * @default "Source (github mirror)" + */ + static readonly FOOTER_TEXT: string = + "Source (Forked with <3 from selfhosted.social)"; + + /** + * Whether to show the posts with timestamps that are in the future. + * @default false + */ + static readonly SHOW_FUTURE_POSTS: boolean = false; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..3fcda22 --- /dev/null +++ b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1767273430, + "narHash": "sha256-kDpoFwQ8GLrPiS3KL+sAwreXrph2KhdXuJzo5+vSLoo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "76eec3925eb9bbe193934987d3285473dbcfad50", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixpkgs-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..992e9d4 --- /dev/null +++ b/flake.nix @@ -0,0 +1,125 @@ +{ + description = "PDS Dashboard Flake"; + inputs = { nixpkgs.url = "nixpkgs/nixpkgs-unstable"; }; + outputs = { nixpkgs, ... }: + let + forAllSystems = function: + nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ] + (system: function nixpkgs.legacyPackages.${system}); + in { + devShells = forAllSystems + (pkgs: { default = pkgs.mkShell { packages = with pkgs; [ deno ]; }; }); + + packages = forAllSystems (pkgs: + let + deps = pkgs.stdenv.mkDerivation { + name = "pds-dash-deps"; + src = ./.; + + nativeBuildInputs = [ pkgs.deno ]; + + buildPhase = '' + export DENO_DIR=$out + export DENO_NO_UPDATE_CHECK=1 + deno install --frozen + ''; + + installPhase = '' + echo "Dependencies cached in $out" + ''; + + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + outputHash = "sha256-SQbclPzhmcrsTHvYBoYC53zcedorb7yE5w63xGNoZpw="; + }; + in { + default = pkgs.stdenv.mkDerivation { + pname = "pds-dash"; + version = "0.1.0"; + src = ./.; + + nativeBuildInputs = [ pkgs.deno ]; + + configurePhase = '' + runHook preConfigure + if [ ! -f config.ts ]; then + echo "Error: config.ts not found." + exit 1 + fi + + # Copy dependencies to a writable location + export DENO_DIR="$TMPDIR/deno-cache" + mkdir -p "$DENO_DIR" + cp -r ${deps}/* "$DENO_DIR/" + chmod -R +w "$DENO_DIR" + export DENO_NO_UPDATE_CHECK=1 + # Install dependencies (will use the local cache) + deno install --frozen + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + export DENO_DIR="$TMPDIR/deno-cache" + export DENO_NO_UPDATE_CHECK=1 + deno task build + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r dist/* $out/ + + runHook postInstall + ''; + }; + }); + + apps = forAllSystems (pkgs: { + # build static files for production use + default = { + type = "app"; + program = toString (pkgs.writeShellScript "build-pds-dash" '' + set -e + echo "Building pds-dash..." + RESULT=$(nix build .#default --no-link --print-out-paths 2>&1 | grep -v "^warning:" | tail -1) + echo "Build complete!" + echo "Output is in: $RESULT" + echo "To serve the built files:" + echo " python3 -m http.server --directory $RESULT 8080" + ''); + }; + + # deno dev server + dev = { + type = "app"; + program = toString (pkgs.writeShellScript "dev-pds-dash" '' + set -e + + if [ ! -f config.ts ]; then + echo "Error: config.ts not found." + exit 1 + fi + + # Setup cleanup trap to remove deno cache on exit + cleanup() { + echo "Cleaning up .deno-cache..." + rm -rf "$PWD/.deno-cache" + echo "Done!" + } + trap cleanup EXIT INT TERM + + echo "Installing dependencies..." + export DENO_DIR="$PWD/.deno-cache" + export DENO_NO_UPDATE_CHECK=1 + ${pkgs.deno}/bin/deno install + + echo "Starting development server..." + ${pkgs.deno}/bin/deno task dev + ''); + }; + }); + }; +} diff --git a/index.html b/index.html index 88a793b..736ded7 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,13 @@ - + - Selfhosted.social + pds.solanaceae.net + />
diff --git a/public/favicon.ico b/public/favicon.ico index 4ba99c261639b6408a8b13fb5fcc4f849fb617c1..2e45f8cb3de5132a06faecdfb6cc91af8dada5c2 100644 GIT binary patch literal 15406 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 K8#QZWg#Z9Ah>6bt diff --git a/public/moo.webp b/public/moo.webp deleted file mode 100644 index e69de29..0000000 diff --git a/src/App.svelte b/src/App.svelte index 7ccf841..8188ba9 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -7,8 +7,6 @@ const accountsPromise = getAllMetadataFromPds(); import { onMount } from "svelte"; - - let posts: Post[] = []; let hue: number = 1; @@ -21,7 +19,7 @@ document.documentElement.style.setProperty("--primary-h", hue.toString()); await new Promise((resolve) => setTimeout(resolve, 10)); } - } + }; let clickCounter = 0; const carameldansenfusion = async () => { clickCounter++; @@ -32,7 +30,7 @@ }; onMount(() => { - // Fetch initial posts + // Fetch initial posts // TODO I think this was getting called twice? // getNextPosts().then((initialPosts) => { // posts = initialPosts; @@ -63,16 +61,12 @@ {:then accountsData}

ATProto PDS

-

Home to {accountsData.length} accounts

+

Home to {accountsData.length} accounts

{#each accountsData as accountObject} {/each}
-
-

Help support the PDS

- -

{@html Config.FOOTER_TEXT}

{:catch error} @@ -84,12 +78,11 @@ {#each posts as postObject} {/each} - +
diff --git a/src/lib/AccountComponent.svelte b/src/lib/AccountComponent.svelte index bc7a95b..2a78c46 100644 --- a/src/lib/AccountComponent.svelte +++ b/src/lib/AccountComponent.svelte @@ -8,24 +8,26 @@ let statusEmoji: string | null = $state(null); $effect(() => { - if(account.did){ - getTealNowListeningTo(account.did).then(res => { - nowListeningTo = res; - }); - getStatusSphere(account.did).then(res => { - statusEmoji = res; - }) - } - }) + if (account.did) { + getTealNowListeningTo(account.did).then((res) => { + nowListeningTo = res; + }); + getStatusSphere(account.did).then((res) => { + statusEmoji = res; + }); + } + }); -
+
{#if account.avatarCid} - {#if statusEmoji} - - {/if} + {#if statusEmoji} + + {/if} avatar of {account.displayName} {:else} - {#if statusEmoji} - - {/if} + {#if statusEmoji} + + {/if} unknown avatar of {account.displayName} + id="avatar" + alt="unknown avatar of {account.displayName}" + src="/unknown.png" + />
@@ -66,52 +70,52 @@ diff --git a/src/lib/PostComponent.svelte b/src/lib/PostComponent.svelte index 6c16076..57d0e4d 100644 --- a/src/lib/PostComponent.svelte +++ b/src/lib/PostComponent.svelte @@ -101,7 +101,7 @@ /> {/if}
- {post.displayName}

@@ -126,7 +126,10 @@ id="replyingText" style="text-decoration: underline;" href="{Config.FRONTEND_URL}/profile/{post.replyingUri.repo}/post/{post - .replyingUri.rkey}">replying to {replyingHandle ? `@${replyingHandle}` : post.replyingUri.repo}replying to {replyingHandle + ? `@${replyingHandle}` + : post.replyingUri.repo} {/if} {#if post.quotingUri} @@ -137,17 +140,19 @@ > {/if}

- {#each post.richText.segments() as segment} - {#if segment.mention} - {segment.text} - {:else if segment.link} - {segment.text} - {:else if segment.text} - {segment.text} - {/if} - {/each} + {#each post.richText.segments() as segment} + {#if segment.mention} + {segment.text} + {:else if segment.link} + {segment.text} + {:else if segment.text} + {segment.text} + {/if} + {/each}
{#if post.imagesCid && post.imagesCid.length > 0}
@@ -155,7 +160,7 @@ id="embedImages" alt="Post Image {currentImageIndex + 1} of {post.imagesCid.length}" src="https://cdn.bsky.app/img/feed_thumbnail/plain/{post.authorDid}/{post - .imagesCid[currentImageIndex]}@jpeg" + .imagesCid[currentImageIndex]}@jpeg" /> {#if post.imagesCid.length > 1} @@ -184,22 +189,13 @@ {/if} {#if post.videosLinkCid} - + {/if} {#if post.gifLink} - Post GIF + Post GIF {/if}
diff --git a/vite.config.ts b/vite.config.ts index 7fe56d1..f57ab65 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,8 +4,5 @@ import { themePlugin } from "./theming.ts"; // https://vite.dev/config/ export default defineConfig({ - plugins: [ - themePlugin(), - svelte(), - ], + plugins: [themePlugin(), svelte()], }); -- 2.51.2