atproto pds in zig pds.zat.dev
pds atproto
24

Configure Feed

Select the types of activity you want to include in your feed.

Add Fly deployment config

zzstoatzz (May 21, 2026, 9:43 AM -0500) 2778b849 9a7764a8

+85 -5
+5
.dockerignore
··· 1 + .git 2 + .zig-cache 3 + zig-out 4 + dev/*.sqlite3 5 + dev/*.sqlite3-*
+37
Dockerfile
··· 1 + FROM debian:bookworm-slim AS build 2 + 3 + RUN apt-get update \ 4 + && apt-get install -y --no-install-recommends ca-certificates curl git xz-utils libc6-dev \ 5 + && rm -rf /var/lib/apt/lists/* 6 + 7 + ARG ZIG_VERSION=0.16.0 8 + ARG ZIG_TARGET=x86_64-linux 9 + RUN curl -fsSL "https://ziglang.org/download/${ZIG_VERSION}/zig-${ZIG_TARGET}-${ZIG_VERSION}.tar.xz" -o /tmp/zig.tar.xz \ 10 + && mkdir -p /opt/zig \ 11 + && tar -xJf /tmp/zig.tar.xz -C /opt/zig --strip-components=1 \ 12 + && rm /tmp/zig.tar.xz 13 + 14 + ENV PATH="/opt/zig:${PATH}" 15 + 16 + WORKDIR /work 17 + RUN git clone --depth=1 https://tangled.org/zat.dev/zat /work/zat.dev/zat 18 + 19 + WORKDIR /work/zzstoatzz.io/zds 20 + COPY . . 21 + RUN zig build -Doptimize=ReleaseSafe 22 + 23 + FROM debian:bookworm-slim 24 + 25 + RUN apt-get update \ 26 + && apt-get install -y --no-install-recommends ca-certificates \ 27 + && rm -rf /var/lib/apt/lists/* 28 + 29 + WORKDIR /app 30 + COPY --from=build /work/zzstoatzz.io/zds/zig-out/bin/zds /usr/local/bin/zds 31 + 32 + ENV ZDS_HOST=0.0.0.0 33 + ENV ZDS_PORT=2583 34 + ENV ZDS_DB=/data/zds.sqlite3 35 + 36 + EXPOSE 2583 37 + CMD ["zds", "--host", "0.0.0.0", "--port", "2583", "--db", "/data/zds.sqlite3"]
+29
fly.toml
··· 1 + app = "zds-zzstoatzz-io" 2 + primary_region = "ord" 3 + 4 + [build] 5 + dockerfile = "Dockerfile" 6 + 7 + [env] 8 + ZDS_HOST = "0.0.0.0" 9 + ZDS_DB = "/data/zds.sqlite3" 10 + ZDS_PUBLIC_URL = "https://zds-zzstoatzz-io.fly.dev" 11 + ZDS_SERVER_DID = "did:web:zds-zzstoatzz-io.fly.dev" 12 + ZDS_HANDLE_DOMAINS = ".zds-zzstoatzz-io.fly.dev,zds-zzstoatzz-io.fly.dev" 13 + ZDS_BLOB_UPLOAD_LIMIT = "100000000" 14 + 15 + [[mounts]] 16 + source = "zds_data" 17 + destination = "/data" 18 + 19 + [http_service] 20 + internal_port = 2583 21 + force_https = true 22 + auto_stop_machines = "off" 23 + auto_start_machines = true 24 + min_machines_running = 1 25 + 26 + [[vm]] 27 + memory = "1gb" 28 + cpu_kind = "shared" 29 + cpus = 1
+14 -5
src/main.zig
··· 2 2 const zds = @import("zds"); 3 3 4 4 pub fn main(init: std.process.Init) !void { 5 + var host: []const u8 = cGetenv("ZDS_HOST") orelse "127.0.0.1"; 5 6 var port: u16 = 2583; 6 7 var db_path: []const u8 = "dev/zds.sqlite3"; 7 - var public_url: ?[]const u8 = null; 8 - var server_did: ?[]const u8 = null; 9 - var plc_directory: ?[]const u8 = null; 8 + var public_url: ?[]const u8 = cGetenv("ZDS_PUBLIC_URL"); 9 + var server_did: ?[]const u8 = cGetenv("ZDS_SERVER_DID"); 10 + var plc_directory: ?[]const u8 = cGetenv("ZDS_PLC_DIRECTORY"); 10 11 var email_from: ?[]const u8 = cGetenv("ZDS_EMAIL_FROM"); 11 12 var resend_api_key: ?[]const u8 = cGetenv("ZDS_RESEND_API_KEY"); 12 13 var blob_upload_limit: ?usize = try envUsize("ZDS_BLOB_UPLOAD_LIMIT"); ··· 25 26 port = try std.fmt.parseInt(u16, value, 10); 26 27 continue; 27 28 } 29 + if (std.mem.eql(u8, arg, "--host")) { 30 + host = args.next() orelse return error.MissingHost; 31 + continue; 32 + } 28 33 if (std.mem.eql(u8, arg, "--db")) { 29 34 db_path = args.next() orelse return error.MissingDatabasePath; 30 35 continue; ··· 64 69 } 65 70 if (std.mem.startsWith(u8, arg, "--port=")) { 66 71 port = try std.fmt.parseInt(u16, arg["--port=".len..], 10); 72 + continue; 73 + } 74 + if (std.mem.startsWith(u8, arg, "--host=")) { 75 + host = arg["--host=".len..]; 67 76 continue; 68 77 } 69 78 if (std.mem.startsWith(u8, arg, "--db=")) { ··· 115 124 if (jwt_secret) |value| zds.core.config.setJwtSecret(value); 116 125 117 126 try zds.storage.store.init(init.io, db_path); 118 - try zds.http.server.listen(init.io, .{ .port = port }); 127 + try zds.http.server.listen(init.io, .{ .host = host, .port = port }); 119 128 } 120 129 121 130 fn usage() void { 122 131 std.debug.print( 123 - \\usage: zds [--port PORT] [--db PATH] [--public-url URL] [--server-did DID] 132 + \\usage: zds [--host HOST] [--port PORT] [--db PATH] [--public-url URL] [--server-did DID] 124 133 \\ [--blob-upload-limit BYTES] [--handle-domains DOMAINS] [--jwt-secret SECRET] 125 134 \\ 126 135 \\Runs a local PDS-shaped HTTP server.