v0.7.10-beta - categorieen met kleur in de app store en bij je apps
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m10s

- Nieuw core/categories.py: zeventien categorieen, elk met naam (nl/en), kleur
  en pictogram. Kleuren zijn middentonen die in licht en donker leesbaar zijn;
  de interface gebruikt ze als tekstkleur op een doorzichtige variant.
- Alle 96 apps ingedeeld via metadata.categories. Een app mag in meerdere
  categorieen zitten; 39 apps doen dat (Frigate onder domotica en media,
  Immich onder fotos en opslag, Kavita onder media en documenten).
- Apps uit externe repos geven geen categorieen op; die worden afgeleid uit
  tags en omschrijving, zodat ook zij een kleur en een plek in het filter
  krijgen.
- App store: gekleurde categoriebalk met aantallen, klikbare badges per app,
  werkt naast het bestaande zoekveld en de tagfilters.
- Stackslijst: dezelfde balk met alleen de categorieen die je draait, gekleurde
  rand per kaart en klikbare badges.
- Nieuw /api/categories geeft de definities met kleur, zodat interface en
  backend dezelfde kleur voor dezelfde categorie gebruiken. /api/stacks geeft
  de categorieen mee; een stack van voor deze versie valt terug op "overig"
  in plaats van kleurloos te blijven.
- Tests: elke app heeft geldige categorieen, kleuren zijn uniek, en er staat
  geen categorie in het filter zonder apps.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
This commit is contained in:
Ramon 2026-07-27 14:14:25 +02:00
parent 4450b3c171
commit ff1979ba51
105 changed files with 1286 additions and 200 deletions

View file

@ -1,3 +1,42 @@
# v0.7.10-beta — Categorieën met kleur, in de app store en bij je apps
Alle 96 apps zijn ingedeeld in zeventien categorieën, elk met een eigen kleur en
pictogram. Een app mag in meerdere categorieën zitten: Frigate staat onder
Domotica én Media, Immich onder Foto's én Opslag, Kavita onder Media én
Documenten. Negenendertig apps vallen onder meer dan één.
| | Categorie | | Categorie |
|---|---|---|---|
| 🟣 | Media | 🔵 | Netwerk |
| 🩷 | Foto's | 🔴 | Beveiliging |
| 🟢 | Downloaden | 🟠 | Opslag & backup |
| 🟩 | Domotica | 🩵 | Documenten |
| 🟦 | 3D-printen | 🟦 | Productiviteit |
| 🔷 | Communicatie | 🟩 | Financiën |
| 🌸 | Gezin & huishouden | 🟧 | Monitoring |
| 🩵 | Ontwikkeling | 🟪 | AI |
| ⬜ | Systeembeheer | | |
**In de app store** staat een gekleurde categoriebalk met per categorie het
aantal apps. Klikken filtert; het bestaande zoekveld en de tagfilters werken
ernaast gewoon door. Elke app-kaart toont zijn categorieën als gekleurde badge,
en klikken op zo'n badge filtert er meteen op.
**Bij je geïnstalleerde apps** staat dezelfde balk, met alleen de categorieën die
je daadwerkelijk draait. Elke stackkaart heeft een gekleurde rand in de kleur van
zijn eerste categorie, plus dezelfde klikbare badges.
Apps uit externe repo's (zoals de ChristianLempa-boilerplates) geven geen
categorieën op. Die worden afgeleid uit hun tags en omschrijving, zodat ook zij
een kleur en een plek in het filter krijgen in plaats van als naamloze groep
buiten de indeling te vallen.
Tests bewaken dat elke app minstens één geldige categorie heeft, dat de kleuren
onderling verschillen, en dat er geen categorie in het filter staat waar geen
enkele app onder valt.
---
# v0.7.00-beta — Apps koppelen, eenvoudiger instellen, geavanceerde opties verborgen
## 🔗 Apps kunnen elkaar nu bereiken

View file

@ -1 +1 @@
0.7.00-beta
0.7.10-beta

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Actual Budget",
"description": "Lokaal persoonlijk financieel beheer en budgettering zonder cloudafhankelijkheid.",
"tags": ["financiën", "budget", "persoonlijk", "privacy"],
"icon": {"provider": "selfhst", "id": "actual-budget"},
"version": {"name": "latest"}
"tags": [
"financiën",
"budget",
"persoonlijk",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "actual-budget"
},
"version": {
"name": "latest"
},
"categories": [
"financien"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "AdGuard Home",
"description": "DNS-level advertentie- en trackerblokkering voor het hele netwerk",
"tags": ["dns", "adblock", "netwerk", "privacy"],
"icon": {"provider": "selfhst", "id": "adguard-home"},
"version": {"name": "latest"}
"tags": [
"dns",
"adblock",
"netwerk",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "adguard-home"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{

View file

@ -16,7 +16,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media",
"downloaden"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"beveiliging"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"gezin"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"3d-printen"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"ontwikkeling",
"productiviteit"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"monitoring"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "2"
}
},
"categories": [
"netwerk",
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media",
"documenten"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Changedetection.io",
"description": "Monitor websites op wijzigingen en ontvang meldingen zodra er iets verandert.",
"tags": ["monitoring", "websites", "alerting", "automatisering"],
"icon": {"provider": "selfhst", "id": "changedetection-io"},
"version": {"name": "latest"}
"tags": [
"monitoring",
"websites",
"alerting",
"automatisering"
],
"icon": {
"provider": "selfhst",
"id": "changedetection-io"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring"
]
},
"variables": [
{
@ -44,7 +57,9 @@
"default": "",
"required": false,
"description": "Optioneel wachtwoord om de webinterface te beveiligen. Laat leeg voor geen beveiliging.",
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"ontwikkeling",
"beveiliging"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Dozzle",
"description": "Realtime Docker container log viewer in je browser. Geen data opgeslagen, lichtgewicht.",
"tags": ["docker", "logs", "monitoring", "beheer"],
"icon": {"provider": "selfhst", "id": "dozzle"},
"version": {"name": "latest"}
"tags": [
"docker",
"logs",
"monitoring",
"beheer"
],
"icon": {
"provider": "selfhst",
"id": "dozzle"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring",
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"opslag"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "stable"
}
},
"categories": [
"domotica",
"ontwikkeling"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"productiviteit"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "File Browser",
"description": "Webgebaseerde bestandsbeheerder voor je server: uploaden, downloaden, delen en bewerken.",
"tags": ["bestanden", "beheer", "cloud", "opslag"],
"icon": {"provider": "selfhst", "id": "filebrowser"},
"version": {"name": "latest"}
"tags": [
"bestanden",
"beheer",
"cloud",
"opslag"
],
"icon": {
"provider": "selfhst",
"id": "filebrowser"
},
"version": {
"name": "latest"
},
"categories": [
"opslag"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"financien"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"productiviteit"
]
},
"variables": [
{

View file

@ -3,9 +3,24 @@
"metadata": {
"name": "Forgejo MCP Server",
"description": "MCP-server voor Forgejo en Gitea. Laat AI-assistenten zoals Claude je repositories, issues, pull requests en releases beheren via natuurlijke taal.",
"tags": ["mcp", "ai", "forgejo", "gitea", "claude"],
"icon": {"provider": "selfhst", "id": "forgejo"},
"version": {"name": "latest"}
"tags": [
"mcp",
"ai",
"forgejo",
"gitea",
"claude"
],
"icon": {
"provider": "selfhst",
"id": "forgejo"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling",
"ai"
]
},
"variables": [
{
@ -38,7 +53,9 @@
"default": "https://jouw-forgejo-url",
"required": true,
"description": "Volledige URL van je Forgejo- of Gitea-instantie",
"config": {"placeholder": "https://git.example.com"}
"config": {
"placeholder": "https://git.example.com"
}
},
{
"name": "forgejo_token",
@ -47,7 +64,9 @@
"default": "",
"required": true,
"description": "Maak een token aan via Forgejo → Instellingen → Toepassingen → Access Tokens. Geef minimaal 'repository' en 'issue' schrijfrechten.",
"config": {"placeholder": "jouw-api-token"}
"config": {
"placeholder": "jouw-api-token"
}
}
]
}

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Forgejo",
"description": "Lichtgewicht zelfgehoste Git-server. Actief onderhouden community-fork van Gitea.",
"tags": ["git", "code", "versiebeheer", "ontwikkeling"],
"icon": {"provider": "selfhst", "id": "forgejo"},
"version": {"name": "latest"}
"tags": [
"git",
"code",
"versiebeheer",
"ontwikkeling"
],
"icon": {
"provider": "selfhst",
"id": "forgejo"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "stable"
}
},
"categories": [
"domotica",
"media"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Ghost",
"description": "Professioneel blogplatform en CMS met abonnementen, nieuwsbrieven en moderne editor.",
"tags": ["blog", "cms", "publiceren", "nieuwsbrief"],
"icon": {"provider": "selfhst", "id": "ghost"},
"version": {"name": "latest"}
"tags": [
"blog",
"cms",
"publiceren",
"nieuwsbrief"
],
"icon": {
"provider": "selfhst",
"id": "ghost"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{
@ -44,7 +57,9 @@
"default": "http://localhost",
"required": true,
"description": "Volledige URL van je Ghost-site, inclusief protocol",
"config": {"placeholder": "https://mijn-blog.nl"}
"config": {
"placeholder": "https://mijn-blog.nl"
}
}
]
},
@ -57,7 +72,9 @@
"title": "Database wachtwoord",
"default": "ghost_db_pass",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Gotify",
"description": "Eenvoudige push-notificatieserver voor je eigen apparaten, scripts en apps.",
"tags": ["notificaties", "push", "messaging", "alerts"],
"icon": {"provider": "selfhst", "id": "gotify"},
"version": {"name": "latest"}
"tags": [
"notificaties",
"push",
"messaging",
"alerts"
],
"icon": {
"provider": "selfhst",
"id": "gotify"
},
"version": {
"name": "latest"
},
"categories": [
"communicatie"
]
},
"variables": [
{
@ -44,7 +57,9 @@
"default": "admin",
"required": true,
"description": "Wijzig dit na de eerste aanmelding",
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Grafana",
"description": "Visualiseer metrics, logs en traces in aanpasbare dashboards.",
"tags": ["monitoring", "dashboards", "metrics", "visualisatie"],
"icon": {"provider": "selfhst", "id": "grafana"},
"version": {"name": "latest"}
"tags": [
"monitoring",
"dashboards",
"metrics",
"visualisatie"
],
"icon": {
"provider": "selfhst",
"id": "grafana"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring"
]
},
"variables": [
{
@ -51,7 +64,9 @@
"default": "admin",
"required": true,
"description": "Wijzig dit na de eerste aanmelding",
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"gezin"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"documenten",
"productiviteit"
]
},
"variables": [
{

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "Home Assistant",
"description": "Open-source domotica platform voor het automatiseren van je slimme huis.",
"tags": ["domotica", "smart-home", "automatisering"],
"icon": {"provider": "selfhst", "id": "home-assistant"},
"version": {"name": "stable"}
"tags": [
"domotica",
"smart-home",
"automatisering"
],
"icon": {
"provider": "selfhst",
"id": "home-assistant"
},
"version": {
"name": "stable"
},
"categories": [
"domotica"
]
},
"variables": [
{

View file

@ -3,9 +3,24 @@
"metadata": {
"name": "Home Assistant MCP Server",
"description": "MCP-server voor Home Assistant. Laat AI-assistenten zoals Claude je slimme apparaten bedienen, automations beheren en statussen opvragen via natuurlijke taal.",
"tags": ["mcp", "ai", "home-assistant", "smarthome", "claude"],
"icon": {"provider": "selfhst", "id": "home-assistant"},
"version": {"name": "latest"}
"tags": [
"mcp",
"ai",
"home-assistant",
"smarthome",
"claude"
],
"icon": {
"provider": "selfhst",
"id": "home-assistant"
},
"version": {
"name": "latest"
},
"categories": [
"domotica",
"ai"
]
},
"variables": [
{
@ -45,7 +60,9 @@
"default": "http://homeassistant:8123",
"required": true,
"description": "URL van je Home Assistant instantie",
"config": {"placeholder": "http://192.168.1.x:8123"}
"config": {
"placeholder": "http://192.168.1.x:8123"
}
},
{
"name": "hass_token",
@ -54,7 +71,9 @@
"default": "",
"required": true,
"description": "Maak een token aan via Home Assistant → Profiel → Lange termijn toegangstokens (onderaan de pagina)",
"config": {"placeholder": "eyJ..."}
"config": {
"placeholder": "eyJ..."
}
}
]
}

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"domotica"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "release"
}
},
"categories": [
"fotos",
"opslag"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "2"
}
},
"categories": [
"monitoring",
"ontwikkeling"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "IT-Tools",
"description": "Verzameling handige online tools voor developers: encoding, hashing, formattering, converters en meer.",
"tags": ["tools", "developer", "utilities", "encoding"],
"icon": {"provider": "selfhst", "id": "it-tools"},
"version": {"name": "latest"}
"tags": [
"tools",
"developer",
"utilities",
"encoding"
],
"icon": {
"provider": "selfhst",
"id": "it-tools"
},
"version": {
"name": "latest"
},
"categories": [
"ontwikkeling"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Jellyfin",
"description": "Gratis en open-source mediaserver voor films, series en muziek. Geen abonnement.",
"tags": ["media", "streaming", "films", "muziek"],
"icon": {"provider": "selfhst", "id": "jellyfin"},
"version": {"name": "latest"}
"tags": [
"media",
"streaming",
"films",
"muziek"
],
"icon": {
"provider": "selfhst",
"id": "jellyfin"
},
"version": {
"name": "latest"
},
"categories": [
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "release"
}
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media",
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"beveiliging"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "apache"
}
},
"categories": [
"productiviteit",
"financien"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"opslag"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"productiviteit",
"documenten"
]
},
"variables": [
{

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "Linkding",
"description": "Eenvoudige zelfgehoste bladwijzerbeheerder met tags, zoekfunctie en browserextensie.",
"tags": ["bladwijzers", "links", "productiviteit"],
"icon": {"provider": "selfhst", "id": "linkding"},
"version": {"name": "latest"}
"tags": [
"bladwijzers",
"links",
"productiviteit"
],
"icon": {
"provider": "selfhst",
"id": "linkding"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{
@ -50,7 +62,9 @@
"title": "Admin wachtwoord",
"default": "",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Mealie",
"description": "Receptenbeheer met maaltijdplanning, boodschappenlijsten en automatisch importeren van recepten.",
"tags": ["recepten", "koken", "maaltijdplanning", "voedsel"],
"icon": {"provider": "selfhst", "id": "mealie"},
"version": {"name": "latest"}
"tags": [
"recepten",
"koken",
"maaltijdplanning",
"voedsel"
],
"icon": {
"provider": "selfhst",
"id": "mealie"
},
"version": {
"name": "latest"
},
"categories": [
"gezin"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "stable"
}
},
"categories": [
"documenten",
"productiviteit"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"monitoring",
"ontwikkeling"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media",
"downloaden"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Miniflux",
"description": "Minimalistische en snelle RSS-lezer, zelfgehost met een opgeruimde interface.",
"tags": ["rss", "nieuws", "lezer", "feeds"],
"icon": {"provider": "selfhst", "id": "miniflux"},
"version": {"name": "latest"}
"tags": [
"rss",
"nieuws",
"lezer",
"feeds"
],
"icon": {
"provider": "selfhst",
"id": "miniflux"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{
@ -50,7 +63,9 @@
"title": "Admin wachtwoord",
"default": "",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
},
@ -63,7 +78,9 @@
"title": "Database wachtwoord",
"default": "miniflux_db_pass",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "2"
}
},
"categories": [
"domotica",
"netwerk"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "n8n",
"description": "No-code/low-code workflow automatisering. Zapier-alternatief met 400+ integraties.",
"tags": ["automatisering", "workflow", "integratie"],
"icon": {"provider": "selfhst", "id": "n8n"},
"version": {"name": "latest"}
"tags": [
"automatisering",
"workflow",
"integratie"
],
"icon": {
"provider": "selfhst",
"id": "n8n"
},
"version": {
"name": "latest"
},
"categories": [
"productiviteit",
"ontwikkeling"
]
},
"variables": [
{
@ -51,7 +64,9 @@
"default": "localhost",
"required": false,
"description": "Hostname of IP van je server voor webhook-URLs. Gebruik je domeinnaam als je een reverse proxy hebt.",
"config": {"placeholder": "mijn-server.nl"}
"config": {
"placeholder": "mijn-server.nl"
}
}
]
}

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "stable"
}
},
"categories": [
"monitoring"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Nextcloud AIO",
"description": "Nextcloud All-in-One: één container beheert automatisch alle Nextcloud-componenten.",
"tags": ["bestanden", "cloud", "productiviteit", "samenwerken"],
"icon": {"provider": "selfhst", "id": "nextcloud"},
"version": {"name": "latest"}
"tags": [
"bestanden",
"cloud",
"productiviteit",
"samenwerken"
],
"icon": {
"provider": "selfhst",
"id": "nextcloud"
},
"version": {
"name": "latest"
},
"categories": [
"opslag",
"documenten"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Nginx Proxy Manager",
"description": "Reverse proxy met automatische SSL-certificaten en eenvoudige webinterface",
"tags": ["proxy", "ssl", "netwerk"],
"icon": {"provider": "selfhst", "id": "nginx-proxy-manager"},
"version": {"name": "latest"}
"tags": [
"proxy",
"ssl",
"netwerk"
],
"icon": {
"provider": "selfhst",
"id": "nginx-proxy-manager"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"ontwikkeling",
"productiviteit"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"domotica",
"productiviteit"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"communicatie"
]
},
"variables": [
{

View file

@ -13,7 +13,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"3d-printen"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"ai"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "main"
}
},
"categories": [
"ai"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"gezin",
"beveiliging"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Paperless-ngx",
"description": "Digitaal documentbeheer met OCR, slimme tags en zoekfunctie.",
"tags": ["documenten", "ocr", "archief", "productiviteit"],
"icon": {"provider": "selfhst", "id": "paperless-ngx"},
"version": {"name": "latest"}
"tags": [
"documenten",
"ocr",
"archief",
"productiviteit"
],
"icon": {
"provider": "selfhst",
"id": "paperless-ngx"
},
"version": {
"name": "latest"
},
"categories": [
"documenten",
"opslag"
]
},
"variables": [
{
@ -51,7 +65,9 @@
"default": "",
"required": true,
"description": "Willekeurige lange string voor sessiebeveiliging",
"config": {"placeholder": "minimaal-50-willekeurige-tekens"}
"config": {
"placeholder": "minimaal-50-willekeurige-tekens"
}
},
{
"name": "db_password",
@ -59,7 +75,9 @@
"title": "Database wachtwoord",
"default": "paperless_db_pass",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
},

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"fotos"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Pi-hole",
"description": "DNS-gebaseerde advertentie- en trackerblokkering voor je hele thuisnetwerk.",
"tags": ["dns", "adblock", "privacy", "netwerk"],
"icon": {"provider": "selfhst", "id": "pi-hole"},
"version": {"name": "latest"}
"tags": [
"dns",
"adblock",
"privacy",
"netwerk"
],
"icon": {
"provider": "selfhst",
"id": "pi-hole"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{
@ -59,7 +73,9 @@
"default": "",
"required": true,
"description": "Wachtwoord voor het Pi-hole webpaneel",
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"media",
"downloaden"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "1"
}
},
"categories": [
"productiviteit"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Plex",
"description": "Populaire mediaserver voor films, series, muziek en foto's met apps voor alle platforms.",
"tags": ["media", "streaming", "films", "muziek"],
"icon": {"provider": "selfhst", "id": "plex"},
"version": {"name": "latest"}
"tags": [
"media",
"streaming",
"films",
"muziek"
],
"icon": {
"provider": "selfhst",
"id": "plex"
},
"version": {
"name": "latest"
},
"categories": [
"media"
]
},
"variables": [
{
@ -86,7 +99,9 @@
"default": "",
"required": false,
"description": "Haal op via plex.tv/claim om de server direct aan je account te koppelen. Verlopen na 4 minuten.",
"config": {"placeholder": "claim-xxxxxxxxxxxxxxxxxxxx"}
"config": {
"placeholder": "claim-xxxxxxxxxxxxxxxxxxxx"
}
}
]
}

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "Portainer CE",
"description": "Webgebaseerde Docker-beheerinterface voor containers, images, volumes en netwerken.",
"tags": ["docker", "beheer", "containers"],
"icon": {"provider": "selfhst", "id": "portainer"},
"version": {"name": "latest"}
"tags": [
"docker",
"beheer",
"containers"
],
"icon": {
"provider": "selfhst",
"id": "portainer"
},
"version": {
"name": "latest"
},
"categories": [
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"monitoring"
]
},
"variables": [
{

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "qBittorrent",
"description": "Open-source torrent-client met webinterface. Werkt goed samen met de ARR-stack.",
"tags": ["downloaden", "torrents", "media"],
"icon": {"provider": "selfhst", "id": "qbittorrent"},
"version": {"name": "latest"}
"tags": [
"downloaden",
"torrents",
"media"
],
"icon": {
"provider": "selfhst",
"id": "qbittorrent"
},
"version": {
"name": "latest"
},
"categories": [
"downloaden"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "SABnzbd",
"description": "Usenet download-client met webinterface. Werkt samen met de ARR-stack voor automatisch downloaden via Usenet.",
"tags": ["downloaden", "usenet", "nzb", "media"],
"icon": {"provider": "selfhst", "id": "sabnzbd"},
"version": {"name": "latest"}
"tags": [
"downloaden",
"usenet",
"nzb",
"media"
],
"icon": {
"provider": "selfhst",
"id": "sabnzbd"
},
"version": {
"name": "latest"
},
"categories": [
"downloaden"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"domotica",
"media"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "stable"
}
},
"categories": [
"netwerk",
"ontwikkeling"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Speedtest Tracker",
"description": "Automatische internetsnelheidsmetingen met historische grafieken en statistieken.",
"tags": ["netwerk", "monitoring", "internet", "statistieken"],
"icon": {"provider": "selfhst", "id": "speedtest-tracker"},
"version": {"name": "latest"}
"tags": [
"netwerk",
"monitoring",
"internet",
"statistieken"
],
"icon": {
"provider": "selfhst",
"id": "speedtest-tracker"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"monitoring"
]
},
"variables": [
{
@ -72,7 +86,9 @@
"default": "",
"required": true,
"description": "Willekeurige 32-tekens encryptiesleutel, bijv. base64:xxxx...",
"config": {"placeholder": "base64:willekeurige-string-van-32-tekens"}
"config": {
"placeholder": "base64:willekeurige-string-van-32-tekens"
}
}
]
}

View file

@ -13,7 +13,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"3d-printen"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Stirling PDF",
"description": "Web-gebaseerde PDF-tools: samenvoegen, splitsen, omzetten, comprimeren en bewerken.",
"tags": ["pdf", "tools", "documenten", "utilities"],
"icon": {"provider": "selfhst", "id": "stirling-pdf"},
"version": {"name": "latest"}
"tags": [
"pdf",
"tools",
"documenten",
"utilities"
],
"icon": {
"provider": "selfhst",
"id": "stirling-pdf"
},
"version": {
"name": "latest"
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Syncthing",
"description": "Gedecentraliseerde bestandssynchronisatie tussen apparaten zonder cloudopslag.",
"tags": ["sync", "bestanden", "backup", "privacy"],
"icon": {"provider": "selfhst", "id": "syncthing"},
"version": {"name": "latest"}
"tags": [
"sync",
"bestanden",
"backup",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "syncthing"
},
"version": {
"name": "latest"
},
"categories": [
"opslag"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"gezin"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"gezin",
"monitoring"
]
},
"variables": [
{

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Traefik",
"description": "Moderne reverse proxy en load balancer met automatische SSL via Let's Encrypt.",
"tags": ["reverse-proxy", "ssl", "netwerk", "loadbalancer"],
"icon": {"provider": "selfhst", "id": "traefik"},
"version": {"name": "latest"}
"tags": [
"reverse-proxy",
"ssl",
"netwerk",
"loadbalancer"
],
"icon": {
"provider": "selfhst",
"id": "traefik"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beheer"
]
},
"variables": [
{
@ -58,7 +72,9 @@
"default": "",
"required": false,
"description": "E-mailadres voor Let's Encrypt SSL-certificaten. Laat leeg als je geen HTTPS gebruikt.",
"config": {"placeholder": "jij@voorbeeld.nl"}
"config": {
"placeholder": "jij@voorbeeld.nl"
}
}
]
}

View file

@ -3,9 +3,23 @@
"metadata": {
"name": "Unifi Network Application",
"description": "Unifi netwerkconfiguratie en -beheer. Beheert access points, switches en gateways van Ubiquiti.",
"tags": ["netwerk", "unifi", "ubiquiti", "wifi"],
"icon": {"provider": "selfhst", "id": "unifi"},
"version": {"name": "latest"}
"tags": [
"netwerk",
"unifi",
"ubiquiti",
"wifi"
],
"icon": {
"provider": "selfhst",
"id": "unifi"
},
"version": {
"name": "latest"
},
"categories": [
"netwerk",
"beheer"
]
},
"variables": [
{
@ -98,7 +112,9 @@
"default": "unifi_mongo_pass",
"required": true,
"description": "Wachtwoord voor de interne MongoDB database",
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "Uptime Kuma",
"description": "Mooie en eenvoudige uptime-monitor voor al je services en websites.",
"tags": ["monitoring", "uptime", "alerting"],
"icon": {"provider": "selfhst", "id": "uptime-kuma"},
"version": {"name": "latest"}
"tags": [
"monitoring",
"uptime",
"alerting"
],
"icon": {
"provider": "selfhst",
"id": "uptime-kuma"
},
"version": {
"name": "latest"
},
"categories": [
"monitoring"
]
},
"variables": [
{

View file

@ -3,9 +3,21 @@
"metadata": {
"name": "Vaultwarden",
"description": "Lichtgewicht Bitwarden-compatibele wachtwoordkluis. Werkt met alle Bitwarden-apps.",
"tags": ["wachtwoorden", "beveiliging", "privacy"],
"icon": {"provider": "selfhst", "id": "vaultwarden"},
"version": {"name": "latest"}
"tags": [
"wachtwoorden",
"beveiliging",
"privacy"
],
"icon": {
"provider": "selfhst",
"id": "vaultwarden"
},
"version": {
"name": "latest"
},
"categories": [
"beveiliging"
]
},
"variables": [
{
@ -51,7 +63,9 @@
"default": "",
"required": false,
"description": "Willekeurige geheime string voor het /admin paneel. Laat leeg om admin uit te schakelen.",
"config": {"placeholder": "willekeurige-geheime-string"}
"config": {
"placeholder": "willekeurige-geheime-string"
}
}
]
}

View file

@ -3,9 +3,22 @@
"metadata": {
"name": "Vikunja",
"description": "Open-source taakbeheer en to-do app met projecten, teams, Kanban en kalenderweergave.",
"tags": ["taken", "productiviteit", "projectbeheer", "todo"],
"icon": {"provider": "selfhst", "id": "vikunja"},
"version": {"name": "latest"}
"tags": [
"taken",
"productiviteit",
"projectbeheer",
"todo"
],
"icon": {
"provider": "selfhst",
"id": "vikunja"
},
"version": {
"name": "latest"
},
"categories": [
"productiviteit"
]
},
"variables": [
{
@ -51,7 +64,9 @@
"default": "",
"required": true,
"description": "Willekeurige geheime string voor JWT-tokenbeveiliging",
"config": {"placeholder": "willekeurige-lange-string"}
"config": {
"placeholder": "willekeurige-lange-string"
}
},
{
"name": "db_password",
@ -59,7 +74,9 @@
"title": "Database wachtwoord",
"default": "vikunja_db_pass",
"required": true,
"config": {"placeholder": "sterk-wachtwoord"}
"config": {
"placeholder": "sterk-wachtwoord"
}
}
]
}

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"beheer"
]
},
"variables": [
{

View file

@ -14,7 +14,11 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"netwerk",
"beveiliging"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "2"
}
},
"categories": [
"documenten"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"domotica"
]
},
"variables": [
{

View file

@ -14,7 +14,10 @@
},
"version": {
"name": "latest"
}
},
"categories": [
"domotica"
]
},
"variables": [
{

View file

@ -15,7 +15,8 @@ from flask import Flask, Response, jsonify, render_template, request, session
import core as cfg
from core import audit, jobs, i18n
from core import auth, docker, git, boilerplates, updater
from core import backups, compose_transform, networks, scheduler, selfupdate
from core import backups, categories, compose_transform, networks
from core import scheduler, selfupdate
from core import stackupdates
from core.modules import Module, CORE, discover
@ -618,6 +619,10 @@ def api_stacks():
"containers": ct,
"logo_url": logo_url, "icon": icon,
"network": meta.get("network", ""), "ip": meta.get("ip", ""),
# Bij installatie vastgelegd; ontbreekt dat (oudere installatie),
# dan leiden we het alsnog af uit de opgeslagen naam.
"categories": categories.normalize(
meta.get("categories"), meta.get("tags"), meta.get("name", "")),
})
return jsonify(out)
@ -1306,6 +1311,8 @@ def api_store_install():
"network": net_name,
"ip": net_ip if net else "",
"connected": bool(verbinden and gedeeld_net),
"categories": meta.get("categories") or [],
"tags": meta.get("tags") or [],
}, ensure_ascii=False, indent=2), encoding="utf-8")
except Exception:
pass
@ -1502,6 +1509,14 @@ def api_networks():
drivers=list(networks.DRIVERS))
@app.route("/api/categories")
def api_categories():
"""Categoriedefinities met hun kleur, zodat de interface overal dezelfde
kleur gebruikt voor dezelfde categorie."""
lang = (request.args.get("lang") or cfg.load().get("LANGUAGE") or "nl")[:5]
return jsonify(categories=categories.all_categories(lang))
@app.route("/api/apps/connectable")
def api_connectable():
"""Ge<0x00ef>nstalleerde apps waar een nieuwe app aan gekoppeld kan worden.

View file

@ -56,10 +56,16 @@ def metadata(d: Path) -> dict:
icon_url = f"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/{iid}.png"
elif iid and (iid.startswith("http://") or iid.startswith("https://")):
icon_url = iid
from core import categories as cat
tags = md.get("tags", []) or []
beschrijving = md.get("description", "")
return {
"name": md.get("name") or d.name,
"description": md.get("description", ""),
"tags": md.get("tags", []) or [],
"description": beschrijving,
"tags": tags,
# Expliciet in template.json, anders afgeleid uit de tags. Zo krijgen
# ook apps uit externe repo's een zinnige indeling.
"categories": cat.normalize(md.get("categories"), tags, beschrijving),
"logo_url": icon_url,
"version": (md.get("version") or {}).get("name", ""),
"kind": t.get("kind", "compose"),

Some files were not shown because too many files have changed in this diff Show more