DB Errors on Startup #26

Closed
opened 2026-10-04 23:09:23 +02:00 by adam · 8 comments
Owner

Small problem during step:
docker compose --profile migrate run --rm db-migrate

Problem because folder data is created as root:root there are some errors at the end of installation (see result).
With some inspiration by previous similar issue the solution to solve this is:

sudo chmod -R 770 .
sudo chown -R <user>:root .

And rerun this step.
However next step:
docker compose --profile seed run --rm seed
is now returning:
service "seed" depends on undefined service "db-migrate": invalid compose project
Not able to solve this one yet but it looks it can also be ignored and after the following two steps I am collecting data:

docker compose --profile core up -d
docker compose --profile receiver up -d

Thanks, wish that more can deliver such a solid docker setup.

Other observations:

  • System now collecting msg (public and #test), but with -1 hour time difference, potentially standard I am myself on CET. Still need to check which channels are available on companion. From field info in Messages is always Public despite this should be also #test?
  • System does not collect adverts or clients at the moment. tiny bit clueless. Solved with flash erase companion.
  • Locations not visible on map: none have coordinates, but coordinates can be found in DB and MQTT-topic

RESULT:

Traceback (most recent call last):
  File "/opt/venv/bin/meshcore-hub", line 7, in <module>
    sys.exit(main())
             ~~~~^^
  File "/opt/venv/lib/python3.13/site-packages/meshcore_hub/__main__.py", line 269, in main
    cli()
    ~~~^^
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1485, in __call__
    return self.main(*args, **kwargs)
           ~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1406, in main
    rv = self.invoke(ctx)
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1269, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 824, in invoke
    return callback(*args, **kwargs)
  File "/opt/venv/lib/python3.13/site-packages/meshcore_hub/__main__.py", line 86, in db_upgrade
    command.upgrade(alembic_cfg, revision)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/alembic/command.py", line 483, in upgrade
    script.run_env()
    ~~~~~~~~~~~~~~^^
  File "/opt/venv/lib/python3.13/site-packages/alembic/script/base.py", line 545, in run_env
    util.load_python_file(self.dir, "env.py")
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
    module = load_module_py(module_id, path)
  File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 1023, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/app/alembic/env.py", line 97, in <module>
    run_migrations_online()
    ~~~~~~~~~~~~~~~~~~~~~^^
  File "/app/alembic/env.py", line 75, in run_migrations_online
    configuration["sqlalchemy.url"] = get_database_url()
                                      ~~~~~~~~~~~~~~~~^^
  File "/app/alembic/env.py", line 38, in get_database_url
    db_path.parent.mkdir(parents=True, exist_ok=True)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/pathlib/_local.py", line 722, in mkdir
    os.mkdir(self, mode)
    ~~~~~~~~^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/data/collector'
Small problem during step: docker compose --profile migrate run --rm db-migrate Problem because folder `data` is created as root:root there are some errors at the end of installation (see result). With some inspiration by previous similar issue the solution to solve this is: ``` sudo chmod -R 770 . sudo chown -R <user>:root . ``` And rerun this step. However next step: docker compose --profile seed run --rm seed is now returning: `service "seed" depends on undefined service "db-migrate": invalid compose project` Not able to solve this one yet but it looks it can also be ignored and after the following two steps I am collecting data: ``` docker compose --profile core up -d docker compose --profile receiver up -d ``` Thanks, wish that more can deliver such a solid docker setup. Other observations: - System now collecting msg (public and #test), but with -1 hour time difference, potentially standard I am myself on CET. Still need to check which channels are available on companion. From field info in Messages is always `Public` despite this should be also `#test`? - ~~System does not collect adverts or clients at the moment. tiny bit clueless.~~ Solved with flash erase companion. - Locations not visible on map: none have coordinates, but coordinates can be found in DB and MQTT-topic RESULT: ``` Traceback (most recent call last): File "/opt/venv/bin/meshcore-hub", line 7, in <module> sys.exit(main()) ~~~~^^ File "/opt/venv/lib/python3.13/site-packages/meshcore_hub/__main__.py", line 269, in main cli() ~~~^^ File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1485, in __call__ return self.main(*args, **kwargs) ~~~~~~~~~^^^^^^^^^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1406, in main rv = self.invoke(ctx) File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 1269, in invoke return ctx.invoke(self.callback, **ctx.params) ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/click/core.py", line 824, in invoke return callback(*args, **kwargs) File "/opt/venv/lib/python3.13/site-packages/meshcore_hub/__main__.py", line 86, in db_upgrade command.upgrade(alembic_cfg, revision) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/alembic/command.py", line 483, in upgrade script.run_env() ~~~~~~~~~~~~~~^^ File "/opt/venv/lib/python3.13/site-packages/alembic/script/base.py", line 545, in run_env util.load_python_file(self.dir, "env.py") ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file module = load_module_py(module_id, path) File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py spec.loader.exec_module(module) # type: ignore ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ File "<frozen importlib._bootstrap_external>", line 1023, in exec_module File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "/app/alembic/env.py", line 97, in <module> run_migrations_online() ~~~~~~~~~~~~~~~~~~~~~^^ File "/app/alembic/env.py", line 75, in run_migrations_online configuration["sqlalchemy.url"] = get_database_url() ~~~~~~~~~~~~~~~~^^ File "/app/alembic/env.py", line 38, in get_database_url db_path.parent.mkdir(parents=True, exist_ok=True) ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/pathlib/_local.py", line 722, in mkdir os.mkdir(self, mode) ~~~~~~~~^^^^^^^^^^^^ PermissionError: [Errno 13] Permission denied: '/data/collector' ``` <!-- github-sync-id:3833253783 -->
adam closed this issue 2026-10-04 23:09:23 +02:00
Author
Owner

Thanks for reporting the issue.

I'll take a look at the Docker Compose service dependency tree. We recently removed the seed service from running by default as it destructive (overwrites all tags).

The node map issue is currently by design but will hopefully be fixed soon. We initially wanted to show our own nodes only and to do that you have to assign lat/lon node tags for them to display.

We recently agreed to use the GPS coordinates we already track to display all nodes but with a filter for "tag only" nodes.

Hopefully will get a chance to look at the issues in the next couple of weeks.

Thanks for reporting the issue. I'll take a look at the Docker Compose service dependency tree. We recently removed the seed service from running by default as it destructive (overwrites all tags). The node map issue is currently by design but will hopefully be fixed soon. We initially wanted to show our own nodes only and to do that you have to assign lat/lon node tags for them to display. We recently agreed to use the GPS coordinates we already track to display all nodes but with a filter for "tag only" nodes. Hopefully will get a chance to look at the issues in the next couple of weeks. <!-- github-comment-id:3797139608 -->
Author
Owner

I've just merged #71 which addresses a few Docker Compose issues. I've fixed the seed services unnecessary dependency on the db-migrate service.

However, a bigger change is that I've switched the main storage for the hub database to be a Docker managed volume instead of a bind-mount.

You can copy an existing data directory (data/collector/meshcore.db) into the new Docker volume with a command like this:

docker run --rm -v "$(pwd)/data:/src:ro" -v meshcore_hub_data:/dest alpine cp -a /src/. /dest/

There isn't really a cleaner solution that doesn't involve passing in local UID/GIDs into the Docker setup.

The changes are currently on main branch and :main container tags. I'll leave this issue open for a couple of weeks for any feedback.

I've just merged #71 which addresses a few Docker Compose issues. I've fixed the `seed` services unnecessary dependency on the `db-migrate` service. However, a bigger change is that I've switched the main storage for the hub database to be a Docker managed volume instead of a bind-mount. You can copy an existing `data` directory (`data/collector/meshcore.db`) into the new Docker volume with a command like this: ```bash docker run --rm -v "$(pwd)/data:/src:ro" -v meshcore_hub_data:/dest alpine cp -a /src/. /dest/ ``` There isn't really a cleaner solution that doesn't involve passing in local UID/GIDs into the Docker setup. The changes are currently on `main` branch and `:main` container tags. I'll leave this issue open for a couple of weeks for any feedback. <!-- github-comment-id:3814162127 -->
Author
Owner

May I play the role as ignorant user, a role that suits me best?

I wonder why the standard (non-developer) user needs to start with:

git clone https://github.com/ipnet-mesh/meshcore-hub.git
cd meshcore-hub

Where the docker file is picking up from github?
image: ghcr.io/ipnet-mesh/meshcore-hub:${IMAGE_VERSION:-latest}

In this respect the user only needs the latest docker and .env.local files and tweak it with specific settings like USB-poort.


Following the instructions of Updating an Existing Installation the first step git pull is creating errors:

wj4nuc@nuc5i5ryh:/opt/meshcore-hub$ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 97 (delta 56), reused 82 (delta 44), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 19.76 KiB | 652.00 KiB/s, done.
From https://github.com/ipnet-mesh/meshcore-hub
   3c7a898..3132d29  main       -> origin/main
 * [new tag]         v0.5.4     -> v0.5.4
Updating 3c7a898..3132d29
error: Your local changes to the following files would be overwritten by merge:
        .github/workflows/ci.yml
        src/meshcore_hub/api/routes/nodes.py
        src/meshcore_hub/web/app.py
        src/meshcore_hub/web/routes/nodes.py
        tests/test_api/test_nodes.py
        tests/test_web/conftest.py
        tests/test_web/test_nodes.py
Please commit your changes or stash them before you merge.
Aborting

My assumption is to deleted these files and redo this step, I will continue with this assumption.
Doing so, step now works.


in between step docker run --rm -v "$(pwd)/data:/src:ro" -v meshcore_hub_data:/dest alpine cp -a /src/. /dest/ Ok (maybe to early?)


step docker compose --profile all pull gives:

 ! db-migrate Warning                                                            Head "https://ghcr.io/v2/ipnet-mesh/meshcore-hub/manifests/latest": unauthorize...                     0.4s 
WARNING: Some service image(s) must be built from source by running:
    docker compose build db-migrate
1 error occurred:
        * Error response from daemon: Head "https://ghcr.io/v2/ipnet-mesh/meshcore-hub/manifests/latest": unauthorized

The extra advised step docker compose build db-migrate goes into error

 => ERROR [db-migrate builder 9/9] RUN sed -i "s|__version__ = "dev"|__version__ = "dev"|" src/meshcore_hub/_version.py &&     pip install --upgrade pip &&     pip install .           0.2s
------                                                                                                                                                                                       
 > [db-migrate builder 9/9] RUN sed -i "s|__version__ = "dev"|__version__ = "dev"|" src/meshcore_hub/_version.py &&     pip install --upgrade pip &&     pip install .:
0.187 sed: can't read src/meshcore_hub/_version.py: No such file or directory
------
failed to solve: process "/bin/sh -c sed -i \"s|__version__ = \\\"dev\\\"|__version__ = \\\"${BUILD_VERSION}\\\"|\" src/meshcore_hub/_version.py &&     pip install --upgrade pip &&     pip install ." did not complete successfully: exit code: 2

Ignored, correct?


Step docker compose --profile core up -d --force-recreate gives this warning:
WARN[0000] volume "meshcore_hub_data" already exists but was not created by Docker Compose. Use external: true to use an existing volume

Ignore or ....?


In it still working? Yes, still see new adverts/messages and hope for upcoming changes like split channels and a filled map. And need to check SQlite how access the the DB.

Additional info:
Docker version: 27.3.1
Ubuntu 24.04.3 LTS
normally I use compose.yml and not docker compose.yml; both were active in step docker compose --profile all pull giving a different warning WARNING: Some service image(s) must be built from source by running: docker compose build collector. Did a redo of this step with the correct compose active.

May I play the role as ignorant user, a role that suits me best? I wonder why the standard (non-developer) user needs to start with: ``` git clone https://github.com/ipnet-mesh/meshcore-hub.git cd meshcore-hub ``` Where the docker file is picking up from github? ` image: ghcr.io/ipnet-mesh/meshcore-hub:${IMAGE_VERSION:-latest}` In this respect the user only needs the latest docker and .env.local files and tweak it with specific settings like USB-poort. -------------------------------------------------------------------------------------------------------------------------------- Following the instructions of `Updating an Existing Installation` the first step `git pull` is creating errors: ``` wj4nuc@nuc5i5ryh:/opt/meshcore-hub$ git pull remote: Enumerating objects: 97, done. remote: Counting objects: 100% (97/97), done. remote: Compressing objects: 100% (40/40), done. remote: Total 97 (delta 56), reused 82 (delta 44), pack-reused 0 (from 0) Unpacking objects: 100% (97/97), 19.76 KiB | 652.00 KiB/s, done. From https://github.com/ipnet-mesh/meshcore-hub 3c7a898..3132d29 main -> origin/main * [new tag] v0.5.4 -> v0.5.4 Updating 3c7a898..3132d29 error: Your local changes to the following files would be overwritten by merge: .github/workflows/ci.yml src/meshcore_hub/api/routes/nodes.py src/meshcore_hub/web/app.py src/meshcore_hub/web/routes/nodes.py tests/test_api/test_nodes.py tests/test_web/conftest.py tests/test_web/test_nodes.py Please commit your changes or stash them before you merge. Aborting ``` My assumption is to deleted these files and redo this step, I will continue with this assumption. Doing so, step now works. -------------------------------------------------------------------------------------------------------------------------------- in between step `docker run --rm -v "$(pwd)/data:/src:ro" -v meshcore_hub_data:/dest alpine cp -a /src/. /dest/` Ok (maybe to early?) -------------------------------------------------------------------------------------------------------------------------------- step `docker compose --profile all pull` gives: ``` ! db-migrate Warning Head "https://ghcr.io/v2/ipnet-mesh/meshcore-hub/manifests/latest": unauthorize... 0.4s WARNING: Some service image(s) must be built from source by running: docker compose build db-migrate 1 error occurred: * Error response from daemon: Head "https://ghcr.io/v2/ipnet-mesh/meshcore-hub/manifests/latest": unauthorized ``` -------------------------------------------------------------------------------------------------------------------------------- The extra advised step `docker compose build db-migrate` goes into error ```txt => ERROR [db-migrate builder 9/9] RUN sed -i "s|__version__ = "dev"|__version__ = "dev"|" src/meshcore_hub/_version.py && pip install --upgrade pip && pip install . 0.2s ------ > [db-migrate builder 9/9] RUN sed -i "s|__version__ = "dev"|__version__ = "dev"|" src/meshcore_hub/_version.py && pip install --upgrade pip && pip install .: 0.187 sed: can't read src/meshcore_hub/_version.py: No such file or directory ------ failed to solve: process "/bin/sh -c sed -i \"s|__version__ = \\\"dev\\\"|__version__ = \\\"${BUILD_VERSION}\\\"|\" src/meshcore_hub/_version.py && pip install --upgrade pip && pip install ." did not complete successfully: exit code: 2 ``` Ignored, correct? -------------------------------------------------------------------------------------------------------------------------------- Step `docker compose --profile core up -d --force-recreate` gives this warning: `WARN[0000] volume "meshcore_hub_data" already exists but was not created by Docker Compose. Use `external: true` to use an existing volume` Ignore or ....? -------------------------------------------------------------------------------------------------------------------------------- In it still working? Yes, still see new adverts/messages and hope for upcoming changes like split channels and a filled map. And need to check SQlite how access the the DB. Additional info: Docker version: 27.3.1 Ubuntu 24.04.3 LTS normally I use `compose.yml` and not `docker compose.yml`; both were active in step `docker compose --profile all pull` giving a different warning `WARNING: Some service image(s) must be built from source by running: docker compose build collector`. Did a redo of this step with the correct compose active. <!-- github-comment-id:3816959595 -->
Author
Owner

Technically as an end user, you should only need the compose file and to create the .env file.

However the Compose file is dual purpose, if you "pull" and then "up -d", you'll pull the images from GHCR but it also can build locally (for development and testing).

The Git Pull error you saw appears to show that you had made modifications to the actual source code. You can "stash" these but ultimately you shouldn't need to modify the source code.

I will attempt a fresh install on a clean environment and investigate the compose process thoroughly.

Technically as an end user, you should only need the compose file and to create the .env file. However the Compose file is dual purpose, if you "pull" and then "up -d", you'll pull the images from GHCR but it also can build locally (for development and testing). The Git Pull error you saw appears to show that you had made modifications to the actual source code. You can "stash" these but ultimately you shouldn't need to modify the source code. I will attempt a fresh install on a clean environment and investigate the compose process thoroughly. <!-- github-comment-id:3819413612 -->
Author
Owner

I did the same and was successful after I solved two minor problems but perhaps you want to add them.

  1. Because DB already exist as a volume but created differently it is suggesting to add " external: true" on this volume.
  2. Because I do an automated maintenance on my system, occasionally this includes a reboot. However if multi attached USB-ports are attached they tend to swap ports. This causes a failure. The solution is not to use the USB-port but the name of the device.

Run commando: ls -la /dev/serial/by-id
Result (for me):

lrwxrwxrwx 1 root root  13 Feb  5 10:18 usb-Heltec_HT-n5262_3D3B4D4A4D776001-if00 -> ../../ttyACM0
lrwxrwxrwx 1 root root  13 Feb  5 10:18 usb-RAKwireless_WisCore_RAK4631_Board_F58BA22A157F29A0-if00 -> ../../ttyACM1
lrwxrwxrwx 1 root root  13 Feb  5 10:18 usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 -> ../../ttyUSB0

Line in .env:
SERIAL_PORT=/dev/serial/by-id/usb-Heltec_HT-n5262_3D3B4D4A4D776001-if00

Action not really required if you have 2 USB-ports occupied but only 1 ACM and 1 USB.

Actions I did for renaming docker volume.

docker volume create backup
docker run --rm -v meshcore_hub_data:/from -v backup:/to alpine ash -c "cd /from ; cp -a . /to"
docker volume rm meshcore_hub_data

Thanks for the update, it works like a charm again. When can we expect the split of channel and showing on the map?
(can be closed)

I did the same and was successful after I solved two minor problems but perhaps you want to add them. 1. Because DB already exist as a volume but created differently it is suggesting to add " external: true" on this volume. 2. Because I do an automated maintenance on my system, occasionally this includes a reboot. However if multi attached USB-ports are attached they tend to swap ports. This causes a failure. The solution is not to use the USB-port but the name of the device. Run commando: ls -la /dev/serial/by-id Result (for me): ``` lrwxrwxrwx 1 root root 13 Feb 5 10:18 usb-Heltec_HT-n5262_3D3B4D4A4D776001-if00 -> ../../ttyACM0 lrwxrwxrwx 1 root root 13 Feb 5 10:18 usb-RAKwireless_WisCore_RAK4631_Board_F58BA22A157F29A0-if00 -> ../../ttyACM1 lrwxrwxrwx 1 root root 13 Feb 5 10:18 usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 -> ../../ttyUSB0 ``` Line in .env: `SERIAL_PORT=/dev/serial/by-id/usb-Heltec_HT-n5262_3D3B4D4A4D776001-if00` Action not really required if you have 2 USB-ports occupied but only 1 ACM and 1 USB. Actions I did for renaming docker volume. ``` docker volume create backup docker run --rm -v meshcore_hub_data:/from -v backup:/to alpine ash -c "cd /from ; cp -a . /to" docker volume rm meshcore_hub_data ``` Thanks for the update, it works like a charm again. When can we expect the split of channel and showing on the map? (can be closed) <!-- github-comment-id:3853243555 -->
Author
Owner

Thanks for the reply. Glad its working a bit better for you now. I will update the docs with the /dev/serial/by-id pattern, and will add the external: true label to the data volume.

I'll leave this issue open until I've resolved those.

Showing nodes on the map will be coming soon, its a sizeable change, so will need some planning and testing.

Thanks for the reply. Glad its working a bit better for you now. I will update the docs with the `/dev/serial/by-id` pattern, and will add the `external: true` label to the data volume. I'll leave this issue open until I've resolved those. Showing nodes on the map will be coming soon, its a sizeable change, so will need some planning and testing. <!-- github-comment-id:3860151865 -->
Author
Owner

external: true label looks only required when the docker com.docker.compose.project <> meshcore-hub
I not a star with docker but I did not changed this in your present docker-compose.

My second test was BTW a clean test with only your compose and my details in .env in my folder, worked perfectly.

Your extra collector level puzzled in combination with a volume when I wanted to get access with SQlite, but again educational.:D

external: true label looks only required when the docker `com.docker.compose.project <> meshcore-hub` I not a star with docker but I did not changed this in your present docker-compose. My second test was BTW a clean test with only your compose and my details in .env in my folder, worked perfectly. Your extra collector level puzzled in combination with a volume when I wanted to get access with SQlite, but again educational.:D <!-- github-comment-id:3860249600 -->
Author
Owner

I've updated the README with the /dev/serial/by-id tip. Closing this issue then. Thanks for the feedback.

I've updated the README with the `/dev/serial/by-id` tip. Closing this issue then. Thanks for the feedback. <!-- github-comment-id:3861835325 -->
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: adam/meshcore-hub#26