WIP! A BB-style forum, on the ATmosphere!
We're still working... we'll be back soon when we have something to show off!
node
typescript
hono
htmx
atproto
1{
2 lib,
3 stdenv,
4 nodejs_22,
5 pnpm_9,
6 fetchPnpmDeps,
7 pnpmConfigHook,
8 bash,
9 makeWrapper,
10}:
11
12stdenv.mkDerivation (finalAttrs: {
13 pname = "atbb";
14 version = "0.1.0";
15
16 src = lib.fileset.toSource {
17 root = ../.;
18 fileset = lib.fileset.unions [
19 ../package.json
20 ../pnpm-lock.yaml
21 ../pnpm-workspace.yaml
22 ../turbo.json
23 ../tsconfig.base.json
24 ../apps
25 ../packages
26 ];
27 };
28
29 pnpmDeps = fetchPnpmDeps {
30 inherit (finalAttrs) pname version;
31 # Only lockfile + manifests — pnpm doesn't need TypeScript source to fetch deps.
32 # Using the full src would force a rebuild on every code change.
33 src = lib.fileset.toSource {
34 root = ../.;
35 fileset = lib.fileset.unions [
36 ../package.json
37 ../pnpm-lock.yaml
38 ../pnpm-workspace.yaml
39 ../apps/appview/package.json
40 ../apps/web/package.json
41 ../packages/atproto/package.json
42 ../packages/cli/package.json
43 ../packages/css-sanitizer/package.json
44 ../packages/db/package.json
45 ../packages/lexicon/package.json
46 ../packages/logger/package.json
47 ];
48 };
49 pnpm = pnpm_9;
50 fetcherVersion = 3;
51 hash = "sha256-RxdykdkbLfw9rsug5ow8AsCsI2DnZ+pjNSF3tQ4pFLk=";
52 };
53
54 nativeBuildInputs = [
55 nodejs_22
56 pnpm_9
57 pnpmConfigHook
58 bash
59 makeWrapper
60 ];
61
62 buildPhase = ''
63 runHook preBuild
64 pnpm build
65 runHook postBuild
66 '';
67
68 installPhase = ''
69 runHook preInstall
70
71 mkdir -p $out
72
73 # Workspace config
74 cp package.json pnpm-lock.yaml pnpm-workspace.yaml $out/
75
76 # Root node_modules (pnpm virtual store — symlinks point into Nix store FOD)
77 cp -r node_modules $out/
78
79 # Each workspace package: package.json + dist/ + local node_modules symlinks
80 for pkg in apps/appview apps/web packages/db packages/atproto packages/cli packages/css-sanitizer packages/lexicon packages/logger; do
81 mkdir -p "$out/$pkg"
82 cp "$pkg/package.json" "$out/$pkg/"
83 [ -d "$pkg/dist" ] && cp -r "$pkg/dist" "$out/$pkg/"
84 [ -d "$pkg/node_modules" ] && cp -r "$pkg/node_modules" "$out/$pkg/"
85 done
86
87 # DB schema source (needed by drizzle.config.ts which references ../../packages/db/src/schema.ts)
88 cp -r packages/db/src $out/packages/db/
89
90 # Drizzle migrations (needed for db:migrate at deploy time)
91 cp -r apps/appview/drizzle $out/apps/appview/
92 cp -r apps/appview/drizzle-sqlite $out/apps/appview/
93
94 # Drizzle config files (needed by drizzle-kit migrate)
95 cp apps/appview/drizzle.postgres.config.ts $out/apps/appview/
96 cp apps/appview/drizzle.sqlite.config.ts $out/apps/appview/
97
98 # Web static assets (CSS, favicon — served by hono serveStatic)
99 cp -r apps/web/public $out/apps/web/
100
101 # CLI wrapper — makes `atbb` available on PATH
102 mkdir -p $out/bin
103 makeWrapper ${nodejs_22}/bin/node $out/bin/atbb \
104 --add-flags "$out/packages/cli/dist/index.js"
105
106 runHook postInstall
107 '';
108
109 meta = with lib; {
110 description = "atBB — decentralized BB-style forum on AT Protocol";
111 license = licenses.agpl3Only;
112 platforms = [ "x86_64-linux" "aarch64-linux" ];
113 };
114})