umbrel-apps icon indicating copy to clipboard operation
umbrel-apps copied to clipboard

App Submission: Bassin

Open duckaxe opened this issue 5 months ago • 20 comments

A zero-fee Bitcoin solo mining pool for umbrellOS. Run your own CKPOOL at home.

App Submission

Bassin

...

256x256 SVG icon

app-icon

...

Gallery images

gallery_1 gallery_2 gallery_3
App Screenshots

A zero-fee Bitcoin Solo Mining Pool for your Umbrel.

gallery_1

Every decentralized share counts.

gallery_2

No setup. Just point your miner to Bassin.

gallery_3

...

I have tested my app on:

  • [x] umbrelOS on a Raspberry Pi
  • [ ] umbrelOS on an Umbrel Home
  • [ ] umbrelOS on Linux VM

duckaxe avatar Aug 07 '25 11:08 duckaxe

@al-lac I have already tried it. It's complicated because the CKPOOL (log & json) files and front-end assets must be in the same folder (data/www) and accessible via the same web server.

I noticed that some Umbrel apps include front-end assets. That's why I did it this way. It is and will remain a single-page application. Only the JS and CSS files will change, if at all. Everything else stays the same.

This makes things much easier for me.

duckaxe avatar Aug 12 '25 12:08 duckaxe

Hey @duckaxe, ok got it. Lets see what @nmfretz has to say about it.

Usually it is fine to just have some simple html files in there, but once we go into javascript and other logic we have to think about what makes sense here.

al-lac avatar Aug 12 '25 12:08 al-lac

Thank you for response, @al-lac Then waiting for @nmfretz

duckaxe avatar Aug 12 '25 12:08 duckaxe

@al-lac I found a way to extract the user interface into a docker image. It's much cleaner now ;) I also updated the gallery images.

duckaxe avatar Aug 13 '25 17:08 duckaxe

Awesome work @duckaxe! 🚀

I made some adaptions to the description formatting and removed the leftover directory.

al-lac avatar Aug 14 '25 08:08 al-lac

@al-lac Thanks for that. You added awaiting gallery assets flag - I already provided all ready2go gallery assets. Do we need more?

duckaxe avatar Aug 14 '25 09:08 duckaxe

Hey @duckaxe, really great work on those assets! 🔥

I added the label as there is usually a final design check and possible adaptions before apps make it to the store.

But don't worry, does not take too long usually!

al-lac avatar Aug 14 '25 10:08 al-lac

❤️

duckaxe avatar Aug 14 '25 10:08 duckaxe

But don't worry, does not take too long usually!

Hope it happens soon.

duckaxe avatar Sep 07 '25 07:09 duckaxe

@al-lac Thank you for your comments.

  1. My knowledge in this area is limited. Unfortunately, I have no idea how to solve this problem.
  2. The loading indicator is a kind of fallback for all cases where something goes wrong. A generic error message would not help the user. The note “Blockchain must be synchronized” is included in the app description & FAQ.

I would deploy the current version and wait for user feedback to see how many users have a problem with it.

duckaxe avatar Oct 11 '25 08:10 duckaxe

@al-lac Thank you very much for improvements. I didn't remove the container_name: bassin_www_1 because the dashboard widget doesn't work after removing this line. I have adopted other suggestions.

duckaxe avatar Oct 13 '25 16:10 duckaxe

Hey @duckaxe, thanks a lot for making the adaptions! 👍

Really weird that it does not work without the container_name: bassin_www_1, maybe something going wrong with DNS.

Did you also check the issue with the ckpool image? Did not see a change here, so the app would still be broken on some amd64 devices.

al-lac avatar Oct 15 '25 10:10 al-lac

@al-lac the ckpool image was created by using the following command where amd64 is included: docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/duckaxe/ckpool-solo:main --push .

https://github.com/duckaxe/ckpool-solo

duckaxe avatar Oct 15 '25 12:10 duckaxe

Hey @duckaxe,

Ok got it!

I think you would need to do something like this to make it compatible with processors that do not support AVX2.

Edit Dockerfile:

ARG CFLAGS=""
ARG CXXFLAGS=""

# Later:
RUN ./autogen.sh && \
    ./configure CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" && \
    make

Build command:

docker buildx build --platform linux/amd64,linux/arm64 \   --build-arg CFLAGS="-O2 -march=x86-64 -mtune=generic" \   --build-arg CXXFLAGS="-O2 -march=x86-64 -mtune=generic" \   -t ghcr.io/…:main --push .

But really not sure if that would work out, don't have a lot of experience with that either. Maybe this is also something that has already been solved upstream or should be noted there.

al-lac avatar Oct 15 '25 15:10 al-lac

@al-lac No chance to create an image if the flag contains “-march=x86-64”; Docker kept crashing. However, I tried something else and created a new image. On GitHub, you can see that it is definitely a multi-OS for both platforms.

duckaxe avatar Oct 16 '25 10:10 duckaxe

Hey @duckaxe, thanks for putting in the effort to try to fix this! 🙌

We will try it with the new image and let you know if it works now.

al-lac avatar Oct 16 '25 13:10 al-lac

Hey @duckaxe thanks for the hard work to bring Bassin on the app store! This looks like a really great addition.

I've given this a test as well, and the avx2 instruction set issue that @al-lac mentioned is a deal-breaker which needs to be resolved before we go live.

The current ckpool image that you're building is indeed multi-architecture (amd64 + arm64), however it looks like the amd64 image is somehow built to REQUIRE the avx2 instruction set. This means that for any users running umbrelOS on an amd64 machine whose CPU doesn't support the avx2 instruction set, the app will be broken. This will be the case for thousands of umbrelOS users, not just an edge-case.

As an example, when I go to install the app on an Umbrel Home with a N5105 CPU the ckpool container errors out with:

bassin_ckpool_1     | Illegal instruction
bassin_ckpool_1     | Terminated

It may be worth you reaching out the the ckpool devs to see if they already have a solution for this. It should be possible to only use avx2 when it's detected. I think that's the recommended way for most applications to use it (I think that's what Ollama does as an example).

nmfretz avatar Oct 28 '25 02:10 nmfretz

Also @duckaxe, for this:

I didn't remove the container_name: bassin_www_1 because the dashboard widget doesn't work after removing this line. I have adopted other suggestions.

Removing the hardcoded container_name: bassin_www_1 from the compose file in this repo works fine for me. The widget server still communicates correctly. As @al-lac mentioned, umbrelOS will automatically name the www container to bassin_www_1 : https://github.com/getumbrel/umbrel/blob/0f4b0c306749b5307f8fc10cfee29e0f88092625/packages/umbreld/source/modules/apps/app.ts#L115-L117

i.e., umbrelOS itself will add the container_name: bassin_www_1 line to the compose file when the app is installed.

Would you mind testing again to confirm on your end?

nmfretz avatar Oct 28 '25 02:10 nmfretz

@nmfretz Thank you for your reply and for being willing to help me.

Give me another chance. I have now created both images manually and combined them into a multi-image. I have referenced the new image in the compose file.

If that doesn't work, I will close the PR until I have found a solution.

Regarding the container_name: I have just tried it. If I remove the container name, neither the widget nor the UI are accessible.

duckaxe avatar Oct 28 '25 14:10 duckaxe

@nmfretz @al-lac I installed umbrelOS on my Intel Mac (amd64). Bassin runs flawlessly with the latest CKpool image.

duckaxe avatar Oct 31 '25 19:10 duckaxe

Hey @duckaxe thanks for giving it another shot! The same issue persists unfortunately. Here's a screen recording with sound for you to watch to hopefully help clear things up. Let me know if anything is confusing:

https://github.com/user-attachments/assets/cc4212dd-2af9-4763-a09e-23a9a9126339

nmfretz avatar Nov 04 '25 01:11 nmfretz

⚠️   Linting finished with 2 warnings   ⚠️

Thank you for your submission! This is an automated linter that checks for common issues in pull requests to the Umbrel App Store.

Please review the linting results below and make any necessary changes to your submission.

Linting Results

Severity File Description
⚠️ bassin/docker-compose.yml Invalid image tag "latest":
Images should not use the "latest" tag
ℹ️ bassin/docker-compose.yml External port mapping "3456:3333/tcp":
Port mappings may be unnecessary for the app to function correctly. Docker's internal DNS resolves container names to IP addresses within the same network. External access to the web interface is handled by the app_proxy container. Port mappings are only needed if external access is required to a port not proxied by the app_proxy, or if an app needs to expose multiple ports for its functionality (e.g., DHCP, DNS, P2P, etc.).
ℹ️ bassin/docker-compose.yml Potentially using unsafe user in service "init":
The default container user "root" can lead to security vulnerabilities. If you are using the root user, please try to specify a different user (e.g. "1000:1000") in the compose file or try to set the UID/PUID and GID/PGID environment variables to 1000.
⚠️ bassin/umbrel-app.yml "icon" and "gallery" needs to be empty for new app submissions:
The "icon" and "gallery" fields must be empty for new app submissions as it is being created by the Umbrel team.

Legend

Symbol Description
Error: This must be resolved before this PR can be merged.
⚠️ Warning: This is highly encouraged to be resolved, but is not strictly mandatory.
ℹ️ Info: This is just for your information.

github-actions[bot] avatar Nov 05 '25 10:11 github-actions[bot]

@nmfretz I have found a solution. I am using the ckPool image, which I have previously used in the community app and which is compatible with all architectures. This solves the problem.

Sorry for the inconvenience. I hope that all the issues have now been resolved.

duckaxe avatar Nov 05 '25 10:11 duckaxe

@nmfretz I have found a solution. I am using the ckPool image, which I have previously used in the community app and which is compatible with all architectures. This solves the problem.

Excellent, working great for me! It's very likely that image is built to optionally use avx2 when it is available.

Let's get Bassin to the official app store 🚀. @al-lac this is good to go after a final look through and gallery assets are finalized.

nmfretz avatar Nov 06 '25 01:11 nmfretz

@nmfretz Awesome, thank you! @al-lac Regarding gallery assets: Yesterday I made a few adjustments (just replaced the bitcoin address by a dummy address to avoid any misunderstandings). If you have time, feel free to update them. Thanks!

duckaxe avatar Nov 06 '25 06:11 duckaxe

@al-lac The assets update isn't important. I prefer to merge Bassin now instead of waiting for assets update. Thank you.

duckaxe avatar Nov 13 '25 06:11 duckaxe

Hey @duckaxe, thanks for all the effort you put into this app, we appreciate it a lot! 🥇

Did a final test, everything works well. We can finally go live now! 🚀

CleanShot 2025-11-14 at 15 24 35@2x

al-lac avatar Nov 14 '25 14:11 al-lac

@al-lac @nmfretz Thank you for your patience, time, and fantastic support!

duckaxe avatar Nov 14 '25 16:11 duckaxe

Hey @duckaxe, great work again on Bassin! I've been having fun with it recently. Love that you have the best share shown in the widget which I have an addiction to checking.

Would you be okay to change the coinbase tag to something like mined by Bassin on Umbrel? Currently Public Pool does Public Pool on Umbrel and DATUM does DATUM on Umbrel. It's a pretty great feeling for the community when it's clear that it was a little guy running an Umbrel that mined a block.

nmfretz avatar Dec 05 '25 00:12 nmfretz

@nmfretz Good idea. I'm planning a new release for the next days, so I can easily adjust the btcsig.

duckaxe avatar Dec 05 '25 19:12 duckaxe