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:
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 |
@@ -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
|
||||
Reference in new issue
Block a user