- overnemen: een compose-app die buiten Server Up om draait, met een knop
erbij trekken. Er wordt niets verplaatst of gekopieerd; de stackmap wordt een
verwijzing naar de map die de gebruiker al heeft. Kopieren zou de relatieve
paden in zijn compose-bestand breken
- kan Server Up niet bij die map (hij ziet alleen wat via BASE_DIR gekoppeld
is), dan zegt hij dat met waar de map moet staan
- verwijderen van een container die niet bij een app hoort, met in de vraag dat
alleen de container weggaat en niet zijn gegevens of image
- hoort hij bij een compose-project, dan staat erbij dat hij terugkomt zodra
dat project ergens anders start en dat overnemen waarschijnlijk is wat je
zoekt. Daarom staat overnemen links van verwijderen
- een overgenomen app verwijderen haalt alleen de verwijzing weg; rmtree zou
daar bovendien op weigeren en halverwege stranden
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
De appslijst bleef leeg na het rechtzetten van de paden, terwijl de API de apps
gewoon leverde: de pagina haalde ze nooit opnieuw op. goto() wisselt alleen van
pagina en saveSettings() verversde niets, dus je keek naar de lijst van bij het
laden van de pagina.
- bij een padwijziging worden de appslijst en de containers opnieuw opgehaald
- saveSettings() gooide het antwoord van de server weg en meldde altijd
"opgeslagen", ook als de server de opslag weigerde. Sinds v0.8.05 een pad
buiten de koppeling weigert was dat het verschil tussen aangepast en niets
gebeurd; de melding komt nu in beeld
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
De app store toonde geen kaarten met daaronder een knop die 106 apps beloofde.
Het raster liep over de repolijst, de tellers over de opgehaalde apps: liepen
die uit elkaar, dan stond er een getal onder een leeg scherm zonder dat er
ergens een fout te zien was.
- storeResultaat en storeVerborgen tellen nu over dezelfde lijst die ook de
kaarten oplevert
- een lege store zegt wat er aan de hand is (geen repository, of geen apps die
aan het filter voldoen) in plaats van leeg te blijven
- GET /api/repos gaf een 500 op een repo zonder id, waardoor de repolijst in de
interface leeg werd en dus de hele store; zulke regels worden overgeslagen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- "stack" heet in de interface voortaan "app": 24 teksten per taal plus de
terugvalteksten in de pagina. Je installeerde een app uit de App Store en
kreeg een stack; dat moest je maar net weten
- code, API-paden, mapnamen en .serverup.json houden `stack` — dat leest
niemand, en hernoemen zou opgeslagen gegevens en URL's breken
- de aparte sectie "Overige containers" is verdwenen. Handmatig gestarte
containers staan nu tussen de rest met het label "Handmatig gestart", met
starten, stoppen en logs. De zoekterm geldt voor allebei; een
categoriefilter laat ze vallen, want ze hebben geen categorie
- de waarschuwing bij backups zei nog dat appdata er niet in zit; sinds
v0.7.88 zit die er juist wel in, met een databasedump erbij
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- LIBRARY_DIR, DATA_DIR en BACKUP_DIR worden afgeleid van BASE_DIR in plaats
van hard op /opt/serverup te staan
- docker-compose geeft BASE_DIR nu ook aan de container door; die stond alleen
in de mount, dus de app bleef /opt/serverup voorstellen bij een /srv-mount
- het installatieformulier vult appdata_dir met de ingestelde DATA_DIR, zodat
alle 286 sjablonen de juiste map voorstellen
- Instellingen → Paden heeft een hoofdmap met afgeleide submappen, een
kopieerknop per pad en "Alles overnemen"
- nieuw GET /api/paths/check: is het pad schrijfbaar en binnen de gemounte
BASE_DIR, met de .env-regel als dat niet zo is
- nieuw POST /api/paths/move: stacks stoppen, kopiëren, controleren, paden in
compose/.env/metadata omschrijven, stacks starten en pas dán het oude
opruimen
- jobs.voortgang() plus een voortgangsbalk boven het terminallog
- core/paden.py met meten, bereikbaarheid, verhuizen en omschrijven
- docs/installeren.md en .env.example beschrijven BASE_DIR als de manier om
alles te verplaatsen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- /api/ports/check bestond al en kijkt naar wat Docker publiceert en naar wat
er rechtstreeks op de host luistert, maar het installatieformulier riep hem
nergens aan. Er stond hooguit een regeltje als de standaardwaarde bezet was;
typte je zelf iets, dan hoorde je niets
- Een poortveld heeft nu een min- en plusknop, een vergrootglas om te
controleren, en een melding: vrij, of bezet en door welke container, met een
knop om naar de eerstvolgende vrije poort te springen. De controle loopt ook
bij het openen van een stap
- Kan de host niet uitgelezen worden, dan zegt de melding dat "vrij" een
aanname is in plaats van dat te verzwijgen
- De knoppen zitten alleen op velden die ook echt een poort zijn; puid en pgid
zijn ook getallen
- De installatiemodal is op een telefoon schermvullend, met de kop en de
knoppenbalk vast en alleen de inhoud die scrollt. Vorige en Volgende vullen
samen de breedte
- Sluitknop in de kop van de modal: schermvullend betekent geen achtergrond meer
om op te tikken, en die was er nog niet
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- filteredStore() werd per repo drie keer per reactieve tick aangeroepen (in de
x-show, de x-for en de teller in het filtermenu) en liep elke keer alle apps
langs met een toLowerCase() per veld. Bij elke toetsaanslag. De catalogus ging
deze reeks van 142 naar 286 apps en dat begon te merken; het filteren gebeurt
nu een keer per filterstand
- Nog maar zestig kaarten tegelijk in de DOM, met een knop Nog N tonen eronder.
De limiet valt terug zodra je het filter of de zoekterm wijzigt
- Het zoekveld wacht 200 ms voordat het filtert
- 28 apps in de dunste hoeken: 2FAuth, Passbolt, OpenBao, Trivy, Verdaccio,
Docker Registry, MkDocs Material, LiteLLM, Flowise, Speaches, Pelican Panel,
Gameyfin, EmulatorJS, Mainsail, Fluidd, Kanboard, Wekan, Filestash,
Linkwarden, Slash, RSSHub, Apprise, Mailpit, Dashy, Plausible, NetBird,
LibreSpeed en PinePods
- Alle 318 images opnieuw tegen hun registry gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Het auditlog toonde ruwe id's als 'store', 'reconfigure' en
'credentials_view'. Die hebben nu namen, ook in de filterlijsten, en de
kolomkoppen zijn vertaald in plaats van hardgecodeerd Nederlands. Onbekende
waarden vallen terug op de ruwe tekst zodat een module niets kapotmaakt
- Nieuwe test die de broncode afloopt en elke audit.log() zonder vertaling
aanwijst
- Een modulepagina heette in de titelbalk letterlijk 'mod:mijnmodule'
- De store herkende een installatie aan de mapnaam: een stack telde alleen mee
als hij 'sonarr' of 'sonarr-...' heette. Wie zijn stack 'media-tv' noemde
kreeg te zien dat Sonarr niet geinstalleerd was. Nu via de source uit
.serverup.json, met een duidelijk Geinstalleerd-label per installatie waar je
op kunt klikken om ernaartoe te gaan
- Twaalf icoonknoppen per stack werden op een telefoon drie rijen plaatjes
zonder naam. Daar blijven starten, herstarten en logs staan, plus een menu met
de rest, mét namen. Op een breed scherm verandert er niets
- De rij van twintig categorieknoppen boven de stacks is hetzelfde compacte menu
geworden als in de app store
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Twintig categorieknoppen en veertien labelknoppen stonden altijd uitgeklapt
boven de store; bij 256 apps vulde dat een half scherm. Nu een knop Filter
met een popover: categorieen in een raster van twee kolommen met kleur en
aantal, labels met een eigen zoekveld, en onderaan het aantal resultaten met
een wisknop. Sluit met Escape of door ernaast te klikken
- De labelfilter werkte maar half: de rij was afgekapt op veertien terwijl er
297 labels zijn, dus 283 daarvan waren niet te kiezen. Het menu zoekt nu in
de volledige lijst; zonder zoekterm de veertig meest gebruikte, en een gekozen
label blijft zichtbaar ook als het zeldzaam is
- Actieve filters staan als chips naast de knop, met een kruisje per stuk. Het
zoekveld heeft een wisknop
- Nieuwe test die het hele sjabloon op gebalanceerde HTML-tags controleert. Een
verkeerd geplaatste </div> schuift de rest van de pagina in een andere tak en
dat merk je anders pas in de browser
- Nieuwe JS-tests voor de filterlogica: filteren op categorie en label, de
teller, wissen, en zoeken naar een zeldzaam label
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Nieuwe metadata-sleutel depends_on: een sjabloon kan zeggen welke andere app
het nodig heeft en waarom. Het installatiescherm toont dat voor het invullen,
met een knop naar dat sjabloon. Advies, geen blokkade -- de broker of Home
Assistant kan net zo goed op een andere machine staan
- De reden is verplicht; een waarschuwing zonder uitleg klik je weg. De korte
vorm ["mosquitto"] werkt ook, voor sjablonen uit externe repo's
- Toegepast op acht sjablonen waar het gemis onzichtbaar was: zigbee2mqtt,
alloy, alertmanager, node-exporter, cadvisor, collabora, double-take, soularr.
Niet op element, open-webui, exportarr, unpackerr en onlyoffice: die werken
met meerdere alternatieven, en depends_on kent geen "een van deze"
- Vijftien domotica-apps, van 12 naar 27 in die categorie: Piper, Whisper en
openWakeWord (spraakbediening van Home Assistant, tot nu toe volledig
afwezig), Matter Server, Matter Hub, AppDaemon, go2rtc, Double Take,
Domoticz, openHAB, DSMR-reader (P1-poort slimme meter), rtl_433 (433 MHz
sensoren naar MQTT), Traccar, Snapcast en EMQX
- Catalogus van 241 naar 256 apps; alle 285 images gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Sjablonen kunnen nu secret_format ("hex" of "laravel") en secret_bytes
opgeven. De generator maakte altijd url-veilige base64, en dat is precies wat
Laravel, Homarr en LibreChat weigeren
- Daarmee kwamen twee fouten uit v0.8.00 aan het licht: Homarr en LibreChat
kregen sleutels die hun containers niet accepteren. Rechtgezet
- Snipe-IT en Invoice Ninja alsnog toegevoegd; die vielen vorige ronde af omdat
hun APP_KEY niet te genereren was
- 19 vervangers voor big tech erbij, van 197 naar 218 apps:
Baikal en Radicale (Google Agenda/Contacten), LibreTranslate (Translate),
CryptPad, Collabora en ONLYOFFICE (Google Docs), Formbricks (Forms),
Jitsi Meet (Meet/Zoom), PeerTube, Invidious en Tube Archivist (YouTube),
Owncast (Twitch), Mastodon (X), Pixelfed (Instagram), Lemmy (Reddit),
Cal.com (Calendly), Rallly (Doodle), DocuSeal (DocuSign), Penpot (Figma)
- Communicatie van 12 naar 16 apps, productiviteit van 21 naar 31
- Nieuwe JS-test voor de sleutelformaten; alle 242 images in de catalogus
opnieuw tegen hun registry gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Elk *arr-onderdeel is nu ook een losse app in de store (46 nieuwe sjablonen);
los en gebundeld komen uit één bron (tools/arr_sjablonen.py) met een test die
bewaakt dat ze niet uiteen lopen
- Alles deelt één /data-map, zodat hardlinks werken; losse /tv-, /movies- en
/downloads-mounts zijn eruit, UMASK=002 erbij
- Nieuwe eerste stap "Onderdelen" in het invulmenu, met kopjes per soort; de
dubbele groepsschakelaar en de lege kaarten in Instellingen zijn weg
- Eigen IP-adres per container in plaats van per stack; containers zonder adres
houden hun poortmapping. Ook Pangolin publiceert nu per container
- Huntarr vervangen door NeutArr (project offline na lekken, image bestaat niet
meer), Maintainerr naar zijn nieuwe organisatie
- 31 apps toegevoegd uit het *arr-ecosysteem, alle images tegen hun registry
gecontroleerd
- data_dir hernoemd naar appdata_dir in de hele catalogus, naast de nieuwe
data_root; qBittorrent van poort 8080 naar 8097
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
De knop Volgende deed niets. Alpine haalt een boolean-attribuut alleen weg bij
null, undefined of false; het getal 0 zet het juist AAN. Mijn
:disabled="stepMissing().length" gaf bij een ingevuld formulier 0 en zette de
knop dus permanent uit. De logica klopte, de binding niet — met losse logica
niet te vinden, dus er draait nu een test die de echte modal met Alpine in een
DOM rendert en erop klikt.
Tijdzones:
- Nieuwe instelling TIMEZONE, standaard die van de server (TZ, /etc/timezone,
/etc/localtime). In alle 77 sjablonen stond Europe/Amsterdam hard ingevuld.
- Apps zonder tijdzoneveld krijgen TZ er automatisch bij; die draaiden in UTC.
Poorten:
- _bezette_poorten() telt nu ook mee waar de host zelf op luistert, gelezen uit
/proc/net/tcp in een hulpcontainer met --network host. Een nginx buiten
Docker zag Server Up eerder niet.
- GET /api/ports/check geeft vrij/bezet plus een alternatief, en meldt of de
host echt gecontroleerd kon worden.
Netwerken:
- APP_NETWORKS: meerdere gedeelde bridge-netwerken in plaats van één waar élke
app aan hing. Per app kies je welke; aanmaken kan vanuit het invulmenu, met
eigen naam of een voorstel (su-<appnaam>).
- add_shared_network() accepteert een lijst; één naam blijft werken.
- GET /api/networks/<n>/ip-check controleert subnet, bereik, Docker-toewijzing
en de ARP-tabel van de host (vangt een fysiek apparaat met DHCP-adres) en
stelt een vrij adres voor.
Pangolin (nieuw, core/pangolin.py):
- Publieke URL per app via een tunnel, zonder poorten open te zetten.
- De API veranderde in 1.9 (resource hing onder een site, staat nu los); beide
routes worden geprobeerd en bij een fout krijg je beide meldingen.
- API-sleutel is write-only. Getest tegen een nagebouwde API, niet tegen een
echte server.
Nieuw: docs/pangolin.md; docs/netwerken.md uitgebreid. 2369 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
Invulmenu:
- Vaste stappen (Basis, Verbinden, Instellingen, Toegang, Controleren) in
plaats van één lange lijst. Eén stap per groep werkt niet: de mediane app
heeft één groep, arr-stack eenentwintig. Lege stappen worden overgeslagen.
- Volgende controleert de verplichte velden van die stap; die melding kwam
eerder pas bij het installeren.
- Geavanceerde opties achter één schakelaar die op elke stap zichtbaar is,
plus 'Alles op één pagina' voor het oude gedrag. Beide onthouden.
Geheimen naar .env:
- compose_transform.geheimen_naar_env() vervangt geheime waarden door
${NAAM} en schrijft ze naar .env met rechten 0600. Werkt ook midden in
een database-URL. Poorten en paden blijven leesbaar in compose.
- .serverup.json bevat geen geheimen meer en krijgt ook 0600; daar stonden
ze wereldleesbaar in. Het herconfiguratieformulier leest ze terug uit
.env via een bewaarde veld-naar-sleutel-koppeling.
- docs/beveiliging.md legt uit wat dit niet oplost: docker inspect toont de
waarde nog steeds.
Bewerken:
- Laatste stap toont het gerenderde resultaat met jouw waarden en is
bewerkbaar; compose_override/env_override gaan mee bij het installeren.
Ongeldige YAML wordt geweigerd voordat er een map bestaat.
- De bestaande editor heeft tabbladen (compose/.env) en biedt herstarten na
opslaan. De .env-PUT weigert een regel zonder '=' en logt in audit.
Inloggegevens:
- /api/stacks/<n>/credentials plus paneel op de stackkaart: adres,
gebruikersnaam, wachtwoord achter een oog-knop, kopieerknop. Alleen voor
beheerders, elk bekijken komt in het auditlog.
- Nieuw 'credential'-kenmerk in template.json met naamherkenning als
terugval, zodat de bestaande 96 sjablonen meteen werken.
Herstel van een regressie uit v0.7.60: acht inlogwachtwoorden hadden hun
genereerknop verloren toen die aan 'generate' werd gehangen. Terug, behalve
waar een verzonnen waarde fout is (WireGuard-sleutel, externe tokens).
De menulogica wordt getest door de echte component uit index.html in Node uit
te voeren; slaat zichzelf over waar node ontbreekt. 2295 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb