18 KiB
HANDOFF.md
Project: DockDeck Updated: 2026-07-22
Current status
Release 9236094 draait vanaf main op 192.168.10.150:1218. De bestaande .env bleef byte-identiek, het named volume, de configuratie en de geüploade wallpaper van 3.245.835 bytes zijn behouden. Image 1cf11fc02e7e… is healthy met 0 herstarts. DockDeck bevat exact 90 bestaande containers, 48 zichtbare apps, 16 categorieën en 1 favoriet. De zeven livepanelen (zes apps plus Tower) zijn allemaal connected.
Current update
De actuele pass corrigeert de resterende widescreenpunten uit een echte Chrome-audit op 3440×1215. De rechter widgetdock is 540 px breed, zichtbare widget- en instellingentekst blijft minimaal 11–12 px, extreem lange beheeroppervlakken zijn begrensd en Quick Launch laadt het echte favoriete favicon. De expliciete actie Slim herindelen gebruikt geteste serviceregels en laat onbekende containers en favorieten ongemoeid. Live zijn 14 foutieve categorieën gecorrigeerd; onder meer Deluge/JDownloader2 staan bij Downloads, Glances/unraid-stats bij Monitoring en Nginx Proxy Manager bij Network & Admin.
De premium afwerkingspass is live voltooid en op 3440×1215 in Chrome gecontroleerd. App Beheer gebruikt een expliciete 52px-track met een knop die 24px tussen links en rechts beweegt. De vier genoemde beveiligings-/automatiseringsdiensten gebruiken compacte launchertegels. De topbalk toont gecachete actuele Open-Meteo-data voor Mol; Weergave bevat locatie-instellingen en een gevalideerde lokale wallpaper-upload. De placeholders DockDeck, GPU-Hot en Deluge zijn in het widgetdock vervangen door werkende compacte Authentik-, NPM- en Vaultwardenpanelen. Plex en Gitea hebben echte read-only providerdata; Home Assistant blijft correct offline zolang de container niet draait.
De daaropvolgende achtergrondfix herstelt de feitelijke rendering van Aurora, Blauwdruk, Minimaal en de geüploade wallpaper. De persistentie en wallpaper-API waren correct; een niet-bestaande CSS-token maakte de samengestelde achtergrondregels ongeldig en een te zware overlay hield de afbeelding vrijwel volledig tegen. De achtergrond wordt nu rechtstreeks op de centrale canvas samengesteld, met een afzonderlijke leesbare wallpaper-overlay per preset en expliciete E2E-dekking.
De live controle op 3440×1215 heeft alle drie presets via de instellingeninterface doorlopen. Hun berekende canvaslagen zijn onderling verschillend, de bestaande JPEG blijft in iedere preset aanwezig, er is geen horizontale overflow en Chrome rapporteert geen fouten. Blauwdruk is als actieve gebruikersvoorkeur hersteld.
De daaropvolgende wallpaperstudio corrigeert de resterende uitsnede: de afbeelding wordt voortaan tegen het zichtbare centrale viewport geschaald in plaats van tegen de volledige scrollhoogte. Passend is de veilige standaard; Vullend, horizontale/verticale focus en 80–160% zoom zijn via een gecentreerde live preview instelbaar. Deze waarden zijn server-side gevalideerd, persistent, legacy-compatibel en exporteerbaar.
De live Chrome-hercontrole op 3440×1215 meet een wallpaperstage van 2381×1143 binnen de 3015 px hoge dashboardcanvas en een gecentreerde studiopreview van 1600×686. De afbeelding is volledig geladen met Passend, 50/50-focus en 100% zoom; er is geen horizontale overflow en Chrome rapporteert geen fouten. De draftflow Vullend → Herstellen is getest zonder de opgeslagen voorkeur of wallpaper te wijzigen.
De aansluitende platformpass haalt de wallpaper uit de middenkolom. De fixed stage begint exact onder de 72px-topbalk, bestrijkt de volledige viewportbreedte en -hoogte, blijft bij scrollen staan en schakelt de presetcompositie uit zolang een wallpaper bestaat. Een ambient cover-kopie vult ultrawide zijruimte achter het scherpe instelbare beeld; de linkerrail, apptegels en rechter widgetdock zijn doorlopende glaslagen erboven. De preview weerspiegelt dezelfde compositie.
De live Chrome-audit op 3440×1215 meet de stage van x=0/y=72 tot de volledige 3425×1143 browsercontentruimte. Bij 900 px scroll blijft de stage exact op y=72, de presetcanvas is transparant, beide zijpanelen gebruiken 62% glas en er is geen horizontale overflow. Chrome rapporteert geen applicatiefouten; alleen de geïnstalleerde WideFrog-extensie schreef één eigen debug-timeout.
De categorie-icooncorrectie vult de frontendcatalogus aan met de tien eerder ontbrekende geldige waarden. Daardoor tonen Media, Downloads, Books & Documents, Photos, Home & Automation, Security & Identity, Network & Admin, Monitoring, Development & Projects, AI & ML, Databases & Storage, Infrastructure, Games & Emulation, Tools & Productivity, Experiments & Archived en Favorites ieder een eigen passend pictogram. Nieuwe categorieën kiezen automatisch een nog ongebruikte optie.
De live Chrome-hercontrole bevestigt 16 categoriekaarten, 16 verschillende opgeslagen waarden en 16 verschillende gerenderde SVG-signaturen. De categorie-iconen zijn zowel in Instellingen als bij de dashboardsecties visueel onderscheidend; Chrome rapporteert 0 waarschuwingen of fouten.
What works
-
DockDeck Canon v1 als geïntegreerd productoppervlak, gebaseerd op de expliciete Canon-bronnen uit ZIP en Stitch MCP; oudere conflicterende designrichtingen zijn genegeerd.
-
Lokale merkassets voor app/favicon/wordmark en lokaal gebundeld Geist; geen CDN- of tijdelijke beeldafhankelijkheid.
-
Launcher-first dashboards met Canon-topbar, ontdekbanner, categoriechips, apptegels en states; desktop voegt een sticky favorietenrail met klok, deckstatus en widgetbeheer toe.
-
Echte Unraid-/gebruikersiconen blijven eerste keuze; herkenbare lokale merkiconen en semantische service-iconen vervangen alle lettermonogrammen.
-
Quick Launch als modal command palette met Apps, Favorieten en Google, toetsenbordnavigatie, Enter/Escape en focusstijl.
-
Compact appsbeheer met filters, zichtbaarheid en paneelkeuze in de rij; naam/categorie/URL/icoon/sortering/verwijderen in een focus-trapped drawer met focusherstel.
-
Geïsoleerde E2E-poorten 3101/5174 zodat lokale diensten op 3000 de browsertests niet blokkeren.
-
Centrale instellingenzoeker met sectiegerichte trefwoorden en scrollherstel bij sectiewissel.
-
Persistente verminderde beweging en configureerbare globale pollingcadans, inclusief legacy-databasemigratie en export/import.
-
Canon-categoriekaarten met echte iconen/itemtellingen en veilige back-upimport met JSON-/groottevalidatie, dropzone en herstelbevestiging.
-
Expliciete slimme categorieorganisatie voor bekende homelabservices, met behoud van onbekende persoonlijke toewijzingen en favorieten.
-
Single-container read-only discovery via AppOps GET, met een gesaneerde Unraid XML/WebUI-metadataweergave en alleen voor andere hosts een optionele restricted-proxyoverlay.
-
Nieuwe containers standaard verborgen; online/offline-status en 30-secondenpolling die pauzeert op verborgen tabs.
-
Verdwenen containers worden na een geslaagde autoritatieve inventarislezing automatisch uit DockDeck verwijderd; degraded inventarischecks verwijderen niets. Terugkerende/actief geworden containers en hoofdlettervarianten krijgen bij iedere heartbeat hun actuele status zonder dubbele offline records.
-
Volledig appbeheer: zichtbaarheid, naam, categorie, sortering, lokale/externe URL-override en icoonfallback.
-
Apps kunnen permanent uit DockDeck worden verwijderd en blijven op technische containernaam onderdrukt bij volgende discovery; Docker blijft onaangeraakt.
-
Categorieën, favorieten, totaaloverzicht en categorie-tabs.
-
Zoekoverlay voor apps/favorieten plus Google-fallback; alle doelen in een nieuw tabblad.
-
De zoekindex bevat actuele namen, technische namen, categorieën, images, URL's, verborgen apps, favorieten en Tower; hernoemen werkt zonder stale index.
-
Porcelain, Midnight en Harbor, vier accenten, drie dichtheden, drie contentbreedtes en drie achtergronden; alle voorkeuren zijn persistent.
-
Vloeiende mobiele, tablet-, desktop- en ultrawide-layouts met optionele hero/statusweergave en lokale fonts.
-
Doorzoekbaar appbeheer met zichtbaarheidsfilters, volledig favorietenbeheer en configureerbare categorie-iconen.
-
Configureerbare read-only servicewidgets voor maximaal acht containers met compact/standaard/breed formaat, app-specifieke informatieblokken en eerlijke provider-/infrastructuurstatus.
-
Onafhankelijke widgetvolgorde, statselectie/-volgorde/-limiet, metricvolgorde, value/gauge/progress-presentatie, custom label, waarschuwing op iedere numerieke metric, refreshcadans, configureerbare lijn-/vlak-/staafgrafiek tot 60 punten en directe toetsenbordtoegankelijke dashboardeditmodus.
-
Layoutpresets kunnen los van de volledige backup worden opgeslagen, toegepast, verwijderd, geëxporteerd en geïmporteerd.
-
Een standaard inschakelbare Unraid-hostwidget met eigen formaat-/inhoudskeuzes, selecteerbare serverstats en configureerbare grafieken voor containers, images, geheugen, opslag, temperatuur, parity en UPS.
-
Native Unraid array-, parity-, disk-/pool-, temperatuur- en optionele UPS-data via minimale read-only mounts.
-
Provider-aware read-only verrijking voor AdGuard, Plex, Immich, Home Assistant en Sonarr/Radarr/Lidarr; zonder credential blijft iedere kaart werken met Dockerstats.
-
Uitgebreide GET-only providers voor Gitea, Jellyfin, Seerr, Prowlarr, Authentik, NPM, Portainer, Grafana, Prometheus en Nextcloud, plus configureerbare GET-only bridges voor Deluge, qBittorrent, JDownloader, Tdarr, Bazarr en Vaultwarden.
-
Widget Studio met zoeken, aanbevolen/alle/actieve filters, zichtbare metricfeatures, credentialstatus, acht-panelencapaciteit en directe activatie.
-
Widget Studio dekt alle 97 opgeslagen apps met 97 expliciete live-inventarisprofielen voor applicaties, API's, frontends, workers, databases, caches, mail, GPU, queues en eigen projecten; er rest geen generiek profiel.
-
Per app zijn metriclabels zichtbaar/verbergbaar, tot 24 labels rangschikbaar en persistent in SQLite, presets en exports.
-
Apps zonder native provider ondersteunen een optionele GET-only JSON-URL en bearer-token rechtstreeks vanuit hun Widget Studio-kaart; secrets blijven server-side.
-
Audiobookshelf, Netdata en PeerTube hebben aanvullende native GET-only adapters.
-
Tower-naam en Unraid WebUI-URL zijn persistent instelbaar; een URL zonder poort krijgt standaard
5000. -
Nieuwe providerwidgets voor Ollama en Glances (zero-config via ontdekte URL), plus Tautulli en Paperless-ngx met minimum-scope credential.
-
Extra app-specifieke Dockerpresentaties voor AI-runtimes, documentworkflows en beveiligde diensten.
-
Provider-specifieke, gemaskeerde credentialformulieren onder Settings → Integrations; writes zijn same-origin, worden nooit geëchood of geëxporteerd en testen de verbinding direct.
-
App-specifieke fallbackkaarten: JDownloader toont actuele download-/uploadsnelheid en AdGuard DNS-verkeer plus een duidelijke API-lockstatus; andere servicetypen krijgen eigen labels en betekenisvolle workloadweergave.
-
Automatische first-party favicons voor favorieten, met handmatige override en lokale merk-/semantische fallback.
-
Informatief desktopzijpaneel met klok, deck health en snelle links; bredere content- en tegelverdeling op 2560/3440-schermen.
-
Favorieten staan als faviconlinks in het scrollbare desktopzijpaneel en de Tower-titel opent rechtstreeks de geconfigureerde Unraid-URL.
-
Dashboard en instellingen schalen op dezelfde platformbreedte tot ultrawide; vanaf 1900 px staat de widgetlaag als rechterdock open en gebruikt de appgrid de extra ruimte met begrensde kaartbreedtes.
-
Quick Launch toont zonder zoekterm functionele snelkoppelingskaarten en gebruikt bij favorietresultaten dezelfde echte favicon-/override-/fallbackketen als het dashboard.
-
Dashboardcategorieknoppen filteren in zowel overzichts- als categoriemodus; de geselecteerde categorie beperkt tegelijk apps en favorieten.
-
De topbalk behoudt op Dashboard en Instellingen dezelfde merk-, zoek-, navigatie- en actiekolommen. Dashboard/Instellingen hebben zichtbare hover- en focusstates en Instellingen biedt ook handmatige statusverversing.
-
Integraties gebruikt geen compacte kaartmatrix meer maar brede configuratieregels met leesbare URL-/credentialvelden. Paneelstudio toont een duidelijke kies-toevoegen-afstemmenflow en één brede service per rij.
-
SQLite-persistentie, idempotente eerste migratie en versie 1 export/import zonder secrets.
-
Optionele read-only NPM-hostlezing en ondubbelzinnige matching met veilige fallback.
-
Productiebuild, health endpoint, Dockerfile, hardened Compose en veilige Gitea-init/pushscript.
-
Installable PWA-shell zonder API-cache, freshness/stale-cache en secretvrije operationele diagnostics.
Directe Stitch-pass
- Het dashboard volgt nu rechtstreeks de Canon-volgorde: compacte topbar, begroeting/ontdekking, categoriepilletjes, favorieten, standaard servicekaarten en brede featurekaarten.
- Quick Launch gebruikt de centrale Canon-sheet met gegroepeerde Apps, Favorieten en Google, inclusief toetsenbordselectie.
- App Beheer is de Canon-tabel met status, categorie, zichtbaarheid en actie; de editor is een vaste rechter drawer met zichtbaarheid, categorie en echte URL-contracten.
- Weergave zet de drie themapreviews en de Canon-keuzes voor dashboardmodus/grid-dichtheid in de eerste viewport; aanvullende bestaande voorkeuren blijven lager beschikbaar.
- De mobiele compositie gebruikt de Canon-ontdekkaart, aparte zoekbalk, ronde categorieknoppen, touchvriendelijke kaartfamilies en vaste ondernavigatie.
- Read-only servicepanelen zijn opnieuw een zichtbare Stitch-sectie op desktop en staan op compactere viewports na de launcherinhoud; de volledige Paneelstudio blijft rechtstreeks bereikbaar onder Instellingen → Algemeen.
- Finale screenshots staan in
docs/design/dockdeck-canon-v1/implementation/en worden door Playwright op 390×844, 768×1024, 1440×900 en 3440×1440 vastgelegd.
Run instructions
Lokaal:
cp .env.example .env
npm install
npm run dev
Open http://127.0.0.1:5173. Met MOCK_DISCOVERY=true worden deterministische voorbeeldcontainers gebruikt. Lokale data staat in ./data/dockdeck.db.
Unraid gebruikt deploy/unraid.env.example als .env:
DOCKDECK_BIND_ADDRESS=192.168.10.150
DOCKDECK_PORT=1218
DOCKDECK_EGRESS_SUBNET=172.31.240.16/28
APPOPS_URL=http://192.168.10.150:1216
UNRAID_TEMPLATES_DIR=/mnt/user/appdata/dockdeck/unraid-templates
UNRAID_HOST=192.168.10.150
python3 deploy/sanitize-unraid-templates.py \
/boot/config/plugins/dockerMan/templates-user \
/mnt/user/appdata/dockdeck/unraid-templates
docker compose up -d --build
docker compose ps
sh deploy/refresh-unraid-icon.sh
De deployment staat in /mnt/user/appdata/dockdeck. De base Compose bevat één service/container met de naam DockDeck; docker-compose.socket-proxy.yml is alleen een fallback voor een host zonder AppOps. De standaardpoort is 1218 en bindt zonder override alleen op 127.0.0.1. De huidige deployment bindt bewust aan 192.168.10.150 voor het vertrouwde LAN. Bescherm iedere reverse-proxyroute, want de MVP heeft geen login. Persistente data staat in named volume dockdeck_dockdeck_data: configuratie in /data/dockdeck.db en via Settings ingevoerde secrets in /data/integrations.env (0600). Bescherm ruwe volumeback-ups.
Validation
npm run format:check
npm run lint
npm run typecheck
npm test
npm run test:security
npm run test:e2e
npm run build
npm audit --audit-level=moderate
Laatste gate: format, lint en typecheck groen; 48/48 unit-/integratietests; 5/5 securitytests; 12 uitgevoerde en 12 project-gededupliceerde Playwright-checks op vier viewports; production build; 0 kwetsbaarheden. Op Tower zijn docker compose config --quiet, imagebuild en up -d geslaagd. De live container is healthy met 0 herstarts, AppOps leest 90 containers GET-only en de browseraudit rapporteert 0 consolefouten/-warnings.
Latest local gate
Format, lint en typecheck zijn groen; 48/48 unit-/integratietests; 5/5 securitytests; 12 uitgevoerde en 12 project-gededupliceerde Playwright-checks op vier viewports; production build; 0 kwetsbaarheden. De clientbuild is 364,55 kB JS (113,69 kB gzip) en 170,68 kB CSS (28,53 kB gzip); de serverbundle is 167,2 kB. De live browseraudit op 1440×900 mat op beide pagina's topbar left=32/height=72, settings-sidebar left=0, geen overflow en een werkende hoverstate. De schone live tab rapporteerde 0 consolefouten/-warnings; alle 5 lokaal ontdekte Unraid-iconen gaven HTTP 200.
Environment
- App:
HOST,PORT,DATABASE_PATH,INTEGRATION_ENV_PATH,POLLING_INTERVAL_MS. - Deployment:
DOCKDECK_BIND_ADDRESS,DOCKDECK_PORT,DOCKDECK_EGRESS_SUBNET. - Discovery: standaard
APPOPS_URL; optioneelDOCKER_PROXY_URLvia de fallbackoverlay; daarnaastUNRAID_TEMPLATES_PATH,UNRAID_ICONS_SOURCE_PATH,UNRAID_ICONS_PATH,UNRAID_HOSTenUNRAID_URL.MOCK_DISCOVERYis alleen voor dev/test. - Optioneel NPM: aanbevolen
NPM_URL+NPM_TOKEN, ofNPM_USERNAME+NPM_PASSWORD. - Optionele widgets: bestaande providercredentials,
AUDIOBOOKSHELF_TOKENen per-appCUSTOM_WIDGET_<APP>_URL/_TOKEN; alles is via Widget Studio instelbaar. URL's worden waar mogelijk uit discovery afgeleid. Ollama, Glances, Netdata en PeerTube hebben standaard geen credential nodig. - Repository:
GITEA_URL,GITEA_OWNER,GITEA_TOKENvoornpm run gitea:init.
Repository status
- Lokale Git-branch:
codex/stitch-canon-ui-upgrade. - Remote:
originis geconfigureerd alsgitea-widefrog:NuklearRabbit/DockDeck.git. - Private repository:
NuklearRabbit/DockDeck; SSH-auth werkt encodex/stitch-canon-ui-upgradevolgt de gelijknamige gepushteorigin-branch.
Open external checks
- Indien gewenst: NPM-token instellen en één ondubbelzinnige externe host controleren.
- Na wijzigingen aan Unraid-templates: de sanitizer opnieuw uitvoeren en DockDeck synchroniseren.
- De huidige testrelease zelf beoordelen op
http://192.168.10.150:1218. De live codevervanging naar commit41942d5is uitgevoerd via SSH-aliasunraid-widefrog; imageaf96b8ac7a04...draait healthy met 0 restarts. De live configuratiecategorieën zijn herverdeeld over 16 categorieën; export-backup staat lokaal in.codex-input/dockdeck-categories-before-20260722-052942.json.
Rollback
Gebruik de vorige stabiele Git-commit/image. Herstel dockdeck_dockdeck_data uit een beveiligde volumeback-up of importeer een versie 1 configuratie-export. De JSON-export bevat geen secrets; herstel die via Settings/deploymentenvironment of uit de apart beschermde volumeback-up.