UmbrelApps: community app store whatsnext

Electrum Gate, Evolu Relay en Atreides Assets, met de image-recepten in tools/ en de tests in tests/. Begonnen zonder voorgeschiedenis op 09-10-2026.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HarmenandClaude Opus 5.5 committed 2026-10-09 10:40:25 +02:00
commit 85d85a1295
63 files changed
+13987

No files matched your search

Whitespace-only changes.
@@ -0,0 +1,77 @@
# ═══════════════════════════════════════════════════════════════════════════════
# Atreides Assets - je eigen vermogensoverzicht (crypto en edelmetaal), lokaal.
#
# Eén container: de Node-backend serveert de SPA én bezit de database. Het recept
# staat NIET in deze repo maar in `HomeGit/AtreidesAssets` (de Dockerfile in de root
# daar); deze store draagt alleen de app-definitie. Zie het plan Distributie,
# PLAN.md §5a: de scheiding loopt tussen repo's en niet tussen mappen.
#
# Geen `ports:` hier, en dat is het verschil met de andere twee apps in deze
# store. Die publiceren een eigen poort omdat een cliënt zónder browsersessie
# erbij moet (een wallet, een sync-cliënt). Dit is een web-UI en niets anders,
# dus hij hangt volledig achter app_proxy en umbrelOS bepaalt de poort.
# ═══════════════════════════════════════════════════════════════════════════════
services:
# umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet
# wijzen. De hostnaam heeft de vorm <app-id>_<compose-service>_1.
#
# PROXY_AUTH_ADD blijft weg, dus de inlog van umbrelOS staat ervoor. Dat is hier
# de bedoeling: dit is een administratie en niet een dienst voor een cliënt.
app_proxy:
environment:
APP_HOST: whatsnext-atreides-assets_server_1
APP_PORT: 8080
server:
# De digest hoort erbij en niet alleen de tag: een tag kan opnieuw geduwd
# worden en dan draait er iets anders dan hier staat. Staan ze allebei, dan
# bepaalt de digest wat er gehaald wordt en is de tag alleen leesbaarheid.
# Geduwd op 14-09-2026.
#
# DE TAG IS DE VERSIE VAN DE IMAGE EN NIET DIE VAN DE APP. `version` in
# umbrel-app.yml loopt erop vooruit, want dat moet bij élke wijziging omhoog,
# ook als alleen dit bestand verandert; de tag alleen als er een nieuwe image
# is. Vandaar 0.1.1 in het manifest naast 0.1.0 hier.
#
# Er hoort geen build.sh bij deze app, want het recept woont in de
# AssetApp-repo; de toets in tests/test_appstore_vorm.py slaat de
# tag-vergelijking daarom over.
#
# Bij een verhoging: eerst de digest hier wéghalen, dan bouwen en duwen, dan
# de nieuwe erin. Een OUDE digest onder een NIEUWE tag levert stilzwijgend de
# oude image.
image: sc.kamenier-hamer.nl/sysop/atreides-assets:0.2.0@sha256:646fe7a169d9da0bad0df43e249237c88c7641d6c88f52cdd984b88c562d2859
restart: on-failure
# Geen `user:` nodig: de image zet zelf `USER node`. Dat is anders dan bij
# Evolu Relay, waar de image er geen heeft en de compose het per container
# regelt.
environment:
# ZONDER DIT IS DE APP ONBEREIKBAAR. De server bindt op 127.0.0.1 zolang TLS
# én inloggegevens ontbreken, en in een container is dat de loopback van de
# container: app_proxy komt er dan niet bij. De netwerkgrens is hier de
# afwezigheid van een `ports:`-regel plus de proxy, en niet de app zelf.
ASSETAPP_HOST: "0.0.0.0"
# HIER STAAT MET OPZET GEEN `ASSETAPP_PASSWORD`, en dat is een correctie op
# 0.1.0 (14-09-2026). Daar stond `${APP_PASSWORD}`, en dat gaf twee
# problemen tegelijk:
#
# 1. umbrelOS vult die variabele alleen aan een app die er in zijn
# manifest om vraagt, dus hij kwam leeg binnen en de app draaide
# zónder eigen slot;
# 2. en gevuld was ook niet goed geweest. De app leest de omgeving vóór
# het geheimenbestand, dus verbergt hij op Systeem -> Portefeuilles de
# knop om het wachtwoord te wijzigen. Het is dan alleen te veranderen
# door dit bestand aan te passen, en dat is voor een Umbrel-app de
# verkeerde plek.
#
# Het wachtwoord hoort dus in de portefeuille zelf, te zetten op
# Systeem -> Portefeuilles. Daar is het te wijzigen en het gaat mee in de
# back-up van umbrelOS. Tot je het zet, is de inlog van umbrelOS het enige
# slot, en dat beschermt niet tegen een andere app op hetzelfde
# Docker-netwerk.
volumes:
# De INSTALLATIEMAP van de app: active.json, tls/ en één map per
# portefeuille. Alles wat de gebruiker bezit staat hieronder, dus dit is de
# map die in de back-up van umbrelOS hoort.
- ${APP_DATA_DIR}/data/app:/data
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

+97
View File
@@ -0,0 +1,97 @@
# De veldvolgorde hieronder is niet vrij: de packaging-documentatie van de
# officiele appstore schrijft hem voor. Zie de tabel in
# HomeGit/Docs/Referenties/UmbrelApps/Umbrel-appstore-spec.md, en de toets in
# tests/test_appstore_vorm.py die hem vasthoudt.
#
# Wat de spec niet noemt, staat onderaan dit bestand en niet ertussen. Dan is de
# voorgeschreven kop letterlijk goed en hoeft er bij inlevering alleen iets weg.
manifestVersion: 1
id: whatsnext-atreides-assets
category: finance
name: Atreides Assets
version: "0.2.0"
tagline: What you own, on your own machine
description: >-
A portfolio that nobody else gets to read. Every exchange dashboard and every tracking app
answers to someone: it knows what you hold, what you bought it for, and when you moved it.
This one runs on your Umbrel, keeps its database in your app folder, and talks to nothing
you did not point it at.
It tracks crypto and precious metals side by side, in one total. Balances come from two
places and it keeps them apart on purpose: what a wallet actually holds on chain, and what
your own bookkeeping says should be there. When those two drift, the app says so instead of
picking a winner, and shows you the entries behind the difference.
Prices come from providers you choose and configure yourself, with your own API keys. There
is no built-in account, no phone-home, and no analytics. The keys stay on the server side
and never reach your browser.
What it does beyond a list of holdings: a wealth chart over any year you have data for, the
figures you need for the Dutch box 3 declaration, signal charts for those who want them,
and a dashboard you arrange yourself. A Lightning wallet can be connected over NWC or LND
to read its balance.
It also speaks MCP, so an AI assistant you already use can read the administration and
propose entries. Proposals land in a queue and nothing is written until you approve it, and
what the assistant was shown is logged per call.
Your data is a directory: a database file and a secrets file per portfolio. Back it up,
move it to another machine, or keep several administrations side by side and switch between
them. There is no export you have to ask for.
releaseNotes: >-
The first update with real features since the app came to umbrelOS. It upgrades the database
on first start, so make sure your backup is recent before you update.
Every portfolio now has its own base currency, chosen when you create it. Amounts and prices
are shown in that currency throughout, and sources that quote in another currency are
converted on the way in.
Every price now shows where it came from: hover over an amount to see the source and the
date of the price behind it. A booking records the amount you actually paid next to the price
per unit, and a transfer can be marked as a gift. Gaps in the price history are shown per
asset and can be filled by hand or ignored. You choose a price source per asset, and the app
keeps each source within its monthly limit. Eulerpool is added as a source.
The wealth page shows return, realised and unrealised result, and interest and rewards as
income, with an overview per year. Events has a new Accounts tab with the current balance of
every account. Assets can carry notes. System, Health checks the data for problems you can
resolve or accept.
A second look called Glass sits next to the existing one, with new accent colours and a
reworked settings page. The AI connection (MCP) can now also read price data and propose a
price source.
developer: "WhatsNext?"
website: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
dependencies: []
repo: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
support: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/issues
# De poort waarop umbrelOS de web-UI aanbiedt. 3850 en 3851 zijn bezet door de
# twee andere apps in deze store, 3852 is de eigen poort van de relay.
port: 3853
# Leeg laten bij een nieuw pakket; de plaatjes doet het store-team zelf.
gallery: []
path: ""
submitter: "WhatsNext?"
submission: https://sc.kamenier-hamer.nl/sysop/UmbrelApps
# ── Hieronder staat wat de voorgeschreven volgorde niet noemt ────────────────
#
# GEEN defaultPassword, en dat is een correctie op 0.1.0. Deze app heeft wél een
# eigen inlog, maar die hoort bij de portefeuille en niet bij de installatie: je
# zet hem op Systeem -> Portefeuilles, hij is daar te wijzigen en hij gaat mee in
# de back-up. Een wachtwoord uit de omgeving zou dat scherm stil onwerkzaam maken,
# want de app leest de omgeving vóór het geheimenbestand.
# Het icoon hoort bij een eigen store en moet bij inlevering in de officiele
# store juist weg: die host iconen apart. Daarom staat het als laatste, want dan
# is dit de enige regel die eruit moet en blijft de rest letterlijk op orde.
icon: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/raw/branch/main/whatsnext-atreides-assets/icon.png