From ef98bd54833101afb0ed5617fc7638e2cd7c9138 Mon Sep 17 00:00:00 2001 From: Harmen Date: Fri, 9 Oct 2026 12:26:48 +0200 Subject: [PATCH] Atreides Services: app-map in de store Naar het voorbeeld van whatsnext-atreides-assets: compose, manifest, icoon en data/app/.gitkeep. De beheer-app (8090) hangt achter app_proxy, zonder ports: en zonder wachtwoord in de compose; ATREIDES_SERVICES_HOST staat op 0.0.0.0. Poort 3854 in het manifest. De image is nog niet gepind: er is nog geen release. Na de eerste zet tools/release-bump.mjs tag en digest erin. Het icoon is de stier van Atreides Assets op blauw getint glas, zodat de twee te onderscheiden zijn. Co-Authored-By: Claude Opus 5.5 --- README.md | 1 + whatsnext-atreides-services/data/app/.gitkeep | 0 .../docker-compose.yml | 58 ++++++++++++++++++ whatsnext-atreides-services/icon.png | Bin 0 -> 24809 bytes whatsnext-atreides-services/umbrel-app.yml | 51 +++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 whatsnext-atreides-services/data/app/.gitkeep create mode 100644 whatsnext-atreides-services/docker-compose.yml create mode 100644 whatsnext-atreides-services/icon.png create mode 100644 whatsnext-atreides-services/umbrel-app.yml diff --git a/README.md b/README.md index ae607dc..59fb87b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ A community app store for [Umbrel](https://umbrel.com), store id `whatsnext`. Ad | **Electrum Gate** | Reach your own Electrum server from outside your network, over TLS. | | **Evolu Relay** | Run the sync relay behind Trezor Suite's labels on your own Umbrel, with an owner allowlist. | | **Atreides Assets** | A self-hosted overview of your crypto and precious metals. | +| **Atreides Services** | Your own price feed for Atreides Assets, recorded around the clock. Early version. | The image recipes for the first two are in [tools/](tools/); the tests are in [tests/](tests/). diff --git a/whatsnext-atreides-services/data/app/.gitkeep b/whatsnext-atreides-services/data/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/whatsnext-atreides-services/docker-compose.yml b/whatsnext-atreides-services/docker-compose.yml new file mode 100644 index 0000000..c4562df --- /dev/null +++ b/whatsnext-atreides-services/docker-compose.yml @@ -0,0 +1,58 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# Atreides Services - een eigen koersdienst: legt dag en nacht koersen vast en +# levert ze straks via een API aan Atreides Assets. +# +# Eén container: de Node-server serveert de beheer-app én bezit de database. Het +# recept staat NIET in deze repo maar in `HomeGit/AtreidesServices` (de Dockerfile +# in de root daar), net als bij Atreides Assets; deze store draagt alleen de +# app-definitie. +# +# Geen `ports:` hier. De beheer-app is een web-UI en hangt volledig achter +# app_proxy. De API voor afnemers krijgt later een eigen poort, en pas DIE wordt +# eventueel gepubliceerd; daar staat nu nog niets voor. +# ═══════════════════════════════════════════════════════════════════════════════ + +services: + # umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet + # wijzen. De hostnaam heeft de vorm __1. + # + # PROXY_AUTH_ADD blijft weg, dus de inlog van umbrelOS staat ervoor: dit is de + # beheer-app en geen dienst voor een cliënt zonder browsersessie. + app_proxy: + environment: + APP_HOST: whatsnext-atreides-services_server_1 + APP_PORT: 8090 + + server: + # NOG NIET GEPIND: er is nog geen image geduwd. Na de eerste release zet + # `node tools/release-bump.mjs whatsnext-atreides-services ` + # de tag en de digest hier neer; dat script vervangt de hele regel en + # controleert anoniem bij het register dat de digest onder die tag hangt. + # + # DE TAG IS DE VERSIE VAN DE IMAGE EN NIET DIE VAN DE APP, net als bij Atreides + # Assets: `version` in umbrel-app.yml moet bij élke wijziging omhoog, ook als + # alleen dit bestand verandert. + image: sc.kamenier-hamer.nl/sysop/atreides-services:0.0.1 + restart: on-failure + # Geen `user:` nodig: de image zet zelf `USER node` (uid 1000). Of die in een + # door umbrelOS aangemaakte datamap mag schrijven, is nog niet bewezen; zie + # de werkafspraken van UmbrelApps, sectie Atreides Assets. + # + # Geen healthcheck hier: die zit in de image (GET /api/health, ook zonder + # login bereikbaar). + environment: + # ZONDER DIT IS DE APP ONBEREIKBAAR. De server bindt op 127.0.0.1 zolang TLS + # én wachtwoord ontbreken, en in een container is dat de loopback van de + # container: app_proxy komt er dan niet bij. De waarschuwing over TLS bij het + # opstarten is daardoor verwacht. De netwerkgrens is hier de afwezigheid van + # een `ports:`-regel plus de proxy. + ATREIDES_SERVICES_HOST: "0.0.0.0" + # HIER STAAT MET OPZET GEEN `ATREIDES_SERVICES_PASSWORD`. De login is + # optioneel en wordt in de app zelf gezet, op de pagina Systeem. Een + # wachtwoord uit de omgeving wint van dat scherm, en dan is het alleen nog + # via dit bestand te veranderen: de les van Atreides Assets 0.1.0. + volumes: + # De datamap: db.sqlite, de minuutbestanden per maand en secrets.json. Een + # koersreeks per moment is niet opnieuw op te halen, dus dit is de map die + # in de back-up van umbrelOS hoort. + - ${APP_DATA_DIR}/data/app:/data diff --git a/whatsnext-atreides-services/icon.png b/whatsnext-atreides-services/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..669fe30632fc09e6ccbb1246be9f5175335b81d1 GIT binary patch literal 24809 zcmX6@cRZWl+kO&3V#cOc%-R$!r6pqT+N)Me(M6S_Mq3I?Eb)Q|np znPUL(Xff8)u??NyDhY|;w8NgA{x->!fkB{lv|PquSlo|dDLc?B5l1$DkL?>nCfVQZ z*83o+?Y2R>m&!#N9B>HmNNNzl^ZwJb~kNJ$@Doza-KK>yqd zJkKWq;u{D`Mu4-#%T-Ds6Di1A9$HwU0Yuakcn$50Dd&nds7=CfwnQ#G)-V(oOHeKG@?wNHu+>1GvqBM${PN4pHu1 zkTg6`Hw#FL!sojDIHEPpIY9ZWg%cBUU{&RbVmG?vA#Jz@TX`MBMEZdkJsNQih3#0K z?Egdv$s-TfLe5IMW3aqaZe~nT_ZG_*w;yuGxI2&<>9Dm#);BT4=WKxcYTlj*2gQ$R z&^>ZrSQ79aYXaw9iNF8>=RxakURrW{;)qHp!h68vNB@)dA36fauN!}n{5%f9tM2rr7q5AAX_j0o)dHOU` zJz-H80n~_k46b4Cb^--0U;)!B964Vh-i)L zRO)00<>zN&l-wb<&*>Mmz$p6;=)U*Wc~(jf87uSwpp8c(1+1wp9zZb zZRcMaoa*H68~>nuNIZ(Vv?weIein~L&^f)VQ3{*6ekEuhHkZtG&X{b-ayqc!D4H_|k%+X_u$=|uhwx{W^FCYQDYx(B`*$J3FtY|UJFl5v;%S^5Z^8JVC8I}A#ti1 z)7U*ewIORYt|wt+m9I)Sfa6mzJ)G`!=R|4l>f!~-AugQc5Gz`&@TXXJ1Bix;#)bn7 z&Bf-yL79Z0ktF&X=A`Qqb&{R zC*}!Bu=Vqq!rGBYE04c0(2M|Oq42$g{1c(kqNRLR zbkTv>YnA#weGal+Zp_)GTLZ!|D-!6}M2AdJ`=WcPIf~h^0_S)~YX7eKfGm5+qlO|L_Ju zQU0(IJ|R>kbI5;b!vT?Og$-LQbL;11Uc?V36A#(84PWhB$^uIthv`pgbj8d0GT7my z*g^!z$`a<4J7@xCD&c;=9~dsRkc{;3`NNP8vKPhOeT-0&8`8&RHef`mPA8~|ai#3C zchuN`;$F#{BZ4-`U-5o^2dydQXeDZc3PFTy?HryY76$PVoCl&tO+1DOq7EQO3tHc&m>}(V6QKBQ^jlH*@uZC@=E*E()H;q0 zgN&l~sOdNhJB;3NqFe&LOYT*E8!97p@|Zt=UVvcgXPD16;Ed`4i6`(lNS(3bj} z!Da5c$zw;NA5 zkW@d|Of5nL6r_%uIi61ZHIr?IJzY?IRPa`XFc9`*jpuJ6Cs~BZL$(`?#pWKn$uUtL zaSm*=o*}(r%5L=I$^Yz|t+co;;RuKtVZv-c|FLJfp~AG8#1T4G5Z^L(=xNgY6BTHC7V=i*EmaG$vYCGMI$`% z<-r4ZV|fxyBAo2Zb990K??^m0W8RHP>ZpT(F^Y~FR0_N_L+%gPwdKec8G#fTOuBw_ zh2ks{=FzQCzPvPcEgP_)rtSbWjPL8=xcC=zMpBTmzIy+n=$mPP)JEpN7n_-oZ&z$D zDQMTG9W>q++Df3s%C>WA#Zp(*{igb*iZVex=>GHJu|s}1MeBCxh5J9WlP9sg08s?A zt~F({XaVN@LhA*YmaK$2Ixs`oL0##h*TJ0}pk}7dUP#cV$z&j99mK#FkT0qTo)t|3 zRQNpjjt`|1qOK9?wX}yOwQ`iPw~0Muyue?z+xo;1+q=_wk-n@^dj_W!i^9<9qo~*+ zY(ci!(s^~}f(+9kW!NQ;&drA7M{AGV`ac#iyp{>oN1E(<^C z$4?L)xT1ZBv~R4JIRpE)p#5fgqYN`n_G{DEs0p)p%B!MkjESBFn5ix`L(&gmp`E#t z(%@Bl+J&qOmUMDVrw95BXI#Seeo8*x%c+%nWBm@p0$^ zrk0Y!=lrMiP(Tb;-VCnJM;^t5=3tnd>cnv|w~?JtuZE#lP*OVYqe(UeaJ)IIZw@E~ zmOEf{S-;$!uHXsfdl9w9khJDTw^U^Irs>hr9gI9=22o_|b3EA!?MLdcMzs+wSx0qS zP0qB6=ol~u^?)FIrb0q6dwG~EwXk%)r1LuVwS=WX3S_`9*>AvRL~(Z1f}C)R%|nJp zPS-tz*k}ag|AU+mJJ|3P0c#gdLCwxzC(NwWa+WAcURoK_{twW*%9W{M zu>xX#3e=|1s6@1V^pFMB+R-S(@=PbhK?{i(Qu30xB>BItch_ zjDZ}5noP=p`lUhkvp@;eBPQM=`sF#!=kK&Ym5N0X72JT2GR|-|=fO-}t6)B@9 z4}NM(qimYxKM|9NG(LY0>0`pTHmGlhcqvY%nG^vJf5hZfP|0c3&rZIrkP4>LPmB1? zdv1Enlu-gjFVPBnokTBcL{ej9K0{PWpWfjBys2l16J8WAw}mLjc*=un?P*Z_FHDA3 z%^@*fIIegFwh1dPk8b;Ne%J*?yA=YGE|l@~Cl&g8wLd>RF-Seo9C;EYwNWwdO6*|V zHr)tiyD_6EOsR;BTt14j7}5r^hvp5>+(3z0T!0;niuVRUYBpwd(g+!!54r5zkb;!| z-3St)+Kg^n6ro6?Ae>xMx7vVwQDFzN;|rjlF1f=;IKSW1GlVZGl%Ob3{0)BjYNxvN zqf|B zK``HcYgs_wEbvG))3|QArb+p+Ub$P4=ryM@Xy>5kdGK)qxH|;i*{5n7BgRKi+mBQw z-rO{a>Z^)8Ca^xm9LL}PmE-btT!xgg^H=+AfdIM4gpxI=4Qa26TKea&2HFZ<$^|wE zVqdsg6hIjPN1ikuQs7%A$gL^rR z8jy*sqLN5pisn@`BvZJNbA-zBLoRxTF>e}0eAgtK{LmL^!^ zb0#u)$$#x)wK;2AkB^usEkxF>Mqb6;R!K4q;z%@tbkZeV+h74ASb~*ftnvY!22kOK z5fIU|B{bi0 zB#tCwu2n@H5n1E*h+jm27-K3>Kwi+z+%9nv35;dP2Pm@Om)4bVP=5pXepq*)D9!h; zwEZ;|_}M1%%O?U`BM`L53EcaQB^TufW%OHflIBK6T)?8c3_y*&-gS25No)ZEWJWDb zi-}U;Em0~>6pZmA*ta%-?|R|P6D}*`UTTy}5ak&o`Cu)G{fp@b{>;K#Ju}}Djt8}( zW87Jm3{F?$vBKGwwejd)3h{gwb?tZ~q>L==eP(P8q~#@@FFblQac0#W!ug1$v(3}i z4s*&G9j8gv=sxly-YraeDt0)JT>q%GlONc9P1_w$&m`@JNiAAu`~8RP$nd{H(VNF3vNPR7R9G6iiv@OL1V%EeUHGu@=9{YCD-OPBHkBu^Ka3+2@M2m~~ z$NH|q??_;}&mq<1Go4URu5F5e6)skCfavU^*Sv9pOs>2;(lp<_220KT@PiW}38w~< z@mj5uQCDXtSO=aClsRefmaIhGG^JR@Q~BN>Cw7V_*rNgBm7B&I4zn@^d}c9b!k)rG zosdKsuohnct*$h9@*^_RhPrs1owCQAZM0QQq$x_9^C1eWRXp*WiQ=&_C-zV27i9O_ z&RAh@lftE4lKmDH#ek1CAS)B3fwT^*sR#&VM+4UW442X?=N=b@OVYeVY<%>*Z-+zh zWioPIQV!@5;`6W-^exvWeof!)A>nCJ>KbN`t?ft~YsfetM{M$K_^#h+=% zVhQLA(P1B?$c;}DurYv=GpD1x#J*0OF=pKcY?Xw(#hc6S(FgT?N@X<(Y0v^08a92L zVEUx8hi5P@#;SjyLNVdV-f^nIN$|IZ4(&zaAx8^V$v zPrCblZe+wBB^t{-~q+kfgBKQ`j|qdwvHQp7;B842+b`s zuC*qX0;P``?QPB4`=<5VZ6&Cgfq5v_;O?C&iJmP%pYFJFq$rXeAh|;Jv1gMDkr@Op@}##nppP zQG~1*EnpYxqV&N|1`l$ zjy%P7o$*s)CrxliWn zXZ`_%V%vWf;9?_O-4BMKL)S(I)&SwY0sLSaL6PO`8r8%uaEb;5^9oX+CXvYplN7y{ zW60)f%tzi8^=MFkvJx_V#s$K%%$s|E``FsVb^XXZVTA1V~Uq8~7|A2FH*i6xrYS=uI1@K1jr;bqpx9bQURbnYNn*5O0w{XC{l$1_ zZZmRS%^}rX*Zm0jjNmJWgG1CO-(%#T;5Z7?IVZ>uH+e`_ zRM4SQTwaphmyXen%kCfFB>cKHqsT*EwEa7Hg**hoL{n`rrOIm~feB{|sOLyy(h~zO ze89Ny(>c&HaeyVK>4c;cV>|OiD$ee1V>9e7lh=IJ?i0W&FrCr z(ky-@CSJxi8$r>rn!4DOR4a zl^{Z_n&S>6t;yR=M=q5t;h#*8nZWMx+3kddi7#+6TO4kK&=E1y%uVrJu$3G{;{sqx zmFGNOQ2Rnj8&ww#AnLi%fJi`sl`I^p0}&y<_k6)A72n4Wjp)XOjI<{tMvt4WJ!B)l zBx)6632Oc`mco=7utzGSrH-yZ6#P=DVPuj?xm=Fs&ovpTf$MakY%z5;xTPw=i^tW- zhjSy>b~}n}KmF1o)}!#QZbETdk;ERalRMNxnQ4V>Cw>tJ?CojHxT(ybLvIjZgImz$ zKEb(~nA+VHff(4qHrkk(?D#5k!IwOREd&)M)BfD!Ab}w5!hO;H9TWZr{Krur zYOlpf!Hk%RSs;up;0d+!?8^fxZ2-UU!k9o&nhJbDA2C}`%F`l9vI9m8ywvm2rT%%# z7$I08Y+0=X7_jo?d*Lsjmv-rDA3%uOJ$F7 zzQU+8V~wEof!$m8l%(w*(t_YsZ1+7M&lR(iUNf;qT)ZoA98Zr{nk7S(H!>8+RqU7m z7{MBHoh>PW$u}?h2G!WQlb#Y#8OW+hv?1(fH7>KoVem~0j}mbmg_r+A`6#mgIw9(c zzCq}s5~+&m>;}l_A!l}yGN=5l66y#t{fYqj531;Gs^^NVf;9tRB-Q>H>6#jq) zn|sbPk>i+5kIm-|OJ$9U|3_nutth(8jdY#W`FyFn8AuUuW;C>OC2RdU1P=b)0I{_u zRJ`+*R#M%ZRl2b0l>VoSIie$w-(c-Gb7UUjkgdq-$HLEhGi3s~hst1_GdMdquJ7E9 zBtTIat^-||H-4B1=ar-_Wtc}<7jyb@(wyqxB{zJe!g%5n`kH98$C{c2i`hsoblnpP z4nvhz=s?HMvQQ*@ESk;kBCbZ5Q4i;)Ot_Vz#h2&|eUl5eR0rw!*6xo3>_xr#}{#5vN`;9?<3=NE|_|cs=9MH8@=a zS@vqoF|; z`LEgzC7m16SL3Pph#CjOdt)flE&^zev#BiYz{0JmDOREY_*8jCHIS zmm)=q(=i}hpt)?e5YhLTZvvz2V3kJ5Et7w?hrJ~rD|l$!mN6-rmMVWkvQ8AtSRcC$ zYW*O!bf^kRHxyC&NzB5g@-g#VaZrL;d72`oXjVz12Dls z$JDzBqZ^?-;BUtNj$!q@aJ@j0ei#b&2l)rSr-v`{FUhYxfrUqbwTB74JDw41)O%Y4 zkdhwcJ!8cil5m1BU!oh-EDyZ*7N^Uc5a>~YxMmddcJaO|&gMxkw>s z{wq@M57+KQI}r_~fuujy+2mYLT0>=AGu%<0Ha;mjA^pAJw)`b7h?~T~M#v3YoK1Xh z0_EGv`L!*!1AF@ZiVDS%F&)V2gMBdJa{@@T+?X!gjQlE$3(O@=uwlC5`KA?j`?Apr zf~okc+(PkWUq}?nt?>4LQ1*TE%j>^h$gJOCBCEHD)v=SEq3nQK_%jKrbcc1a(bS}8 zl!od+bd-z(P@To+h&$4g=-)pMV#Hz5k8Z#@ zxDOt~4dKtkVF$2~KVUc3d0n@H@?X-MO^jsXgpV*;qL6xJ7oP<9D`$F5(n}14J&R`aTC<&`4)Ab}SeiA3xR8m%Nwuv}S>~SA_m{-wjo5)}ue;fuAoKnX0~}8wmO<3^7UBxZX;Sh&q>Zf1W{l(=!h%K2rwgWejx`1LxlH<=E85 zMZE|druImrl{0;NnV^yo?&Rq6kBb6jpsC^mC@ZNu@lplnHhSs88Cw0*BXMefTl}6| zz#jL5v8hhc!lwDZse>NL&;naQxFZ8^V)Q%bIYw}Pwnw6rBZBctoW`_Ahx)=8V<^oE z=2!VI*-dl7l{?TVs<3EaDv*P8*C3K|Sn+uH)u;x#DLr^-K7>tAME|C*3w+}lUC-E1 zNj6ofDnRcaYkZFkelZ5twnxXCf+yw#^QdqjV zb18qWbS8fT{wE9k!<6q-U1n3Bkvyj-+2tw+M2j;}&uFY;dn5DBm4zya;YTq@X@*Dn zPj2_pcKcTRu$|a;yGpnzx8XA*A(HgFyhC-9kG4N!syCkvpz*>5iL_i}$fZWTrE>n9 z4O}%5mHVGZsuHg_Gxw9QnP>~a4RhKvH)j3;{?w;Y6W!$8iDIkcJ#u?7!3q*(8wdh65BIbOw2G=>5)THDKdou2vzV!pIkrfT%? z!7zT-@GaI4@K4K_E^%?#T$nzb&d@m4B09hfbBA@0SLYkev`5BLRhbH6`K#4i#t={c z{{Sh5=y&iNVPZ+{#vTd`#^8`tI6dStswCgTf#pz~a!itm_jDu}iUC45jZ{k=-4?I2 zGvz!HFAl=x?gG&sLWB#KPNJA#`|6ZqcF)1@q)b*^-Q5}vfVE6q<2nn3lXj>^u6qBso`8Y-kKdmUENm5E#Js(McqU#q0zMq{=v1F`M^v&i7}B>J zgA|aNhAjKyua0$PcTwe6`qs~?&z{E>-_xlKev_O`nDS^qs#}V~7k<)q$`38a~TQ1qYS6@9EFxd4dG*h>dF^lSmL8r7cJ$Q+7)mj*_H>bS3(_CS?2|ozb z;{>eUmVYi0ter=3-j!zFXZK{xYPl}A4~^GHSB*veE-qpJaXmgPsOk|rC8yTA#O%;) zjO*%JAtSIINHkwv7R$JLI{)~c9k+lqd_HdQskLXDuR0;}`{pukRSP#JKZLiIKRT&b zX|+5hEoGc783T?!f6dQA8uzv1tlx&FMp-Qz_PE&w-JIL=zc<(h(Hms=5RmE{z&2`3 zlDx_BcEeD8D`mv)&hBaI<&^PEqM8jb`u_XGi+mp7VnczcDi|5nTUl9ocJ*-g#N~eb z)?>P8eQ=;>LFmF=C#YEB7T46lb;xsG%8og@pyc)bU1L%!9B5UsF)cL(2V|Tt7`|I~ zLy$_2P9WuRJnn+6W0%>1E=&OM3-VtpYF_H2gXNKkZ1~$F+yapS(_;&~7`=Gwt3W1| zR3mk79wtL33hdsD!Qr zj7w6jgT_4r;6IKDzpvUmoClU62rrPZ#9s16n|F$C?UyVS6m4m7Yi24U`R1I!Lw%Gn z02PiZ>T=IrXL?T$;Qol*wfov@jcSFB*uTV9=W<1X2y&f*azIcW3|MS!?jPTYL~z^7 zL!2Ez4?ws9osarq#aq7JflaF%_AkE%Imw?lp~aP6_HzO8^5_6i_ZrJ9au=tzH~(&? zy{%;+SUn?ZZ3(24^J>#-O}5&S8o%7@VwVq)lXPci;|>F&t$5A;yX7%hhQJ)R0z+^*U?k!l@@a}c7)Bin<-fL+-fk1JIgfU=6hZ<5l0e)M zqeE%)wZ8RGRUrU?=f}lw)&BWWY*VeqhyYkPfx$}eJG<2!m6Ft%3IG#2)89DM)_1~6 z;WcNWJ}(2rtu$V`{_@$xUD0zK0FbEr-Jqm)d;Bulri~8(1+)P0_nvH16>K>ZbpU`t zZ>arI7W;MW&$!$%8j2aB#k52%9W*`&cCj#6qE4?ybzQChJ*u0KaXQ$rod6(#-ptdg zosQR~F$UD3R`O)I@u8DpV8+?U|M35QCEvw&b!6U^*11VTeYR6&<;PdUj1qEMa2YEI z13+GdTUuD5h7P7D)&Kza_}sG`3tXdzMj=f4WA`e)_PQsu71erBtn0`8i==vt7 zY5)LA8MXJ0$Fv_Fkjo4XcP!wT?X5&Us_7Xm|Cn@zq`Tt90D!31`iNCdJ^W9M^uMXX z_K18qK=({N?D#Oe2(QhPMzvq6Skn?_bB|}2qTJ~J?}&AXhgMz|3~8JIFgM+>SNg<_%qZC}zTtU>=>^jF_Ds#mWH{)r6w zP&48{c~z1pay_1fo%|C*`U#+3JS?Qjo$)DhW&*TwB#8lD!Lx&t$ z1b_ps@S9r!+c!;pDW3~EtA!=aM>M=w@FSYl9BW_C>bcf9K^aDB@fH;2$U)EXxWac~ z9*;gxJ^Yt^Z#Y_4>lh)%n+hXLPKBT|&_`p{Q~Aba~S~GKG1US zWYvT|`ZW2VuK%h=y~OFknpSLlvqI;iE$z}$5ExMl2&^sn5Xdty%))xsyU>Qo{RDpgjNiY<^*AP$FG#n#)F-BJRY4>me_Y{IR}(lv-X z`CquWxqlFLoDfuZ-MWsAIvrlJ#I|Q0TsFY|JyHmg+K_X7^=GQ-b&;ikI;d)0E%Z%M zqXQ#FzsE-Ma4pGw`|f<~aa3+XLb|ghonfz5#&=o*z2;yez^Ulfv$MSC?_Ux5l&4zX zf6Z~`Yn%74*XKgo3U7Vc=5rk981H{oPt?Hbyro%=pV7?j8LN$ao?#qY@%tHe`Ua?F zMU5HM5^(W^n2*OBoLsTQ5rt{*+a=adAU6=b%sP;-F?Z+t08645AzMx8zliUs;Nr=yLEYCdJI2!J6VBZV?<( z)kxE9xTn7?is_!rjg_r;^C7_nIwx*rIWlGX`aiD-Qv=LHeLG@*Ol#if_ZbnY&@mDa z9MlrT`7k5O@+C48bTv1{U-`lCroPYQ)0wY*YR{!AJbTt3xs5}p2vjg=SmwPtq2=BT z8h<%>d-=VOBGb9ukB=eeCQvKRW0Hza{RiyxnHrjpwt5rS~Ha$%u z|K4Vu)Vg`tKV(k~aH9K_BJaT{B4=7@W{Q><~XehCNKa}DjD6b6_n*DHj)7S1Bz!MJM0#cDRY_61!^LnL(DVB(uFUhxT=N+_ZaT8ts5Y;NY!;4s8iw5WaqGKp z8nq)`1qUYEiJ`;eR}_xvsfbCQzVN`9V@>0~D8>LCV=rz+m+&mPeH1DB;Hr>QQGUXP zlem4;*C2gUc+_squX5tx%{^krYao<$Cv$ZYYf={ahK}dQv%VT<`TE6 zY*wPDNjTQfC4+bhHv&*3O#=Yh+_(2uXi|HWHpPC`t}Y8T%ge92uJtS6&yM?Kl745` z=G+JTAHOIxH)`^7D(~M(7OV6MYMwatCU;{+78Q>N?>v8kP6ARx7{m;sI$ihUv5p$$ z)z)J(A5_O>T}Lly{_^-UzBW1|@>|k5=v?P}<9h@3y@xxUr=(Re75{bZ7X}pCCY8)>5WG2pE<@~RoE*YbnVWyw*8b8O$kZ)EWnmm$)2~+r=@levK ztfE{*kr7?N;#6(jD{=nk-sig$_lG}yKY4&NhA_NzJ@F?jDK;B=%rp9dw)Flhro*d` z#VkGX@vkp3;2h^`xm-h+P4&PKPi@3?Db~LnTbtdJ}D?KBcvg9bD7&En=8YI0)^C#l;(c2 zs9;3bqmVMRmD+n6?3CbV)TMX;)VKSrifpI6-+#Jv-I}=4?A2rAP-Rp7li%-C!Kk2^ z+1skmC0joC^XF;%m)?g;j%w(fl;peywN_sQUxJ<0Tlk+>t7z@?iP&RdRk#xVXRs^= zKXNLzzVBPw5r}G)UJhUlicTY2&?`hemKJyZ9#h9ePRea1B<$I{x8u?#al#B-hnz ze0?)@TORwh3o-2v!a-Zkj2_HQJuGg4LOeIDcHVZvBplMGnYqPb?YjKwP1E2-R?xM} zR}2}(Y3MVcu3A?_O8}`7hdx>jt2+c7l3@&H;&p&GK(yPOhOZ+@rc0JpK~w1(=hs# z=D%Q|{QS0KIN@h4Ab34s3rjB?`9N?!sf)lrJG|DRg*QLBzqHZ*%)nsm5%f&mom4ee z2Y|}UQGatkIDM5>NL)aCa_=NLj9Ad{Ol$2GjJwiLhD`|wMx4?~>sFN%=zeW5=6GjW z`j8zjB&diz*io1dacPQbTrY0l?3Rom`5RD^k5{beX_@N1&x0zWYN;taif8gA5uLdQ zg*8h74}xVPlY)iklLkZ;?imiX+dVE7K3Zg%4>4`;y#KxbIh^W!fWgSe+cNiM{}t)u z*Byf4TJ6uM&+aY?1=R*c!N` zSc94Wk6F#hI{qxpa|l0ga(bV?P0Xb<Wkb=4caa7$M^3nc(Yvoc@EF@{c-NQvam>%t)9F;EQPQCq5c!r zGkI&$7hS56%;HB+lKYeU#>*G)_?3ku&U9s3(3Qx4zjxEiifcY8iVEsyHr>pS}zFeA9VhL~_uluJYpN+sT`83K{OQa=jw=yj?6$dSlCYyI!@x z*^xBTP1)((TY8$*`g+}r<@#WV9vj7)|EY!U0`lbk@9)!2q@_==;)q4o5AlHGNX|I6 z&u)48y-_)pi9RpA+|KgFFG#FGO2`~yMt@J^U_To1G!c@JlA^~n=)bHyBzqY zyOEakGPPjvPUgZr1vYDHw*6L!(}rNQkG1y6&QntQZaU1Vqa#-z{Zxz7#sIuVhy9i> zMZayn(LyfMY|!Xwd_N=w2DSql-pLj&=f2*S{-Tj&O?tN)xaP^RIS~??JVw?OuY1+PI0U!blpGbQ;?0kWm+h| zA$@-7Z|$8N#VZNKd)LYqcPx4E61Fp%((jwfFG0@+8|Lh8CIV)VO_9ce@e(XC|9#q@ zzaiMU#+9(~vhfqf64jHCI}SH~W=nRV3!-J~UYGqe{u`C!eBc(avHw+j6Ha;Sayv^t zH5%ZBcEvmF(~-5elp-38HNk`(|)Ns?G8F^$9ao>D+y-mZchd^cwdx zBrQrpy6?^|f3UdCk$2}}S$ELe?h(@I`umZd{g6flR{4rZZ2i3xMU8Na2sV5SF#(v1 z{+84IY3y>Y?Ea5$ukhr61PCk4`hAWJ(*dvl8v}_#CHuf-R@Ug=b}R9 z@AU3bZcjeI-Izc8);knCHB&{hdGIgan(7`py!%>N)+6s46O=1AUm5m;&b)iPb*S`a zt7B`_Z#%yytxcM}-Dw(QRC4{xko+U)+0~H6@mpI$j(R6iE|1Q&Eu((C#j;TVFivFZ zb+Jl~X2+BMN7H{#_m`&fI&yqV9lGCp-~TkQP&QdO{p#T%rSc!gzxU4nOrc%|B2xV; zRTYhIGsiw@+wL%T2;Y43^}k3~YEAHPe=oxQ`_g?`cvluhDeO~yfw~3^;j_5?9S!a1 zvI<;#|H_>z?bSvs@DUBF$*+fQ2el%$O`HeH%uk}e9fo=p3Z`59Fd1|&5=B`cfz5vC z?fG3h{+Edhj?YIO18VPHXP^D~I*xAZR@S7vM#wQ>G<)rMrI6)Nt6RWFZ$kHA(=_~$ zXQJPI9r2PY|6Tx`r#^L9j4H=1DsH6Z)-zVWbr)5e=X=Oq(o=KpJHx?7M@OOY$MCgf z>5fR_im$JJEy?OphQnDS?#o|(&4N8II5qec|G^fvb+R@8J1MWSOe2}Tl0y1eqJM;A2gaK@cD_aJ*E^`CL|lIQby?`@j?0kb z)w<_V@2zl;G8?J>S=8nTqjq~X{Csn$MI+o~+2C1U=6$GzrFQyr?Ltp=N)7R3viXGcH@*7)o-clzin`|ae{yP(JGSOhs5=Dy zYlwOl{_#Q<{~r6g2hV)pW*$e8xl6nC=0*6ey^U`-pHNF`tfg`wF?>?@6TL`}cbi#b zV#JaZ)rY`x;r>6)z};ole7#lr%-%0rZ0lU&6H|M4J?O;V(U)bV+Tk3;s{^WVTrB(W z723Ali6^lAe(5T!M};|zYuK+Lf0o3B&MzkP^KU-;=>$J8JlZgSKI+;+1`lF{lwEDx zZ?iiX(&I&&yhVCY#FL5E5d1({+p{Aj!X%H{oTvHQ_LA^s2dv=Ycn)9&j@bDxh^zU1 zT0~XQ%$=S3M{H$w^ZE!f%Bc0jN4G48Nwx1cjyjyBMS`6#$y_d)d;JTS0b~9~71Zxo zuU-he>A4t8#n2u#^0!ev;c-?tU=eowB&6MxvHpHy@9Tv2S2=qSYI9}~YE47!Nq)-6 zd1U8!l*ax+j7yj-}XV*6`PPjnQHONIJy;;!(1FR zt`WMnrWks*e|P@By`rGutHC7gBl5RzdM|_ zbw$=`h4Qvz=^@*>{byH#S2H-*SwdC%-%2(eD~P|F{nVl-27e#-`f(TW)G(9E80~4Hia)PUwF6mjCIyyXUf+)OYoc)CJ3o z!={y@U-Ax(GZw`bC+THW>SEDjW+_6=K8%RGCabedAbrF#wQW+fWKlmdyB#5Z@RaI8 z?Bl=qe@!8k7YyF94}Xnm@#uDwQZ&f!)b7Ri1L)c56v~iV{s1MzZn22Tb(LRnea?U9 zl5DW}lKF?At-bW9lf6DD2eTo)X^KHvCU?dw@+uv3n0J*ROZkNyZ`m*IA}->7_?@~A zt#3C|i1@UB>7naK<+!xVt4dkFUU0bVI~$$!DyC9=c~JWNRX@mgSyTMCx~QF(2jA&Z zCP%#{r!MAK=P1+Fc-fGiHfBKZ$&f@b)THoJ+FDE-fuSHyUB445Ya&G7r>1iKv{0ky(krFYjkZp>t zcGA4xGtH32=G86X>nN<^aj?r~%B7s`^J7{Pf^Dk$BOwy^-aR9)bi(G6DvoY%t}Nfa zyFtuXu+Z?$AZinaKf4^iM!6jAv*Q!7 zM_tq9l7sG{paP~hzdp~8`MkK^C+$A-X?b@=_AID-dnd1L{2P@3{r(>T^6ibkSmAkc zIdI#id*A_G7Nqz5J+o4+GqY6xWQm_@rk`&b*~l8+3pT zzu)&a?vHchHJ*E)bChFkvdJ0~+pdIXuuG~u{e6Yme{6GagOommzY5o)lG==-hpNtG zZ-v7}&a%=@<2QdK=X^)7-IJU@OhP>?UpB@%oqueKZW{_8U+D}~8CtoY5mbC$(Vm)U zko1&fqJ0%e1woDjW~t68t57o`YOuZUra37p-4TSHo;A9)sp1haPTl3yhvIt={tVh} zl`!!Xn|epfo+@YhBIoYDLcK(LtIps$ibktFgwd+H3NnRiA zLS`2?Q34n1Ih&P|G_0$lj?xofo`0t7C2T57pUX6hfFMK=dCEugIaY6aT~sUAXUXRzIrvJKp4 zH~}h&wLiv^X>P=_pM5E&t+tg1I`t+GwvCLR(=0N)mo)HQL;vS9ibrrZrQc zm%XQ*`lD4L%5rQ}j*7=Q$&D(x=P4^GieK00FJ}v(hw1wPCldb5# z;g!;w*etZKfmFq&iaegui``C6)$}tRWWV{TDpy=(DiMG8;_F0pzx8S*Yk}bU@cz^0 zUt-~a-*DLB4Y0jc*9p3HS@;zr$8Y-5P`&X~sRK`Z#&M;^v7idF@8j2hb=umlEnLS zhY-Rql7^@mJ(sVbbglFas}01^63l@Cox5JLFi<6-4%lE z3LJ6~;x=f>e2q_yy*`|Rw|O5-y797O*Je%$%k6NK|MKIOJ)@TKGKxzan(M_l(p7g? zB26p6KNX!UlXI4uICmoa4{1nWE$5N)PbG9tw2%AJteRVTlDPaq3FVtYS#DCwjvzZX zE|jyfRJr5Xd&C{C*DtLs(#}$WGXwgu3+eJ!)-2_yGsDJQyTM{DTxDn|p6tGm%5MJQ#^pWik_YW>bQC&x8BX4j}<@Re$m!S~bv}_Ed$kQFddu@Bzd2WxK%1X*aQm@La_;6Z{@d=x+3! zQP?}efOKpQW^Ho_#I9&^EwNNwih6-cYBKi&1^qb zJlF_u?`OPsnd@+*w(@nR`>9frgIW4h+f_#CI+pz6gY_LnnG7wOk%jTrQQvrw_7e_B z{23!%9w}on6X`+9-X_@I6tASyBVxjb57XzeI}yO*3U^N^D6IZe=KA{OVYm0Wl(62n z&Dx+waKk*p=x@HW92+C)y-C4Kh6~F4`OP(fEqW7$SAWQZ{)>}*`wNQ&n-g<3oe81S z61BAE*Aa8iO&SayL3t_?U*FDC5=@b$jU`envhIQ`Oi?}-ZJt&lIoyBjJ7$rbtex=F zcg&H~bqZ77Q~WJjiUTmcwN~9h&5cOCt-t~+|o|1IbGG}noA}Z~L^cRbD=@>47L65I+ zu5e7OG+VE#2$ylS+$J+D3G|y8_XMs)mIHh5%V>~hcm_Id<)T}(GCax2*X6;rq#kM8^_IsT07~NAckVmqRz7`d- zG*rgi;*~5)2>vcp)XG-u&2yq4KGqJq$0~o|2Hz5Gnbx%`)`GdS!hv^yULu@iL9*9w zTYYU*SU`LBLq|$ZM+H-RGfVcO7~@aMt9xq=7^js_}~> zW;Ft}#p84saFR>-jYgWL3U1RtK-<;#$Cqrgx@r&_2#S`cRJd0>S&+(e0xk%7=|--3 z6ccnNFh@Z82Q2rbw{h9@zMktY8G@E<(Ox?x7_)ps=tB!qUQ}N>Q&F5j+{UHGPX+t0#7H(Q;si`-j%?bn}1=#DT#e)=egMu4UaMN zyP3)8`RH|PP%(MI$85?7^BnfCxx*A-v5mvmFX>ZHUB{D~S9&{Wa4j<{w0}^`4bW21 zPar2j(YAWlw^8(nnj2|K_4U>Pt|ze#LAU%ccat+r zYE>k^_H_T9t~z3_V<1}Yb=}~^SN=rf*xfbPv$tWZuY;+j%plCQS1a_WT2ULC3g=!d zM|8g$n4dreFp6t^e}KR`oT@-3m$#P4&=ETz{H`-+?R!nPZ=0#{_2{94+I5Gm*cRGID~B{hN|;0BV3#CMu;bTc+MPu@pqFWRXpMMG`iOx zSG#1mF&dKMgdtzHoNnCy1$GbMQC_T=ZA7AmRLA)^pUsEc;v+-)uN&p`dh_e<}$*Ysd~yB z$}xW45kvQ=vY=|{!*(B9+%NZPM*Q=(!5vj<*rZ3J1qI|B5;)P!1=@Txo2qli^VMrn z;Q=h!a}p{ee^(8sjHPCrPG4}C9-qRi5mT@h^MtnDYxsk|*6cpE?3!2xn$HIckWROX zAw`Gsjc7}xzLwkxb7+<`Q16xoJw+Op5~%0y+X3I@YTn@jpV~nabLg>RKml~$&rCCG z&0&_ST=ytt@E%E2eZG!!NkAVA(>(oL_N?8Z?qR0_c62Jqx<k*Jn54#U`TBsf~o+xYy2PB{Pv)Vc)KiEB(${_N!>B?(}t8U`%# zjl8?Q-OrX#UXy=?&;noqMTq!&hYgM5Gw9oTWz{ zKZ|aiI@E75c7X9JNq|>^{tTLx^g`QHP#>1B#iU8<}_n^C0Oh!g=%m^cM zXagj}C6-91>68q4?)t`q$LTSa$nlwhM@VTDQyz#4qiOz^te}TL zXiUv%z>q-D2v_}Oig~GulLknjtv>d9CN$aw)-GrpT5XVZgBNpvVRv*5==9< z{>cy6ueJ18Fk09m({s+%5`co&2gO2V92nn;u!?F1x}AR*$~DdK&x3RrZ425nV`rCY zw7iRwR$F}p}X*O}!JDU+?6(D~xf7`!j zNdDWwUt;0WXQ?F)z~o)xN26(={oWKLgjYj%GG{I#0@qrs1DXkmTd_5lvCo{t7=7V1 z6urT!R18?Sdc*sBHz)KI3Z8~e5mbbc1_(}ehR|m`fx!9L7S70eu4Yz;1{KzE{FVMBnih+V>V$JvuZ{tAim)iN7 ztqa}dZG(7VI%U`DokD7y1bYhLJ^Ds3?p(L=6H%-Y^5i7Yx8$PPE?n?#FJkL*ANK>` zln;M!-{-ZOavQS`wn)$J-7`*I_5buS5sq-B6u9xF-&P`lMPwj4y@0AN;dH9`hUpME zxgL4&!kKs9xN?#&?#O)CRmJ8_V($bh(v%*b-=vOW8Ix0>hllAax#9Sb!vOJa5_{4C zjP1^w0EV@0pHg>9k%CE3c`NS%%71Gy15L)!bb+{y2J?@;a!w%? z4$gAGf_AD(rfRrbm&V69FJ=nb4QI@uR8hvA<RA~F-yn$(*KBEI^&8r6yHR0d2kC(Tpoq0SZE>5PfOW*&Vo=@PdG-_d;| zyoz!XYj=8Zwt|-=<cJJ>#JUn_(qkiqzBvM}E6&7n@eV(8}g%}QWdR+@Q+A60Df zI>cajVZMzd^cGV-k7Ub*@$W2{6WW2#+wTn)S5k`BeaSBM&MKbC!?OX_p9!r$Vi7<* z@pd;zU$6dn>{%0Yu3_P8@>rrU9#ns|Y@r;Pa2KRg*8^+pVUN`h6eLXay4P3Uex>I{ zC@72Y)H_r$&qsVeVgpEm9hFKD#)Hw_p?jWTuqN$#45qZJNYyV>gJ&B9T#%X9c+oug zn+qhZD#}mL`dgO&IxBMf_u3>d$!mX*5?**w&A$#%%w*vGPqvlbw>9s84g;Jv(qzxL z&blI8`)0DrxZPzg{N#YmZD>`Q)hZI){y6QAtHvw|N;OIvas#B?Bf)VJf(bpYb8R8V zMcW4I*4labHW`B4kxt4`eFzwm@-Bt`!Z620LpY$z900eNSGI*OvXRoD@CEoO4cuh> zjdeSvo5c{A4ke0`SfQ!75#2LiLJ2kqw;?!ktPi?KB(xupx#UeX`^}*_^ubKJa>>>jUzy}xHjw7G+Vp@xKcAJ!Zjt9jxcxjY5 znCmhC!&Hisx^yX{U(4PdDmNW!IJQtO;#W2&7x=q|~M{LI|nw0Y@k+&8@mN-A?UB8J09zk;7U^u#7JXOAiqvmBc0~$g>$Tle zr%OqybN?ckv?v(w!8w|n3xH%F7A?0k92<-K|0y^^kNOSJ9rU=f%95g@V(ke*#%;h_ za5S`$1qQo@dAJLV&HQ{)sfywooCZ6*l%m?ksDvp~P zs&u$=$XX58rpKOuUu2*FPXIbl)R*T|_;q%va5uRzB-9~{-vl2*-g{s%Uo8ORlQ zNVA^ttY?@-;PEeff&T{rKN$iHEWyKnSYigT@B(iD9^e5a1U!CStj~J=Uwwf?G{gUa z{{QsMUr_Aa;j|wHAr;AbkB49XZ^<#pQ-1(H- + A price service that runs on your Umbrel and keeps what it records. It is built to fetch + prices from the sources you configure, day and night, and to store every point with where + it came from and when it was fetched. A price series per moment cannot be fetched again + later, so this one is kept, in your app folder, and goes along with your Umbrel backup. + + + It is the companion of Atreides Assets: that app will read its prices from here instead + of every portfolio asking the providers on its own. The service knows instruments and + prices, never what anyone owns. + + + This is an early version. It brings the administration app with its System page and an + optional login of its own; collecting prices and the API for other apps follow in later + versions. +releaseNotes: >- + First version in this store: the administration app, without price collection yet. +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 beheer-app aanbiedt. 3850, 3851 en 3853 zijn van de +# andere drie apps in deze store, 3852 is de eigen poort van de relay. +port: 3854 +# 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. De login van de beheer-app is optioneel en wordt in de +# app zelf gezet, op de pagina Systeem; zie het commentaar in docker-compose.yml. + +# 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. +icon: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/raw/branch/main/whatsnext-atreides-services/icon.png