From 1d727c1fcf6725cdcf0c62c39f11bf1c4e197378 Mon Sep 17 00:00:00 2001
From: osmaczko <33099791+osmaczko@users.noreply.github.com>
Date: Fri, 13 Feb 2026 20:44:50 +0100
Subject: [PATCH 1/4] chore: add smoke test and redesign CI workflow (#62)
Add a smoke test that validates the binary links all dependencies
at runtime by instantiating a client without networking. Redesign
CI into separate build and test jobs, with test gated on build.
---
.github/workflows/ci.yml | 106 +++++++++++++++++++++++++++++
.github/workflows/test-windows.yml | 76 ---------------------
.github/workflows/test.yml | 23 -------
Makefile | 2 +-
library/declare_lib.nim | 2 +-
nim_chat_poc.nimble | 11 +--
tests/smoke_test.nim | 21 ++++++
7 files changed, 135 insertions(+), 106 deletions(-)
create mode 100644 .github/workflows/ci.yml
delete mode 100644 .github/workflows/test-windows.yml
delete mode 100644 .github/workflows/test.yml
create mode 100644 tests/smoke_test.nim
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..c17caac
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,106 @@
+name: ci
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths-ignore:
+ - "**README.md"
+ - ".gitignore"
+ - "LICENSE"
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macOS-latest]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ submodules: recursive
+ # Cache the Nim compiler built by nimbus-build-system (NBS).
+ # Building Nim from source is the slowest part of `make update`.
+ # Keyed on the NBS submodule commit — auto-invalidates when NBS is bumped.
+ - id: nbs
+ run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT
+ - uses: actions/cache@v4
+ with:
+ path: vendor/nimbus-build-system/vendor/Nim
+ key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }}
+ - run: make update
+ - run: make all
+
+ test:
+ needs: build
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macOS-latest]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ submodules: recursive
+ - id: nbs
+ run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT
+ - uses: actions/cache@v4
+ with:
+ path: vendor/nimbus-build-system/vendor/Nim
+ key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }}
+ - run: make update
+ - run: make tests
+
+ test-windows:
+ needs: build
+ runs-on: windows-latest
+ defaults:
+ run:
+ shell: msys2 {0}
+ env:
+ MSYSTEM: MINGW64
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ submodules: recursive
+ - uses: msys2/setup-msys2@v2
+ with:
+ update: true
+ install: >-
+ git
+ base-devel
+ mingw-w64-x86_64-toolchain
+ make
+ cmake
+ upx
+ mingw-w64-x86_64-rust
+ mingw-w64-x86_64-postgresql
+ mingw-w64-x86_64-gcc
+ mingw-w64-x86_64-gcc-libs
+ mingw-w64-x86_64-libwinpthread-git
+ mingw-w64-x86_64-zlib
+ mingw-w64-x86_64-openssl
+ mingw-w64-x86_64-python
+ mingw-w64-x86_64-cmake
+ mingw-w64-x86_64-llvm
+ mingw-w64-x86_64-clang
+ - run: |
+ echo "/usr/bin:$PATH" >> $GITHUB_PATH
+ echo "/mingw64/bin:$PATH" >> $GITHUB_PATH
+ echo "/usr/lib:$PATH" >> $GITHUB_PATH
+ echo "/mingw64/lib:$PATH" >> $GITHUB_PATH
+ - run: which upx gcc g++ make cmake cargo rustc python make mingw32-make
+ - id: nbs
+ run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT
+ shell: bash
+ - uses: actions/cache@v4
+ with:
+ path: vendor/nimbus-build-system/vendor/Nim
+ key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }}
+ - run: make update
+ - run: |
+ cd vendor/nwaku/vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc
+ make -f Makefile.mingw CC=gcc CXX=g++ libminiupnpc.a V=1
+ - run: |
+ cd vendor/nwaku/vendor/nim-nat-traversal/vendor/libnatpmp-upstream
+ make CC="gcc -fPIC -D_WIN32_WINNT=0x0600 -DNATPMP_STATICLIB" libnatpmp.a V=1
+ - run: make tests
diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml
deleted file mode 100644
index bfc142c..0000000
--- a/.github/workflows/test-windows.yml
+++ /dev/null
@@ -1,76 +0,0 @@
-name: test-windows
-
-on:
- pull_request:
- branches:
- - main
- paths-ignore:
- - '**README.md'
- - '.gitignore'
- - 'LICENSE'
-jobs:
- tests-tasks:
- runs-on: windows-latest
-
- defaults:
- run:
- shell: msys2 {0}
-
- env:
- MSYSTEM: MINGW64
-
- steps:
- - name: Checkout
- uses: actions/checkout@v6
-
- - name: Setup MSYS2
- uses: msys2/setup-msys2@v2
- with:
- update: true
- install: >-
- git
- base-devel
- mingw-w64-x86_64-toolchain
- make
- cmake
- upx
- mingw-w64-x86_64-rust
- mingw-w64-x86_64-postgresql
- mingw-w64-x86_64-gcc
- mingw-w64-x86_64-gcc-libs
- mingw-w64-x86_64-libwinpthread-git
- mingw-w64-x86_64-zlib
- mingw-w64-x86_64-openssl
- mingw-w64-x86_64-python
- mingw-w64-x86_64-cmake
- mingw-w64-x86_64-llvm
- mingw-w64-x86_64-clang
-
- - name: Add UPX to PATH
- run: |
- echo "/usr/bin:$PATH" >> $GITHUB_PATH
- echo "/mingw64/bin:$PATH" >> $GITHUB_PATH
- echo "/usr/lib:$PATH" >> $GITHUB_PATH
- echo "/mingw64/lib:$PATH" >> $GITHUB_PATH
-
- - name: Verify dependencies
- run: |
- which upx gcc g++ make cmake cargo rustc python make mingw32-make
-
- - name: Update
- run: make update
-
- - name: Building miniupnpc
- run: |
- cd vendor/nwaku/vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc
- make -f Makefile.mingw CC=gcc CXX=g++ libminiupnpc.a V=1
- cd ../../../../../../..
-
- - name: Building libnatpmp
- run: |
- cd vendor/nwaku/vendor/nim-nat-traversal/vendor/libnatpmp-upstream
- make CC="gcc -fPIC -D_WIN32_WINNT=0x0600 -DNATPMP_STATICLIB" libnatpmp.a V=1
- cd ../../../../../../
-
- - name: Tests
- run: make tests
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index 46f55d1..0000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: test
-
-on:
- pull_request:
- branches:
- - main
- paths-ignore:
- - '**README.md'
- - '.gitignore'
- - 'LICENSE'
-jobs:
- tests-tasks:
- strategy:
- matrix:
- os: [ubuntu-latest, macOS-latest]
- runs-on: ${{ matrix.os }}
- steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Update
- run: make update
- - name: Tests
- run: make tests
diff --git a/Makefile b/Makefile
index 3f191d9..d243276 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@ endif
.PHONY: all update clean
# default target, because it's the first one that doesn't start with '.'
-all: | bot_echo pingpong
+all: | bot_echo pingpong liblogoschat
test_file := $(word 2,$(MAKECMDGOALS))
define test_name
diff --git a/library/declare_lib.nim b/library/declare_lib.nim
index 2051f37..3d8573d 100644
--- a/library/declare_lib.nim
+++ b/library/declare_lib.nim
@@ -1,7 +1,7 @@
import ffi
import src/chat/client
-declareLibrary("chat")
+declareLibrary("logoschat")
proc set_event_callback(
ctx: ptr FFIContext[ChatClient],
diff --git a/nim_chat_poc.nimble b/nim_chat_poc.nimble
index 33510e6..04eaf01 100644
--- a/nim_chat_poc.nimble
+++ b/nim_chat_poc.nimble
@@ -39,17 +39,17 @@ proc buildLibrary(name: string, srcDir = "library/", params = "", lang = "c") =
## Build a shared library (.so on Linux, .dylib on macOS, .dll on Windows)
if not dirExists "build":
mkDir "build"
-
+
# Determine library extension based on OS
let libExt = when defined(macosx): "dylib"
elif defined(windows): "dll"
else: "so"
-
+
var extra_params = params
for i in 2 ..< paramCount():
extra_params &= " " & paramStr(i)
-
- exec "nim " & lang & " --app:lib --out:build/lib" & name & "." & libExt &
+
+ exec "nim " & lang & " --app:lib --out:build/lib" & name & "." & libExt &
" --mm:refc --nimMainPrefix:lib" & name & " " & extra_params & " " &
srcDir & "lib" & name & ".nim"
@@ -59,6 +59,7 @@ proc test(name: string, params = "-d:chronicles_log_level=DEBUG", lang = "c") =
task tests, "Build & run tests":
test "all_tests", "-d:chronicles_log_level=ERROR -d:chronosStrictException"
+ test "smoke_test", "-d:chronicles_log_level=ERROR"
task waku_example, "Build Waku based simple example":
let name = "waku_example"
@@ -77,5 +78,5 @@ task pingpong, "Build the Pingpong example":
buildBinary name, "examples/", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' "
task liblogoschat, "Build the Chat SDK shared library (C bindings)":
- buildLibrary "logoschat", "library/",
+ buildLibrary "logoschat", "library/",
"-d:chronicles_log_level='INFO' -d:chronicles_enabled=on --path:src --path:vendor/nim-ffi"
diff --git a/tests/smoke_test.nim b/tests/smoke_test.nim
new file mode 100644
index 0000000..288df6a
--- /dev/null
+++ b/tests/smoke_test.nim
@@ -0,0 +1,21 @@
+# Smoke test: validates that the binary links all dependencies at runtime.
+# No networking, no start(), no message exchange — just instantiation.
+
+import ../src/chat
+
+proc main() =
+ try:
+ let waku = initWakuClient(DefaultConfig())
+ let ident = createIdentity("SmokeTest")
+ var client = newClient(waku, ident)
+ if client.isNil:
+ raise newException(CatchableError, "newClient returned nil")
+ let id = client.getId()
+ echo "smoke_test: OK (client id: " & id & ")"
+ quit(QuitSuccess)
+ except CatchableError as e:
+ echo "smoke_test: FAILED — " & e.msg
+ quit(QuitFailure)
+
+when isMainModule:
+ main()
From 412909c5d94372f6fe4d2575f9be00b5d811636c Mon Sep 17 00:00:00 2001
From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com>
Date: Thu, 12 Feb 2026 18:10:13 -0800
Subject: [PATCH 2/4] Remove Nim-Chat-POC references
---
.gitignore | 4 ++--
DEVELOPING.md | 12 ++++++------
Makefile | 20 ++++++++++----------
nim_chat_poc.nimble => logos_chat.nimble | 4 ++--
4 files changed, 20 insertions(+), 20 deletions(-)
rename nim_chat_poc.nimble => logos_chat.nimble (95%)
diff --git a/.gitignore b/.gitignore
index 7fe05ef..d81d275 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
/waku_vibe_template
/waku_vibe_template.dSYM
-/nim_chat_poc
+/logos_chat
*.dSYM
nimble.develop
nimble.paths
@@ -21,7 +21,7 @@ nimble.paths
/tags
# a symlink that can't be added to the repo because of Windows
-/nim_chat_poc.nims
+/logos_chat.nims
# Ignore dynamic, static libs and libtool archive files
*.so
diff --git a/DEVELOPING.md b/DEVELOPING.md
index 32fe621..e707d70 100644
--- a/DEVELOPING.md
+++ b/DEVELOPING.md
@@ -5,9 +5,9 @@
```mermaid
flowchart TD
- NIM("nim-chat-poc
c-bingings, process control, networking")
+ NIM("Logos-Chat
c-bingings, process control, networking")
LIB("libchat
encryption, encoding")
- PROTO("chat_proto
protobufs, language specific types")
+ PROTO("chat-proto
protobufs, language specific types")
LMN("logos-messaging-nim
p2p networking")
@@ -22,13 +22,13 @@ style LMN fill:#fff
## Repositories
-### nim-chat-poc
+### logos-chat
Root of the Logos chat SDK, written in Nim.
Handles async operations and bridges network operations with the cryptographic backend.
**Responsibilities:**
-- C bindings to libchat
+- C bindings to Libchat
- Async execution (Chronos)
- Network integration
@@ -42,12 +42,12 @@ Operates as a pipeline: accepts either encrypted payloads or plaintext content,
- Encoding/decoding
-### logos-messaging-nim
+### logos-message-delivery
P2P networking layer using logos-messaging protocol.
Provides decentralized message transport. This is an external dependency.
-### chat_proto
+### chat-proto
Protobuf definitions.
Defines the protobufs used in the logos-chat protocol and provides generated types for various languages.
\ No newline at end of file
diff --git a/Makefile b/Makefile
index d243276..5fd6c03 100644
--- a/Makefile
+++ b/Makefile
@@ -41,12 +41,12 @@ define test_name
$(shell echo '$(MAKECMDGOALS)' | cut -d' ' -f3-)
endef
-nim_chat_poc.nims:
- ln -s nim_chat_poc.nimble $@
+logos_chat.nims:
+ ln -s logos_chat.nimble $@
update: | update-common
- rm -rf nim_chat_poc.nims && \
- $(MAKE) nim_chat_poc.nims $(HANDLE_OUTPUT)
+ rm -rf logos_chat.nims && \
+ $(MAKE) logos_chat.nims $(HANDLE_OUTPUT)
clean:
rm -rf build
@@ -88,9 +88,9 @@ build-waku-nat:
@echo "Completed building nat-libs"
.PHONY: tests
-tests: | build-waku-librln build-waku-nat nim_chat_poc.nims
+tests: | build-waku-librln build-waku-nat logos_chat.nims
echo -e $(BUILD_MSG) "build/$@" && \
- $(ENV_SCRIPT) nim tests $(NIM_PARAMS) nim_chat_poc.nims
+ $(ENV_SCRIPT) nim tests $(NIM_PARAMS) logos_chat.nims
##########
@@ -98,9 +98,9 @@ tests: | build-waku-librln build-waku-nat nim_chat_poc.nims
##########
# Ensure there is a nimble task with a name that matches the target
-tui bot_echo pingpong: | build-waku-librln build-waku-nat nim_chat_poc.nims
+tui bot_echo pingpong: | build-waku-librln build-waku-nat logos_chat.nims
echo -e $(BUILD_MSG) "build/$@" && \
- $(ENV_SCRIPT) nim $@ $(NIM_PARAMS) --path:src nim_chat_poc.nims
+ $(ENV_SCRIPT) nim $@ $(NIM_PARAMS) --path:src logos_chat.nims
###########
## Library ##
@@ -118,9 +118,9 @@ endif
LIBLOGOSCHAT := build/liblogoschat.$(LIBLOGOSCHAT_EXT)
.PHONY: liblogoschat
-liblogoschat: | build-waku-librln build-waku-nat nim_chat_poc.nims
+liblogoschat: | build-waku-librln build-waku-nat logos_chat.nims
echo -e $(BUILD_MSG) "$(LIBLOGOSCHAT)" && \
- $(ENV_SCRIPT) nim liblogoschat $(NIM_PARAMS) --path:src nim_chat_poc.nims && \
+ $(ENV_SCRIPT) nim liblogoschat $(NIM_PARAMS) --path:src logos_chat.nims && \
echo -e "\n\x1B[92mLibrary built successfully:\x1B[39m" && \
echo " $(shell pwd)/$(LIBLOGOSCHAT)"
diff --git a/nim_chat_poc.nimble b/logos_chat.nimble
similarity index 95%
rename from nim_chat_poc.nimble
rename to logos_chat.nimble
index 04eaf01..7099837 100644
--- a/nim_chat_poc.nimble
+++ b/logos_chat.nimble
@@ -5,7 +5,7 @@ author = "jazzz"
description = "An example of the chat sdk in Nim"
license = "MIT"
srcDir = "src"
-bin = @["nim_chat_poc"]
+bin = @["logos_chat"]
# Dependencies
@@ -75,7 +75,7 @@ task bot_echo, "Build the EchoBot example":
task pingpong, "Build the Pingpong example":
let name = "pingpong"
- buildBinary name, "examples/", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' "
+ buildBinary name, "./", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' "
task liblogoschat, "Build the Chat SDK shared library (C bindings)":
buildLibrary "logoschat", "library/",
From d0f3632bea7e8b6e1e40fe330e39eee296277f5e Mon Sep 17 00:00:00 2001
From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com>
Date: Thu, 12 Feb 2026 18:14:09 -0800
Subject: [PATCH 3/4] Update nimble file.
---
logos_chat.nimble | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/logos_chat.nimble b/logos_chat.nimble
index 7099837..3bb2f09 100644
--- a/logos_chat.nimble
+++ b/logos_chat.nimble
@@ -1,8 +1,8 @@
# Package
version = "0.1.0"
-author = "jazzz"
-description = "An example of the chat sdk in Nim"
+author = "Logos.co"
+description = "LogosChat is a decentralized permissionless messaging protocol."
license = "MIT"
srcDir = "src"
bin = @["logos_chat"]
From 733772c5e574737cb24d0eb04407b96d4a8f8d5e Mon Sep 17 00:00:00 2001
From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com>
Date: Thu, 12 Feb 2026 18:20:18 -0800
Subject: [PATCH 4/4] Remove references to ChatSDK as a product
---
README.md | 2 +-
library/liblogoschat.nim | 4 ++--
logos_chat.nimble | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 746e9b2..0129dc9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Nim Chat POC
+# Logos Chat
This is the technical proof of a modular e2ee chat protocol using Waku. You can find discussion and details [here](https://github.com/waku-org/specs/pull/73)
diff --git a/library/liblogoschat.nim b/library/liblogoschat.nim
index 5d86a6e..f0f87f3 100644
--- a/library/liblogoschat.nim
+++ b/library/liblogoschat.nim
@@ -1,7 +1,7 @@
-## liblogoschat - C bindings for the Chat SDK
+## liblogoschat - C bindings for Logos-Chat
## Main entry point for the shared library
##
-## This library exposes the Chat SDK functionality through a C-compatible FFI interface.
+## This library exposes the chat functionality through a C-compatible FFI interface.
## It uses nim-ffi for thread-safe async request handling.
import std/[json, options]
diff --git a/logos_chat.nimble b/logos_chat.nimble
index 3bb2f09..c281355 100644
--- a/logos_chat.nimble
+++ b/logos_chat.nimble
@@ -77,6 +77,6 @@ task pingpong, "Build the Pingpong example":
let name = "pingpong"
buildBinary name, "./", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' "
-task liblogoschat, "Build the Chat SDK shared library (C bindings)":
- buildLibrary "logoschat", "library/",
+task liblogoschat, "Build the Logos-Chat shared library (C bindings)":
+ buildLibrary "logoschat", "library/",
"-d:chronicles_log_level='INFO' -d:chronicles_enabled=on --path:src --path:vendor/nim-ffi"