probe fix, the gate, and the promotion train (R-618 closed, R-630..632 opened)
gates / gates (push) Successful in 28s

Part 1: tandoor/zipline/wger probes corrected in the catalog and red-proofed live on 9202 in both
directions - "Nem egeszseges" with the front door serving 200, then "Fut" after the real sync with
no redeploy. tandoor's failed edge re-walked: done at +41.1s where it was failed at +361.9s.

Part 2: fifteen proven versions on the live catalog, one commit per app; the guarded Update pressed
on four apps on demo-hp, all four done.

Opened: R-630 (paperless-ngx's probe has never run on any box - a silent absence, worse than the
wrong probe that was found in one night), R-631 (five templates no static rule can judge),
R-632 (28 of 53 templates never deployed by any drill). Closed: R-618.

Register 318 -> 321. No product code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-22 11:10:58 +02:00
parent 462ab4a5ff
commit a975cfde5b
47 changed files with 4887 additions and 1410 deletions
@@ -0,0 +1,56 @@
## Part 2 — the promotion train
### The moves
Fifteen commits, one per app, `catalog_since: "2026-09-22"` on each. Every gate run before each commit; nothing forced, nothing dropped. `check-image-resolvable.py` confirms all 18 unique pins still exist upstream.
| app | move | commit |
|---|---|---|
| `actualbudget` | 26.7.0 -> 26.9.0 | `2060032` |
| `audiobookshelf` | 2.35.1 -> 2.36.1 | `6525b8e` |
| `bookstack` | 26.05.2 -> 26.05.5 | `ac4828f` |
| `docmost` | 0.95.0 -> 0.96.0 | `6d8cd87` |
| `grafana` | 13.1.0 -> 13.2.2 | `068f445` |
| `home-assistant` | 2026.7.2 -> 2026.9.3 | `4405f12` |
| `mealie` | v3.20.1 -> v3.27.0 | `008348b` |
| `n8n` | 2.31.3 -> 2.40.5 | `4132e35` |
| `navidrome` | 0.63.2 -> 0.64.0 | `7708a04` |
| `papra` | 26.6.1 -> 26.6.2 | `e96887e` |
| `privatebin` | 2.0.5 -> 2.0.6 | `f547f16` |
| `romm` | 5.0.0 -> 5.3.0 | `15f9ebf` |
| `tandoor` | 2.6.13 -> 2.6.15 | `c3807c7` |
| `vikunja` | 2.3.0 -> 2.6.0 | `22f598b` |
| `nextcloud` | **ENGINE** `mariadb:11.6` -> `mariadb:12.3` | `39374d5` |
### The guarded Update, pressed on both demo boxes
#### `demo-hp` — https://192.168.0.138
| app | badge before (HU / EN) | phases | pin after | installed after | front-door state |
|---|---|---|---|---|---|
| `bookstack` | `Naprakész` / `Up to date` | `safety-dump` +0.0s → `pulling` +1.1s → `starting` +2.1s → `done` +3.1s | `lscr.io/linuxserver/bookstack:26.05.5` | `lscr.io/linuxserver/bookstack:26.05.5` | `running` |
| `docmost` | `Frissítés elérhető — ma` / `Update available — today` | `safety-dump` +0.0s → `pulling` +1.0s → `starting` +79.0s → `verifying` +91.3s → `done` +106.6s | `docmost/docmost:0.96.0` | `docmost/docmost:0.96.0` | `running` |
| `privatebin` | `Frissítés elérhető — ma` / `Update available — today` | `safety-dump` +0.0s → `pulling` +1.1s → `starting` +4.1s → `verifying` +5.2s → `done` +15.4s | `privatebin/pdo:2.0.6` | `privatebin/pdo:2.0.6` | `running` |
| `romm` | `Frissítés elérhető — ma` / `Update available — today` | `safety-dump` +0.0s → `pulling` +1.1s → `starting` +13.3s → `verifying` +40.0s → `done` +74.8s | `rommapp/romm:5.3.0` | `rommapp/romm:5.3.0` | `running` |
Page after the update, as the household reads it:
- **`bookstack`** — HU: *← Alkalmazások BookStack Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Egyszerű wiki platform - polcok, könyvek, fejezetek és oldalak ~150M RAM productivity Pi k*
EN: *← Apps BookStack Running Up to date Open ↗ Log Export Settings A simple wiki platform - shelves, books, chapters and pages ~150M RAM productivity Runs on Pi Move to anoth*
- **`docmost`** — HU: *← Alkalmazások Docmost Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Modern wiki és dokumentáció platform Notion-szerű szerkesztővel ~200M RAM productivity Csak *
EN: *← Apps Docmost Running Up to date Open ↗ Log Export Settings A modern wiki and documentation platform with a Notion-like editor ~200M RAM productivity x86 only Move to an*
- **`privatebin`** — HU: *← Alkalmazások PrivateBin Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Titkosított szöveg megosztás - a szerver nem látja a tartalmat ~30M RAM security Pi kompa*
EN: *← Apps PrivateBin Running Up to date Open ↗ Log Export Settings Encrypted text sharing - the server never sees the content ~30M RAM security Runs on Pi Move to another st*
- **`romm`** — HU: *← Alkalmazások RomM Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Retró játékgyűjtemény kezelő, böngésző és lejátszó ~300M RAM media HDD szükséges Csak x86 Hova *
EN: *← Apps RomM Running Up to date Open ↗ Log Export Settings Retro game collection manager, browser and player ~300M RAM media Needs a hard drive x86 only Where do I put my *
#### `demo-felhom` — https://192.168.0.149
**Not installed on this box, so not pressed:** `bookstack`, `docmost`, `privatebin`, `romm`.
| app | badge before (HU / EN) | phases | pin after | installed after | front-door state |
|---|---|---|---|---|---|
Page after the update, as the household reads it:
@@ -0,0 +1,93 @@
{
"demo-hp": {
"catalog_cache": "1ad1f34 gates: probe-matches-compose runs in CI's no-PyYAML mode (R-618)\norigin\thttps://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (fetch)",
"apps": {
"bookstack": {
"deployed": true,
"state": "running",
"catalog_images": {
"bookstack": "lscr.io/linuxserver/bookstack:26.05.5",
"bookstack-db": "mariadb:12.3"
}
},
"docmost": {
"deployed": true,
"state": "running",
"catalog_images": {
"docmost": "docmost/docmost:0.96.0",
"docmost-postgres": "postgres:16-alpine",
"docmost-redis": "redis:7-alpine"
}
},
"nextcloud": {
"deployed": false,
"state": "not_deployed"
},
"privatebin": {
"deployed": true,
"state": "running",
"catalog_images": {
"privatebin": "privatebin/pdo:2.0.6"
}
},
"romm": {
"deployed": true,
"state": "running",
"catalog_images": {
"romm": "rommapp/romm:5.3.0",
"romm-db": "mariadb:11.4",
"romm-redis": "redis:7-alpine"
}
},
"tandoor": {
"deployed": false,
"state": "not_deployed"
},
"zipline": {
"deployed": false,
"state": "not_deployed"
},
"wger": {
"deployed": false,
"state": "not_deployed"
}
}
},
"demo-felhom": {
"catalog_cache": "1ad1f34 gates: probe-matches-compose runs in CI's no-PyYAML mode (R-618)\norigin\thttps://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (fetch)",
"apps": {
"bookstack": {
"deployed": false,
"state": "not_deployed"
},
"docmost": {
"deployed": false,
"state": "not_deployed"
},
"nextcloud": {
"deployed": false,
"state": "not_deployed"
},
"privatebin": {
"deployed": false,
"state": "not_deployed"
},
"romm": {
"deployed": false,
"state": "not_deployed"
},
"tandoor": {
"deployed": false,
"state": "not_deployed"
},
"zipline": {
"deployed": false,
"state": "not_deployed"
},
"wger": {
"deployed": false,
"state": "not_deployed"
}
}
}
}
@@ -0,0 +1,57 @@
######## demo-hp
base=https://192.168.0.138 Host=felhom.enkisfelhom.hu
deployed apps: adventurelog, bentopdf, bookstack, calibre-web, docmost, kimai, opengist, paperless-ngx, privatebin, romm
will update: ['bookstack', 'docmost', 'privatebin', 'romm'] | NOT installed here: []
sync -> 200 {'ok': True, 'data': {'ok': True, 'message': 'Sablonok naprakészek — nincs változás'}, 'message': 'Sablonok naprakészek — nincs változás'}
==== bookstack
badge HU: [{'title': 'Ez az alkalmazás a legfrissebb elérhető változatot futtatja.', 'text': 'Naprakész'}]
badge EN: [{'title': 'This app is running the newest version available.', 'text': 'Up to date'}]
before: {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'}
+ 0.0s phase=safety-dump None
+ 1.1s phase=pulling None
+ 2.1s phase=starting None
+ 3.1s phase=done None
after : {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'} | installed: {'bookstack': 'lscr.io/linuxserver/bookstack:26.05.5', 'bookstack-db': 'mariadb:12.3'}
==== docmost
badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
before: {'docmost': 'docmost/docmost:0.95.0', 'docmost-postgres': 'postgres:16-alpine', 'docmost-redis': 'redis:7-alpine'}
+ 0.0s phase=safety-dump None
+ 1.0s phase=pulling None
+ 79.0s phase=starting None
+ 91.3s phase=verifying None
+ 106.6s phase=done None
after : {'docmost': 'docmost/docmost:0.96.0', 'docmost-postgres': 'postgres:16-alpine', 'docmost-redis': 'redis:7-alpine'} | installed: {'docmost': 'docmost/docmost:0.96.0', 'docmost-postgres': 'postgres:16-alpine', 'docmost-redis': 'redis:7-alpine'}
==== privatebin
badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
before: {'privatebin': 'privatebin/pdo:2.0.5'}
+ 0.0s phase=safety-dump None
+ 1.1s phase=pulling None
+ 4.1s phase=starting None
+ 5.2s phase=verifying None
+ 15.4s phase=done None
after : {'privatebin': 'privatebin/pdo:2.0.6'} | installed: {'privatebin': 'privatebin/pdo:2.0.6'}
==== romm
badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
before: {'romm': 'rommapp/romm:5.0.0', 'romm-db': 'mariadb:11.4', 'romm-redis': 'redis:7-alpine'}
+ 0.0s phase=safety-dump None
+ 1.1s phase=pulling None
+ 13.3s phase=starting None
+ 40.0s phase=verifying None
+ 74.8s phase=done None
after : {'romm': 'rommapp/romm:5.3.0', 'romm-db': 'mariadb:11.4', 'romm-redis': 'redis:7-alpine'} | installed: {'romm': 'rommapp/romm:5.3.0', 'romm-db': 'mariadb:11.4', 'romm-redis': 'redis:7-alpine'}
######## demo-felhom
base=https://192.168.0.149 Host=felhom.demo-felhom.eu
deployed apps: opengist
will update: [] | NOT installed here: ['bookstack', 'docmost', 'privatebin', 'romm']
sync -> 200 {'ok': True, 'data': {'ok': True, 'message': 'Sablonok naprakészek — nincs változás'}, 'message': 'Sablonok naprakészek — nincs változás'}
written demo-updates.json
@@ -0,0 +1,580 @@
{
"demo-hp": {
"box": "demo-hp",
"base": "https://192.168.0.138",
"deployed": [
"adventurelog",
"bentopdf",
"bookstack",
"calibre-web",
"docmost",
"kimai",
"opengist",
"paperless-ngx",
"privatebin",
"romm"
],
"not_installed": [],
"apps": {
"bookstack": {
"badge_before_hu": {
"tags": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"context": "← Alkalmazások BookStack Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Egyszerű wiki platform - polcok, könyvek, fejezetek és oldalak ~150M RAM productivity Pi kompatibilis Áthelyezés másik t"
},
"badge_before_en": {
"tags": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
],
"context": "← Apps BookStack Running Up to date Open ↗ Log Export Settings A simple wiki platform - shelves, books, chapters and pages ~150M RAM productivity Runs on Pi Move to another storage You can move this a"
},
"before": {
"state": "running",
"pinned_images": {
"bookstack": "lscr.io/linuxserver/bookstack:26.05.5",
"bookstack-db": "mariadb:12.3"
},
"installed_images": {
"bookstack": {
"ref": "lscr.io/linuxserver/bookstack:26.05.2",
"digest": "sha256:3db259db582808ab498d49ae96b0a63f935d9cf3635c9d5bd8b8815c6ff1f8a1",
"at": "2026-09-02T18:28:54Z"
},
"bookstack-db": {
"ref": "mariadb:12.3",
"digest": "sha256:a02fe89cb597d4375812b2eac90cf9d0775d4686daa7f7cc750ebbcad7525bbc",
"at": "2026-09-02T18:28:54Z"
}
},
"compose": [
"image: lscr.io/linuxserver/bookstack:26.05.5",
"image: mariadb:12.3"
],
"inspect": [
"bookstack|lscr.io/linuxserver/bookstack:26.05.5|running|Up 16 seconds (healthy)",
"bookstack-db|mariadb:12.3|running|Up 21 seconds (healthy)"
]
},
"update": {
"accepted": true,
"code": "202",
"answer": "{'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"phases": [
{
"t": 0.0,
"phase": "safety-dump",
"label": null,
"error": null,
"hold": null
},
{
"t": 1.1,
"phase": "pulling",
"label": null,
"error": null,
"hold": null
},
{
"t": 2.1,
"phase": "starting",
"label": null,
"error": null,
"hold": null
},
{
"t": 3.1,
"phase": "done",
"label": null,
"error": null,
"hold": null
}
]
},
"after": {
"state": "running",
"pinned_images": {
"bookstack": "lscr.io/linuxserver/bookstack:26.05.5",
"bookstack-db": "mariadb:12.3"
},
"installed_images": {
"bookstack": {
"ref": "lscr.io/linuxserver/bookstack:26.05.5",
"digest": "sha256:189c796273469115cf810e53f450e15b93184018e4728cd65fcaef8aa93584bc",
"at": "2026-09-22T09:05:22Z"
},
"bookstack-db": {
"ref": "mariadb:12.3",
"digest": "sha256:805c8e104bd563d5bfa24fadd3f31cd419ea859cb5277f32b5dbf2db714f9ed1",
"at": "2026-09-22T09:05:22Z"
}
},
"compose": [
"image: lscr.io/linuxserver/bookstack:26.05.5",
"image: mariadb:12.3"
],
"inspect": [
"bookstack|lscr.io/linuxserver/bookstack:26.05.5|running|Up 21 seconds (healthy)",
"bookstack-db|mariadb:12.3|running|Up 27 seconds (healthy)"
]
},
"page_after_hu": {
"tags": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"context": "← Alkalmazások BookStack Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Egyszerű wiki platform - polcok, könyvek, fejezetek és oldalak ~150M RAM productivity Pi kompatibilis Áthelyezés másik t"
},
"page_after_en": {
"tags": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
],
"context": "← Apps BookStack Running Up to date Open ↗ Log Export Settings A simple wiki platform - shelves, books, chapters and pages ~150M RAM productivity Runs on Pi Move to another storage You can move this a"
}
},
"docmost": {
"badge_before_hu": {
"tags": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"context": "← Alkalmazások Docmost Fut Frissítés elérhető — ma Megnyitás ↗ Napló Exportálás Beállítások Modern wiki és dokumentáció platform Notion-szerű szerkesztővel ~200M RAM productivity Csak x86 Áthelyezés m"
},
"badge_before_en": {
"tags": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
],
"context": "← Apps Docmost Running Update available — today Open ↗ Log Export Settings A modern wiki and documentation platform with a Notion-like editor ~200M RAM productivity x86 only Move to another storage Yo"
},
"before": {
"state": "running",
"pinned_images": {
"docmost": "docmost/docmost:0.95.0",
"docmost-postgres": "postgres:16-alpine",
"docmost-redis": "redis:7-alpine"
},
"installed_images": {
"docmost": {
"ref": "docmost/docmost:0.95.0",
"digest": "sha256:41c8d777cf23c74e78f94e676aec328b7d7856f48df5e573543dac68d371e37c",
"at": "2026-09-03T00:30:36Z"
},
"docmost-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:cf78e76683b9ca8c5733cbbdce6c9262b45b6767934dd0a95e671f9a0fc20685",
"at": "2026-09-03T00:30:36Z"
},
"docmost-redis": {
"ref": "redis:7-alpine",
"digest": "sha256:ff02b58f971e7d7d156a1267e283fcbbeee91773b6aa36c49dac28ecfe28eadf",
"at": "2026-09-03T00:30:36Z"
}
},
"compose": [
"image: docmost/docmost:0.95.0",
"image: postgres:16-alpine",
"image: redis:7-alpine"
],
"inspect": [
"docmost|docmost/docmost:0.95.0|running|Up 4 hours (healthy)",
"docmost-postgres|postgres:16-alpine|running|Up 4 hours (healthy)",
"docmost-redis|redis:7-alpine|running|Up 4 hours (healthy)"
]
},
"update": {
"accepted": true,
"code": "202",
"answer": "{'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"phases": [
{
"t": 0.0,
"phase": "safety-dump",
"label": null,
"error": null,
"hold": null
},
{
"t": 1.0,
"phase": "pulling",
"label": null,
"error": null,
"hold": null
},
{
"t": 79.0,
"phase": "starting",
"label": null,
"error": null,
"hold": null
},
{
"t": 91.3,
"phase": "verifying",
"label": null,
"error": null,
"hold": null
},
{
"t": 106.6,
"phase": "done",
"label": null,
"error": null,
"hold": null
}
]
},
"after": {
"state": "running",
"pinned_images": {
"docmost": "docmost/docmost:0.96.0",
"docmost-postgres": "postgres:16-alpine",
"docmost-redis": "redis:7-alpine"
},
"installed_images": {
"docmost": {
"ref": "docmost/docmost:0.96.0",
"digest": "sha256:b56947fcfd08aab8fae12a377e1792784786adbf8b96e4281f14ef4fc072685a",
"at": "2026-09-22T09:07:17Z"
},
"docmost-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T09:07:17Z"
},
"docmost-redis": {
"ref": "redis:7-alpine",
"digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499",
"at": "2026-09-22T09:07:17Z"
}
},
"compose": [
"image: docmost/docmost:0.96.0",
"image: postgres:16-alpine",
"image: redis:7-alpine"
],
"inspect": [
"docmost|docmost/docmost:0.96.0|running|Up 18 seconds (healthy)",
"docmost-postgres|postgres:16-alpine|running|Up 29 seconds (healthy)",
"docmost-redis|redis:7-alpine|running|Up 29 seconds (healthy)"
]
},
"page_after_hu": {
"tags": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"context": "← Alkalmazások Docmost Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Modern wiki és dokumentáció platform Notion-szerű szerkesztővel ~200M RAM productivity Csak x86 Áthelyezés másik tárhelyre"
},
"page_after_en": {
"tags": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
],
"context": "← Apps Docmost Running Up to date Open ↗ Log Export Settings A modern wiki and documentation platform with a Notion-like editor ~200M RAM productivity x86 only Move to another storage You can move thi"
}
},
"privatebin": {
"badge_before_hu": {
"tags": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"context": "← Alkalmazások PrivateBin Fut Frissítés elérhető — ma Megnyitás ↗ Napló Exportálás Beállítások Titkosított szöveg megosztás - a szerver nem látja a tartalmat ~30M RAM security Pi kompatibilis Áthelyez"
},
"badge_before_en": {
"tags": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
],
"context": "← Apps PrivateBin Running Update available — today Open ↗ Log Export Settings Encrypted text sharing - the server never sees the content ~30M RAM security Runs on Pi Move to another storage You can mo"
},
"before": {
"state": "running",
"pinned_images": {
"privatebin": "privatebin/pdo:2.0.5"
},
"installed_images": {
"privatebin": {
"ref": "privatebin/pdo:2.0.5",
"digest": "sha256:8a2cac16eff6caed4dc622e7b3ebd0c0ffcb28dfc0eba0b9c335636552eadac1",
"at": "2026-09-03T09:59:45Z"
}
},
"compose": [
"image: privatebin/pdo:2.0.5"
],
"inspect": [
"privatebin|privatebin/pdo:2.0.5|running|Up 4 hours (healthy)"
]
},
"update": {
"accepted": true,
"code": "202",
"answer": "{'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"phases": [
{
"t": 0.0,
"phase": "safety-dump",
"label": null,
"error": null,
"hold": null
},
{
"t": 1.1,
"phase": "pulling",
"label": null,
"error": null,
"hold": null
},
{
"t": 4.1,
"phase": "starting",
"label": null,
"error": null,
"hold": null
},
{
"t": 5.2,
"phase": "verifying",
"label": null,
"error": null,
"hold": null
},
{
"t": 15.4,
"phase": "done",
"label": null,
"error": null,
"hold": null
}
]
},
"after": {
"state": "running",
"pinned_images": {
"privatebin": "privatebin/pdo:2.0.6"
},
"installed_images": {
"privatebin": {
"ref": "privatebin/pdo:2.0.6",
"digest": "sha256:4c141b2326f8b353598ce9ce7507a9cfecf2dad5c60a39fea903d430e296d8f5",
"at": "2026-09-22T09:07:38Z"
}
},
"compose": [
"image: privatebin/pdo:2.0.6"
],
"inspect": [
"privatebin|privatebin/pdo:2.0.6|running|Up 13 seconds (healthy)"
]
},
"page_after_hu": {
"tags": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"context": "← Alkalmazások PrivateBin Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Titkosított szöveg megosztás - a szerver nem látja a tartalmat ~30M RAM security Pi kompatibilis Áthelyezés másik tárhe"
},
"page_after_en": {
"tags": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
],
"context": "← Apps PrivateBin Running Up to date Open ↗ Log Export Settings Encrypted text sharing - the server never sees the content ~30M RAM security Runs on Pi Move to another storage You can move this app’s "
}
},
"romm": {
"badge_before_hu": {
"tags": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"context": "← Alkalmazások RomM Fut Frissítés elérhető — ma Megnyitás ↗ Napló Exportálás Beállítások Retró játékgyűjtemény kezelő, böngésző és lejátszó ~300M RAM media HDD szükséges Csak x86 Hova tegyem a fájloka"
},
"badge_before_en": {
"tags": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
],
"context": "← Apps RomM Running Update available — today Open ↗ Log Export Settings Retro game collection manager, browser and player ~300M RAM media Needs a hard drive x86 only Where do I put my files? You reach"
},
"before": {
"state": "running",
"pinned_images": {
"romm": "rommapp/romm:5.0.0",
"romm-db": "mariadb:11.4",
"romm-redis": "redis:7-alpine"
},
"installed_images": {
"romm": {
"ref": "rommapp/romm:5.0.0",
"digest": "sha256:91f6611eca5a4dafc4f4a1d72a1ed7dd66a11375d939f28410dc1d1de0b80b1b",
"at": "2026-09-03T09:59:45Z"
},
"romm-db": {
"ref": "mariadb:11.4",
"digest": "sha256:4f1d8d202fcf7bcb3902f63af09f9c1a050c2922a89652f22abaec0d4f015e83",
"at": "2026-09-03T09:59:45Z"
},
"romm-redis": {
"ref": "redis:7-alpine",
"digest": "sha256:ff02b58f971e7d7d156a1267e283fcbbeee91773b6aa36c49dac28ecfe28eadf",
"at": "2026-09-03T09:59:45Z"
}
},
"compose": [
"image: rommapp/romm:5.0.0",
"image: mariadb:11.4",
"image: redis:7-alpine"
],
"inspect": [
"romm|rommapp/romm:5.0.0|running|Up 4 hours (healthy)",
"romm-db|mariadb:11.4|running|Up 4 hours (healthy)",
"romm-redis|5509c0097c60|running|Up 4 hours (healthy)"
]
},
"update": {
"accepted": true,
"code": "202",
"answer": "{'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}",
"phases": [
{
"t": 0.0,
"phase": "safety-dump",
"label": null,
"error": null,
"hold": null
},
{
"t": 1.1,
"phase": "pulling",
"label": null,
"error": null,
"hold": null
},
{
"t": 13.3,
"phase": "starting",
"label": null,
"error": null,
"hold": null
},
{
"t": 40.0,
"phase": "verifying",
"label": null,
"error": null,
"hold": null
},
{
"t": 74.8,
"phase": "done",
"label": null,
"error": null,
"hold": null
}
]
},
"after": {
"state": "running",
"pinned_images": {
"romm": "rommapp/romm:5.3.0",
"romm-db": "mariadb:11.4",
"romm-redis": "redis:7-alpine"
},
"installed_images": {
"romm": {
"ref": "rommapp/romm:5.3.0",
"digest": "sha256:dc586cb3a2c7316fcffb3dc273171b1964523f0f409e989295d26d2199df1d4e",
"at": "2026-09-22T09:08:58Z"
},
"romm-db": {
"ref": "mariadb:11.4",
"digest": "sha256:70cc072b29b4a89ae07abb2d4da2c64678a7f2dfe092751bb51c87d67dc1338b",
"at": "2026-09-22T09:08:58Z"
},
"romm-redis": {
"ref": "redis:7-alpine",
"digest": "sha256:858f009f9709ce576febc734aa78b8f6d624b82571f9ddb6bda4377c833b3499",
"at": "2026-09-22T09:08:58Z"
}
},
"compose": [
"image: rommapp/romm:5.3.0",
"image: mariadb:11.4",
"image: redis:7-alpine"
],
"inspect": [
"romm|rommapp/romm:5.3.0|running|Up 39 seconds (healthy)",
"romm-db|mariadb:11.4|running|Up 49 seconds (healthy)",
"romm-redis|redis:7-alpine|running|Up 49 seconds (healthy)"
]
},
"page_after_hu": {
"tags": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"context": "← Alkalmazások RomM Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Retró játékgyűjtemény kezelő, böngésző és lejátszó ~300M RAM media HDD szükséges Csak x86 Hova tegyem a fájlokat? Ezeket a ma"
},
"page_after_en": {
"tags": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
],
"context": "← Apps RomM Running Up to date Open ↗ Log Export Settings Retro game collection manager, browser and player ~300M RAM media Needs a hard drive x86 only Where do I put my files? You reach these folders"
}
}
}
},
"demo-felhom": {
"box": "demo-felhom",
"base": "https://192.168.0.149",
"deployed": [
"opengist"
],
"not_installed": [
"bookstack",
"docmost",
"privatebin",
"romm"
],
"apps": {}
}
}
@@ -0,0 +1,179 @@
#!/usr/bin/env python3
"""demo.py — the guarded Update pressed on the TWO DEMO BOXES, through the product's own endpoints.
Not a harness for the scratch guest: these are the customer-shaped boxes, so this only SYNCS and
presses UPDATE on apps that are already installed. It installs nothing and removes nothing.
"""
import json, os, re, subprocess, sys, time
from datetime import datetime
SC = "/tmp/claude-1000/-mnt-5-hdd-felhom-eu-git/d029e2e6-1762-440e-956d-0760c8aea4b3/scratchpad"
HERE = os.path.dirname(os.path.abspath(__file__))
BOXES = {
# name base url Host header ssh host vmid
"demo-hp": (None, "felhom.enkisfelhom.hu", "demo-hp", "9201"),
"demo-felhom": (None, "felhom.demo-felhom.eu", "felhom-pve", "9201"),
}
APPS = ["bookstack", "docmost", "privatebin", "romm"]
def sh(a, timeout=300, inp=None):
return subprocess.run(a, capture_output=True, text=True, timeout=timeout, input=inp)
class Box:
def __init__(self, name):
self.name = name
base, host, sshh, vmid = BOXES[name]
self.host, self.ssh, self.vmid = host, sshh, vmid
self.base = base or self.guest_ip()
self.sess = self.csrf = None
def guest_ip(self):
r = sh(["ssh", "-o", "ConnectTimeout=15", self.ssh,
f"LC_ALL=C pct exec {self.vmid} -- hostname -I"], timeout=60)
ip = (r.stdout or "").split()
if not ip:
raise SystemExit(f"{self.name}: no guest IP ({r.stderr[:200]})")
return "https://" + ip[0]
def guest(self, script):
r = sh(["ssh", "-o", "ConnectTimeout=15", self.ssh,
f"LC_ALL=C pct exec {self.vmid} -- bash -s"], timeout=600, inp=script)
return (r.stdout or "") + (r.stderr or "")
def login(self):
pw = open(f"{SC}/.ctlpw").read().strip()
r = sh(["curl", "-sk", "-D", "-", "-o", "/dev/null", "-H", f"Host: {self.host}",
"-X", "POST", "--data-urlencode", f"password={pw}", f"{self.base}/login"])
m = re.search(r"felhom_session=[A-Za-z0-9._-]+", r.stdout or "", re.I)
if not m:
raise SystemExit(f"{self.name}: login failed (no session cookie)")
self.sess = m.group(0)
r = sh(["curl", "-sk", "-L", "-H", f"Host: {self.host}", "-H", f"Cookie: {self.sess}",
f"{self.base}/"])
c = re.search(r'<meta name="csrf-token" content="([^"]+)"', r.stdout or "")
if not c:
raise SystemExit(f"{self.name}: login failed (no csrf token)")
self.csrf = c.group(1)
def ctl(self, method, path, data=None):
for attempt in range(2):
args = ["curl", "-sk", "-H", f"Host: {self.host}", "-H", f"Cookie: {self.sess}",
"-w", "\n%{http_code}"]
if method != "GET":
args += ["-H", f"X-CSRF-Token: {self.csrf}", "-H", "Content-Type: application/json",
"-X", method]
if data is not None:
args += ["--data", json.dumps(data)]
args.append(f"{self.base}{path}")
r = sh(args)
body, _, code = (r.stdout or "").rpartition("\n")
if code.strip() in ("302", "401") and attempt == 0:
self.login()
continue
try:
return code.strip(), json.loads(body)
except Exception:
return code.strip(), {"_raw": body[:600]}
def page(self, path):
r = sh(["curl", "-sk", "-H", f"Host: {self.host}", "-H", f"Cookie: {self.sess}",
f"{self.base}{path}"])
return r.stdout or ""
def stack(self, n):
_, d = self.ctl("GET", f"/api/stacks/{n}")
return (d.get("data") or {}) if isinstance(d, dict) else {}
def badge(box, app, lang_suffix=""):
h = box.page(f"/apps/{app}{lang_suffix}")
h = re.sub(r"<script.*?</script>|<style.*?</style>", "", h, flags=re.S)
m = re.findall(r'<span class="tag tag-[^"]*"[^>]*title="([^"]*)"[^>]*>([^<]*)<', h)
txt = re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", h))
i = txt.find("←")
return {"tags": [{"title": a.strip(), "text": b.strip()} for a, b in m][:3],
"context": txt[i:i + 200] if i >= 0 else None}
def observables(box, app):
st = box.stack(app)
ac = st.get("app_config") or {}
comp = box.guest(f"grep -h 'image:' /opt/docker/stacks/{app}/docker-compose.yml 2>/dev/null")
insp = box.guest("docker ps -a --format '{{.Names}}|{{.Image}}|{{.State}}|{{.Status}}' "
f"| grep '^{app}'")
return {"state": st.get("state"), "pinned_images": ac.get("pinned_images"),
"installed_images": ac.get("installed_images"),
"compose": [l.strip() for l in comp.strip().split("\n") if l.strip()],
"inspect": [l for l in insp.strip().split("\n") if l.strip()]}
def press(box, app, cap_s=1800):
code, d = box.ctl("POST", f"/api/stacks/{app}/update")
t0 = time.time()
phases, last = [], None
if code != "202":
return {"accepted": False, "code": code, "answer": str(d)[:300], "phases": []}
while time.time() - t0 < cap_s:
st = box.stack(app)
u = st.get("update") or st.get("update_status") or {}
ph = u.get("phase") or st.get("update_phase")
if ph and ph != last:
phases.append({"t": round(time.time() - t0, 1), "phase": ph,
"label": u.get("label") or u.get("message"),
"error": u.get("error"), "hold": u.get("hold_message")})
last = ph
print(" +%7.1fs phase=%s %s" % (phases[-1]["t"], ph, phases[-1]["label"]),
flush=True)
if ph in ("done", "failed"):
break
time.sleep(1.0)
return {"accepted": True, "code": code, "answer": str(d)[:200], "phases": phases}
def main():
only = sys.argv[1:] or list(BOXES)
out = {}
for name in only:
print(f"\n######## {name}")
b = Box(name)
print(f" base={b.base} Host={b.host}")
b.login()
code, d = b.ctl("GET", "/api/stacks")
installed = [s["name"] for s in (d.get("data") or []) if s.get("deployed")]
print(" deployed apps:", ", ".join(sorted(installed)))
todo = [a for a in APPS if a in installed]
missing = [a for a in APPS if a not in installed]
print(" will update:", todo, "| NOT installed here:", missing)
code, d = b.ctl("POST", "/api/sync")
print(" sync ->", code, str(d)[:180])
time.sleep(3)
b.ctl("POST", "/api/stacks/rescan")
time.sleep(3)
rec = {"box": name, "base": b.base, "deployed": sorted(installed),
"not_installed": missing, "apps": {}}
for app in todo:
print(f"\n ==== {app}")
before = observables(b, app)
bhu, ben = badge(b, app), badge(b, app, "?lang=en")
print(" badge HU:", bhu["tags"])
print(" badge EN:", ben["tags"])
print(" before:", before["pinned_images"])
r = press(b, app)
after = observables(b, app)
print(" after :", after["pinned_images"], "| installed:",
{k: (v or {}).get("ref") for k, v in (after["installed_images"] or {}).items()})
phu, pen = badge(b, app), badge(b, app, "?lang=en")
rec["apps"][app] = {"badge_before_hu": bhu, "badge_before_en": ben,
"before": before, "update": r, "after": after,
"page_after_hu": phu, "page_after_en": pen}
out[name] = rec
json.dump(out, open(os.path.join(HERE, "demo-updates.json"), "w"),
ensure_ascii=False, indent=2)
print("\nwritten demo-updates.json")
if __name__ == "__main__":
main()
@@ -0,0 +1,17 @@
{
"tandoor": {
"code": "200",
"bytes": 4981,
"first200chars": "Login Sign In Username * Password * Forgot your password? Remember Me Sign In"
},
"zipline": {
"code": "200",
"bytes": 6405,
"first200chars": "Zipline"
},
"wger": {
"code": "200",
"bytes": 52291,
"first200chars": ". --> wger Workout Manager - Features Contact Exercises Mobile app Donate Develop Community Login Register Track your way to your ideal body Join wger, the community-driven free and open-source fitnes"
}
}
@@ -0,0 +1,47 @@
#!/usr/bin/env python3
"""Generate Part 2 of the report FROM the evidence file, so the table cannot drift from it."""
import json, io, os
HERE = os.path.dirname(os.path.abspath(__file__))
d = json.load(open(os.path.join(HERE, "demo-updates.json"), encoding="utf-8"))
mv = json.load(open(os.path.join(HERE, "moves.json"), encoding="utf-8"))
out = []
out.append("## Part 2 — the promotion train\n")
out.append("### The moves\n")
out.append("Fifteen commits, one per app, `catalog_since: \"%s\"` on each. Every gate run before "
"each commit; nothing forced, nothing dropped. `check-image-resolvable.py` confirms all "
"18 unique pins still exist upstream.\n" % mv["catalog_since"])
out.append("| app | move | commit |")
out.append("|---|---|---|")
for app, human, h in mv["moved"]:
out.append("| `%s` | %s | `%s` |" % (app, human, h))
out.append("| `nextcloud` | **ENGINE** `mariadb:11.6` -> `mariadb:12.3` | `39374d5` |")
out.append("")
out.append("### The guarded Update, pressed on both demo boxes\n")
for box, rec in d.items():
out.append("#### `%s` — %s\n" % (box, rec["base"]))
if rec["not_installed"]:
out.append("**Not installed on this box, so not pressed:** %s.\n"
% ", ".join("`%s`" % a for a in rec["not_installed"]))
out.append("| app | badge before (HU / EN) | phases | pin after | installed after | front-door state |")
out.append("|---|---|---|---|---|---|")
for app, a in rec["apps"].items():
bh = "; ".join(t["text"] for t in a["badge_before_hu"]["tags"]) or "—"
be = "; ".join(t["text"] for t in a["badge_before_en"]["tags"]) or "—"
ph = " → ".join("`%s` +%.1fs" % (p["phase"], p["t"]) for p in a["update"]["phases"]) or "—"
pin = (a["after"]["pinned_images"] or {}).get(app, "—")
ins = ((a["after"]["insta" "lled_images"] or {}).get(app) or {}).get("ref", "—")
st = a["after"]["state"]
out.append("| `%s` | `%s` / `%s` | %s | `%s` | `%s` | `%s` |" % (app, bh, be, ph, pin, ins, st))
out.append("")
out.append("Page after the update, as the household reads it:\n")
for app, a in rec["apps"].items():
hu = (a["page_after_hu"]["context"] or "").strip()
en = (a["page_after_en"]["context"] or "").strip()
out.append("- **`%s`** — HU: *%s*" % (app, hu[:170]))
out.append(" EN: *%s*" % en[:170])
out.append("")
io.open(os.path.join(HERE, "PART2.md"), "w", encoding="utf-8").write("\n".join(out) + "\n")
print("\n".join(out)[:1500])
@@ -0,0 +1,76 @@
{
"moved": [
[
"actualbudget",
"26.7.0 -> 26.9.0",
"2060032"
],
[
"audiobookshelf",
"2.35.1 -> 2.36.1",
"6525b8e"
],
[
"bookstack",
"26.05.2 -> 26.05.5",
"ac4828f"
],
[
"docmost",
"0.95.0 -> 0.96.0",
"6d8cd87"
],
[
"grafana",
"13.1.0 -> 13.2.2",
"068f445"
],
[
"home-assistant",
"2026.7.2 -> 2026.9.3",
"4405f12"
],
[
"mealie",
"v3.20.1 -> v3.27.0",
"008348b"
],
[
"n8n",
"2.31.3 -> 2.40.5",
"4132e35"
],
[
"navidrome",
"0.63.2 -> 0.64.0",
"7708a04"
],
[
"papra",
"26.6.1 -> 26.6.2",
"e96887e"
],
[
"privatebin",
"2.0.5 -> 2.0.6",
"f547f16"
],
[
"romm",
"5.0.0 -> 5.3.0",
"15f9ebf"
],
[
"tandoor",
"2.6.13 -> 2.6.15",
"c3807c7"
],
[
"vikunja",
"2.3.0 -> 2.6.0",
"22f598b"
]
],
"dropped": [],
"catalog_since": "2026-09-22"
}
@@ -0,0 +1,64 @@
{
"total": 53,
"with_verdict_record": [
"actualbudget",
"adventurelog",
"audiobookshelf",
"bookstack",
"docmost",
"gitea",
"grafana",
"home-assistant",
"mealie",
"n8n",
"navidrome",
"nextcloud",
"opengist",
"papra",
"privatebin",
"romm",
"tandoor",
"vaultwarden",
"vikunja",
"zipline"
],
"deployed_as_prop_no_edge": [
"bentopdf",
"glance",
"uptime-kuma",
"wishlist"
],
"deployed_for_probe_only": [
"wger"
],
"never_deployed": [
"calcom",
"calibre-web",
"claper",
"code-server",
"crafty-controller",
"emby",
"ghost",
"gokapi",
"gramps-web",
"homebox",
"homepage",
"immich",
"jellyfin",
"kimai",
"komga",
"onlyoffice",
"outline",
"paperless-ngx",
"plant-it",
"plex",
"radarr",
"rallly",
"recipe-importer",
"seerr",
"sonarr",
"sparkyfitness",
"termix",
"wanderer"
]
}
@@ -0,0 +1,137 @@
[
{
"when": "2026-09-22T08:51:05Z",
"tag": "after",
"app": "tandoor",
"controller_state": "running",
"deployed": true,
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": {
"ref": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"digest": "sha256:f6c58afdea7a721d079ebd6ee5483f2c9da77dd1e709e16d60a82c218e80a451",
"at": "2026-09-22T08:38:25Z"
},
"tandoor-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T08:38:25Z"
}
},
"front_door_rc": 0,
"front_door_code": "200",
"front_door_bytes": 4981,
"docker_health": "healthy\nhealthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Fut",
"hu_context": "← Alkalmazások Tandoor Recipes Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Receptkezelő és étkezés tervező a családnak ~512M RAM home Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalmazásnak az adatai",
"en": "Running",
"en_context": "← Apps Tandoor Recipes Running Up to date Open ↗ Log Export Settings A recipe manager and meal planner for the household ~512M RAM home Runs on Pi Move to another storage You can move this app’s data to another connected"
}
},
{
"when": "2026-09-22T08:51:08Z",
"tag": "after",
"app": "zipline",
"controller_state": "running",
"deployed": true,
"pinned_images": {
"zipline": "ghcr.io/diced/zipline:4.6.1",
"zipline-postgres": "postgres:16-alpine"
},
"installed_images": {
"zipline": {
"ref": "ghcr.io/diced/zipline:4.6.1",
"digest": "sha256:b8babbbcf4fef89c0c620e0539a47d908c750c251614309a7662ea4d8a7f501f",
"at": "2026-09-22T08:39:28Z"
},
"zipline-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T08:39:28Z"
}
},
"front_door_rc": 0,
"front_door_code": "301",
"front_door_bytes": 0,
"docker_health": "healthy\nhealthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Fut",
"hu_context": "← Alkalmazások Zipline Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Screenshot és fájlmegosztó szerver ShareX/Flameshot integrációval ~100M RAM files Csak x86 Áthelyezés másik tárhelyre Ennek az alkalmazásnak a",
"en": "Running",
"en_context": "← Apps Zipline Running Up to date Open ↗ Log Export Settings A screenshot and file sharing server that works with ShareX/Flameshot ~100M RAM files x86 only Move to another storage You can move this app’s data to another "
}
},
{
"when": "2026-09-22T08:51:10Z",
"tag": "after",
"app": "wger",
"controller_state": "running",
"deployed": true,
"pinned_images": {
"wger": "wger/server:2.6"
},
"installed_images": {
"wger": {
"ref": "wger/server:2.6",
"digest": "sha256:997ead43aabdcd67d054f933e07d2b23875f01bf43271a267cb7796925ca27c4",
"at": "2026-09-22T08:44:57Z"
}
},
"front_door_rc": 0,
"front_door_code": "302",
"front_door_bytes": 0,
"docker_health": "healthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Fut",
"hu_context": "← Alkalmazások wger Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Edzésnapló - edzéstervek, haladás követés és testsúly napló ~100M RAM home Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalmazásnak az a",
"en": "Running",
"en_context": "← Apps wger Running Up to date Open ↗ Log Export Settings A workout log - training plans, progress and a weight diary ~100M RAM home Runs on Pi Move to another storage You can move this app’s data to another connected st"
}
}
]
@@ -0,0 +1,137 @@
[
{
"when": "2026-09-22T08:48:49Z",
"tag": "before-observe",
"app": "tandoor",
"controller_state": "unhealthy",
"deployed": true,
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": {
"ref": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"digest": "sha256:f6c58afdea7a721d079ebd6ee5483f2c9da77dd1e709e16d60a82c218e80a451",
"at": "2026-09-22T08:38:25Z"
},
"tandoor-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T08:38:25Z"
}
},
"front_door_rc": 0,
"front_door_code": "200",
"front_door_bytes": 4981,
"docker_health": "healthy\nhealthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Nem egészséges",
"hu_context": "← Alkalmazások Tandoor Recipes Nem egészséges Naprakész Megnyitás ↗ Napló Exportálás Beállítások Receptkezelő és étkezés tervező a családnak ~512M RAM home Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalmazásna",
"en": "Not healthy",
"en_context": "← Apps Tandoor Recipes Not healthy Up to date Open ↗ Log Export Settings A recipe manager and meal planner for the household ~512M RAM home Runs on Pi Move to another storage You can move this app’s data to another conne"
}
},
{
"when": "2026-09-22T08:48:51Z",
"tag": "before-observe",
"app": "zipline",
"controller_state": "unhealthy",
"deployed": true,
"pinned_images": {
"zipline": "ghcr.io/diced/zipline:4.6.1",
"zipline-postgres": "postgres:16-alpine"
},
"installed_images": {
"zipline": {
"ref": "ghcr.io/diced/zipline:4.6.1",
"digest": "sha256:b8babbbcf4fef89c0c620e0539a47d908c750c251614309a7662ea4d8a7f501f",
"at": "2026-09-22T08:39:28Z"
},
"zipline-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T08:39:28Z"
}
},
"front_door_rc": 0,
"front_door_code": "301",
"front_door_bytes": 0,
"docker_health": "healthy\nhealthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Nem egészséges",
"hu_context": "← Alkalmazások Zipline Nem egészséges Naprakész Megnyitás ↗ Napló Exportálás Beállítások Screenshot és fájlmegosztó szerver ShareX/Flameshot integrációval ~100M RAM files Csak x86 Áthelyezés másik tárhelyre Ennek az alka",
"en": "Not healthy",
"en_context": "← Apps Zipline Not healthy Up to date Open ↗ Log Export Settings A screenshot and file sharing server that works with ShareX/Flameshot ~100M RAM files x86 only Move to another storage You can move this app’s data to anot"
}
},
{
"when": "2026-09-22T08:48:54Z",
"tag": "before-observe",
"app": "wger",
"controller_state": "unhealthy",
"deployed": true,
"pinned_images": {
"wger": "wger/server:2.6"
},
"installed_images": {
"wger": {
"ref": "wger/server:2.6",
"digest": "sha256:997ead43aabdcd67d054f933e07d2b23875f01bf43271a267cb7796925ca27c4",
"at": "2026-09-22T08:44:57Z"
}
},
"front_door_rc": 0,
"front_door_code": "302",
"front_door_bytes": 0,
"docker_health": "healthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Nem egészséges",
"hu_context": "← Alkalmazások wger Nem egészséges Naprakész Megnyitás ↗ Napló Exportálás Beállítások Edzésnapló - edzéstervek, haladás követés és testsúly napló ~100M RAM home Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalma",
"en": "Not healthy",
"en_context": "← Apps wger Not healthy Up to date Open ↗ Log Export Settings A workout log - training plans, progress and a weight diary ~100M RAM home Runs on Pi Move to another storage You can move this app’s data to another connecte"
}
}
]
@@ -0,0 +1,49 @@
[
{
"when": "2026-09-22T08:46:38Z",
"tag": "before",
"app": "tandoor",
"controller_state": "unhealthy",
"deployed": true,
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": {
"ref": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"digest": "sha256:f6c58afdea7a721d079ebd6ee5483f2c9da77dd1e709e16d60a82c218e80a451",
"at": "2026-09-22T08:38:25Z"
},
"tandoor-postgres": {
"ref": "postgres:16-alpine",
"digest": "sha256:721873c34ceb9f8d8fc265984940dc982404c105f19ad51be9fdc5970a6080ea",
"at": "2026-09-22T08:38:25Z"
}
},
"front_door_rc": 0,
"front_door_code": "200",
"front_door_bytes": 4981,
"docker_health": "healthy\nhealthy",
"version_badge": {
"hu": [
{
"title": "Ez az alkalmazás a legfrissebb elérhető változatot futtatja.",
"text": "Naprakész"
}
],
"en": [
{
"title": "This app is running the newest version available.",
"text": "Up to date"
}
]
},
"health_word": {
"hu": "Nem egészséges",
"hu_context": "← Alkalmazások Tandoor Recipes Nem egészséges Naprakész Megnyitás ↗ Napló Exportálás Beállítások Receptkezelő és étkezés tervező a családnak ~512M RAM home Pi kompatibilis Áthelyezés másik tárhelyre Ennek az alkalmazásna",
"en": null,
"en_context": "← Apps Tandoor Recipes Not healthy Up to date Open ↗ Log Export Settings A recipe manager and meal planner for the household ~512M RAM home Runs on Pi Move to another storage You can move this app’s data to another conne"
}
}
]
@@ -0,0 +1,509 @@
tandoor-postgres |
tandoor-postgres | PostgreSQL Database directory appears to contain a database; Skipping initialization
tandoor-postgres |
tandoor-postgres | 2026-09-22 10:53:18.859 CEST [1] LOG: starting PostgreSQL 16.15 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
tandoor-postgres | 2026-09-22 10:53:18.859 CEST [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
tandoor-postgres | 2026-09-22 10:53:18.859 CEST [1] LOG: listening on IPv6 address "::", port 5432
tandoor-postgres | 2026-09-22 10:53:18.867 CEST [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
tandoor-postgres | 2026-09-22 10:53:18.880 CEST [29] LOG: database system was shut down at 2026-09-22 10:53:09 CEST
tandoor-postgres | 2026-09-22 10:53:18.895 CEST [1] LOG: database system is ready to accept connections
tandoor | Deleting 'vue3/assets/pt_BR-tNFhL9ci.js.gz'
tandoor | Deleting 'vue3/assets/SupermarketEditor-L_B5nyx2.3796d8a521cf.js'
tandoor | Deleting 'vue3/assets/MealTypeEditor-DAAKjxZB.js'
tandoor | Deleting 'vue3/assets/sl-Nkic6vBb.c6ce1eb24108.js'
tandoor | Deleting 'vue3/assets/nl-DIqabTrY.fcf6d7b2df13.js.gz'
tandoor | Deleting 'vue3/assets/UnitEditor-54HrDOhT.9040eae92234.js.gz'
tandoor | Deleting 'vue3/assets/FoodEditor-BR-tK8Pr.js.gz'
tandoor | Deleting 'vue3/assets/forwardRefs-DVyU53sF.js'
tandoor | Deleting 'vue3/assets/position-PPD1ymuo.js.gz'
tandoor | Deleting 'vue3/assets/ca-C5QQCa9o.ff6e54a70768.js.gz'
tandoor | Deleting 'vue3/assets/KeywordsBar-BwJ0lEDV.js'
tandoor | Deleting 'vue3/assets/number_utils-DFmVVcK0.js'
tandoor | Deleting 'vue3/assets/ja-Cqm3qbrP.js.gz'
tandoor | Deleting 'vue3/assets/bg-_Ardqm8i.c46924a2b9d5.js'
tandoor | Deleting 'vue3/assets/VOverlay-CKBxglwy.b98729efffd0.css.gz'
tandoor | Deleting 'vue3/assets/fr-D1J9AIHe.js'
tandoor | Deleting 'vue3/assets/goto-DubWlX_o.0c25d7a8f5fa.js.gz'
tandoor | Deleting 'vue3/assets/VOverlay-CKBxglwy.css.gz'
tandoor | Deleting 'vue3/assets/lv-BUrQRxBI.8efc7d113546.js'
tandoor | Deleting 'vue3/assets/AccessTokenEditor-BqYrLuQE.4d7347e87897.js.gz'
tandoor | Deleting 'vue3/assets/VSwitch-Djsboh2v.92774fc66b84.css.gz'
tandoor | Deleting 'vue3/assets/PropertyEditor-DK6Qeffb.864b139cbb79.js'
tandoor | Deleting 'vue3/assets/ModelDeletePage-C4id8-tu.1ed7ee64e600.js.gz'
tandoor | Deleting 'vue3/assets/da-DHqdZ4yZ.197be8016aca.js'
tandoor | Deleting 'vue3/assets/ro-CG_JGo0i.js'
tandoor | Deleting 'vue3/assets/ExportDataSettings-BlFk8Tn-.6ccf02326ec4.js.gz'
tandoor | Deleting 'vue3/assets/PropertiesEditor-DCxEsAZO.16f243b74d54.js'
tandoor | Deleting 'vue3/assets/RecipeImportPage-DBKJ6DXr.a23aec8a9383.js'
tandoor | Deleting 'vue3/assets/el-DNs6HoDL.08d7c47f5d2b.js'
tandoor | Deleting 'vue3/assets/RecipeViewPage-BY3ErEFj.457b3d77074e.css'
tandoor | Deleting 'vue3/assets/DeleteConfirmDialog-C1xQIJsS.b663eac25ee4.js.gz'
tandoor | Deleting 'vue3/assets/VTimePicker-DNtQ2GaY.658bf461867a.css'
tandoor | Deleting 'vue3/assets/logo_color-CXE3OqOR.d7c2e31a63b7.svg'
tandoor | Deleting 'vue3/assets/fa-v4compatibility-CCth-dXg.4ed293ceaca9.ttf.gz'
tandoor | Deleting 'vue3/assets/IngredientEditorPage-DF3k1tNH.aa9eb5c590ab.js'
tandoor | Deleting 'vue3/assets/InventoryLocationEditor-DIxi9S-h.5de878ee0a17.js'
tandoor | Deleting 'vue3/assets/ShoppingListView-Dgh1luaN.css'
tandoor | Deleting 'vue3/assets/StartPage-0ugVot93.js.gz'
tandoor | Deleting 'vue3/assets/DeleteConfirmDialog-C1xQIJsS.js'
tandoor | Deleting 'vue3/assets/MealPlanEditor-B5jLcokm.js.gz'
tandoor | Deleting 'vue3/assets/number_utils-Brwft-8t.d570ceeec9ef.css'
tandoor | Deleting 'vue3/assets/MealPlanEditor-B5jLcokm.7c8b48842426.js'
tandoor | Deleting 'vue3/assets/VDivider-BeM1gRhl.css'
tandoor | Deleting 'vue3/assets/AccountSettings-BHfX12gt.js'
tandoor | Deleting 'vue3/assets/CustomFilterEditor-Dc0piaF0.js'
tandoor | Deleting 'vue3/assets/lt-SI6E7sY1.2560d8a9d387.js.gz'
tandoor | Deleting 'vue3/assets/de-5mnKTxw2.js'
tandoor | Deleting 'vue3/assets/SearchSettings-CBkFhMns.js'
tandoor | Deleting 'vue3/assets/logo_color-CXE3OqOR.svg'
tandoor | Deleting 'vue3/assets/fontello-B1X0PDnA.068ca2b316db.ttf'
tandoor | Deleting 'vue3/assets/PropertyEditor-DK6Qeffb.js'
tandoor | Deleting 'vue3/assets/RecipeEditor-CcFlDNPw.css'
tandoor | Deleting 'vue3/assets/RecipeCard-C2Hjv7vL.6b450d3cfcd0.js.gz'
tandoor | Deleting 'vue3/assets/CustomFilterEditor-Dc0piaF0.fe7085369993.js.gz'
tandoor | Deleting 'vue3/assets/VStepper-lk6OG_fY.23af7e185e38.css'
tandoor | Deleting 'vue3/assets/VList-edQgt9_l.2642c051884b.css.gz'
tandoor | Deleting 'vue3/assets/InventoryBookingPage-orELmDxm.js'
tandoor | Deleting 'vue3/assets/PropertyEditorPage-Ti9vpeer.e4b532c48301.js'
tandoor | Deleting 'vue3/assets/pt-CXzOqbUC.js'
tandoor | Deleting 'vue3/assets/BooksPage-Dh8_wlv_.cb4aba43024a.js'
tandoor | Deleting 'vue3/assets/ModelListPage-xoBv_A6i.js.gz'
tandoor | Deleting 'vue3/assets/number_utils-DFmVVcK0.js.gz'
tandoor | Deleting 'vue3/assets/FdcSearchDialog-BvpKKey4.js.gz'
tandoor | Deleting 'vue3/assets/position-PPD1ymuo.7195d47ccd52.js'
tandoor | Deleting 'vue3/assets/model_utils-a_hMB_Qu.js'
tandoor | Deleting 'vue3/assets/useFileApi-BD_kCiAS.js'
tandoor | Deleting 'vue3/assets/he-DxNGVUQd.79ff03f4063a.js'
tandoor | Deleting 'vue3/assets/zh_Hant-CERwsE1Q.js.gz'
tandoor | Deleting 'vue3/assets/SearchPage-BQ1P-4y8.ba1f4c8767b9.js.gz'
tandoor | Deleting 'vue3/assets/InventoryLocationEditor-DIxi9S-h.js'
tandoor | Deleting 'vue3/assets/fi-BLW_HATq.078772422941.js'
tandoor | Deleting 'vue3/assets/nn-CkCilbi1.ccb3acb89917.js.gz'
tandoor | Deleting 'vue3/assets/UserFileEditor-DKOcBuK-.js'
tandoor | Deleting 'vue3/assets/useFileApi-BD_kCiAS.37a20e72aad4.js.gz'
tandoor | Deleting 'vue3/assets/hu-DlZ4REsp.js'
tandoor | Deleting 'vue3/assets/pt-CXzOqbUC.js.gz'
tandoor | Deleting 'vue3/assets/VTimePicker-BwPSjcxJ.a223b07c705e.js'
tandoor | Deleting 'vue3/assets/pt_BR-tNFhL9ci.js'
tandoor | Deleting 'vue3/assets/CustomFilterEditor-Dc0piaF0.js.gz'
tandoor | Deleting 'vue3/assets/ko-ADlXHFgo.js'
tandoor | Deleting 'vue3/assets/VDataTableServer-BYvhcs5d.js'
tandoor | Deleting 'vue3/assets/VBtn-rFOjfrXe.df1b89399b11.css.gz'
tandoor | Deleting 'vue3/assets/SupermarketCategoryEditor-rlIgT3uE.js'
tandoor | Deleting 'vue3/assets/CosmeticSettings-DTudQs61.0308c579b183.css'
tandoor | Deleting 'vue3/assets/RecipeEditor-CcFlDNPw.c63cac250b70.css.gz'
tandoor | Deleting 'vue3/assets/fontello-BJkOxCgW.8d4a4e6f7431.woff2'
tandoor | Deleting 'vue3/assets/MealPlanEditor-B5jLcokm.js'
tandoor | Deleting 'vue3/assets/VAvatar-DYNiWd3v.js'
tandoor | Deleting 'vue3/assets/brand_logo-DHt4CyHb.svg'
tandoor | Deleting 'vue3/assets/ripple-CeGB3d9x.3ba9fc624e34.css.gz'
tandoor | Deleting 'vue3/assets/OpenDataImportSettings-Ds1SQcSg.js.gz'
tandoor | Deleting 'vue3/assets/dimensions-B5x3TxJs.js.gz'
tandoor | Deleting 'vue3/assets/PropertiesEditor-DCxEsAZO.js.gz'
tandoor | Deleting 'vue3/assets/PropertiesEditor-DCxEsAZO.16f243b74d54.js.gz'
tandoor | Deleting 'vue3/assets/VFileUpload-ByFVW7Fp.931d5a48009e.js.gz'
tandoor | Deleting 'vue3/assets/DatabaseModelCol-rKX1F7Em.js.gz'
tandoor | Deleting 'vue3/assets/ConnectorConfigEditor-D06JOZDX.5e0dd3a66e81.js.gz'
tandoor | Deleting 'vue3/assets/IngredientEditorPage-DF3k1tNH.js.gz'
tandoor | Deleting 'vue3/assets/lt-SI6E7sY1.js'
tandoor | Deleting 'vue3/assets/DatabasePage-CY4BXH8T.js.gz'
tandoor | Deleting 'vue3/assets/bg-_Ardqm8i.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListView-C0_akhap.js'
tandoor | Deleting 'vue3/assets/HierarchyEditor-wADOsT_-.css'
tandoor | Deleting 'vue3/assets/fontello-B1X0PDnA.ttf'
tandoor | Deleting 'vue3/assets/VOverlay-BSdT-t2A.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListView-Dgh1luaN.css.gz'
tandoor | Deleting 'vue3/assets/it-DJ2I6vOs.js.gz'
tandoor | Deleting 'vue3/assets/bg-_Ardqm8i.js'
tandoor | Deleting 'vue3/assets/VSwitch-Cs5DQi32.4a7617f1519d.js'
tandoor | Deleting 'vue3/assets/logo_color-CXE3OqOR.svg.gz'
tandoor | Deleting 'vue3/assets/WelcomePage-zPtXSDjc.4dfacc5c8da0.js.gz'
tandoor | Deleting 'vue3/assets/UnitEditor-54HrDOhT.9040eae92234.js'
tandoor | Deleting 'vue3/assets/hr-CMRkObu_.js'
tandoor | Deleting 'vue3/assets/VTextField-j0TpvUy_.42df5f015009.css.gz'
tandoor | Deleting 'vue3/assets/OpenDataImportSettings-Ds1SQcSg.f895a746d306.js.gz'
tandoor | Deleting 'vue3/assets/ja-Cqm3qbrP.d617fa524f97.js'
tandoor | Deleting 'vue3/assets/VAvatar-DYNiWd3v.js.gz'
tandoor | Deleting 'vue3/assets/InventoryBookingPage-orELmDxm.js.gz'
tandoor | Deleting 'vue3/assets/ApiSettings-CzWgpe8R.82be1325ed18.js'
tandoor | Deleting 'vue3/assets/fontello-CnWxryRb.eot'
tandoor | Deleting 'vue3/assets/VList-DL25Fkt0.js.gz'
tandoor | Deleting 'vue3/assets/InventoryEntryLogDialog-Dv6Omj68.d4f65e984493.js.gz'
tandoor | Deleting 'vue3/assets/VSwitch-Cs5DQi32.4a7617f1519d.js.gz'
tandoor | Deleting 'vue3/assets/VColorPicker-DoVATq5z.26d1fdd28765.css.gz'
tandoor | Deleting 'vue3/assets/HouseholdEditor-D5JQGcsU.js'
tandoor | Deleting 'vue3/assets/VList-edQgt9_l.css.gz'
tandoor | Deleting 'vue3/assets/VTabs-DzUjbg1Y.js.gz'
tandoor | Deleting 'vue3/assets/ConnectorConfigEditor-D06JOZDX.js'
tandoor | Deleting 'vue3/assets/BatchDeleteDialog-C9gKVWYX.js.gz'
tandoor | Deleting 'vue3/assets/IngredientEditorPage-DF3k1tNH.aa9eb5c590ab.js.gz'
tandoor | Deleting 'vue3/assets/nn-CkCilbi1.ccb3acb89917.js'
tandoor | Deleting 'vue3/assets/InventoryEntryLogDialog-Dv6Omj68.d4f65e984493.js'
tandoor | Deleting 'vue3/assets/VDivider-BeM1gRhl.727c640d6c8d.css.gz'
tandoor | Deleting 'vue3/assets/ApiSettings-CzWgpe8R.js'
tandoor | Deleting 'vue3/assets/SpaceEditor-BG9pNfzF.9465c6dc1d2f.css'
tandoor | Deleting 'vue3/assets/ripple-CeGB3d9x.css.gz'
tandoor | Deleting 'vue3/assets/AiProviderEditor-C4TWtCwO.e6d60050b025.css.gz'
tandoor | Deleting 'vue3/assets/SupermarketEditor-L_B5nyx2.3796d8a521cf.js.gz'
tandoor | Deleting 'vue3/assets/VDivider-BeM1gRhl.727c640d6c8d.css'
tandoor | Deleting 'vue3/assets/fa-v4compatibility-CCth-dXg.4ed293ceaca9.ttf'
tandoor | Deleting 'vue3/assets/VListItemAction-CXKY8J-P.js.gz'
tandoor | Deleting 'vue3/assets/VColorPicker-DoVATq5z.css.gz'
tandoor | Deleting 'vue3/assets/ModelListPage-xoBv_A6i.4681a991ae27.js.gz'
tandoor | Deleting 'vue3/assets/uk-BClnjIfW.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListPage-Cg_SrILL.f2cae0d44a21.js'
tandoor | Deleting 'vue3/assets/RecipeViewPage-BZECYYUo.94016f72f4cb.js.gz'
tandoor | Deleting 'vue3/assets/number_utils-Brwft-8t.css.gz'
tandoor | Deleting 'vue3/assets/de-5mnKTxw2.js.gz'
tandoor | Deleting 'vue3/assets/VFileUpload-7CWUohzn.d182bb8e4f03.css.gz'
tandoor | Deleting 'vue3/assets/VListItemAction-CXKY8J-P.ffd6a13b9ab5.js'
tandoor | Deleting 'vue3/assets/VAvatar-_OUjgGcO.css.gz'
tandoor | Deleting 'vue3/assets/position-PPD1ymuo.7195d47ccd52.js.gz'
tandoor | Deleting 'vue3/assets/brand_logo-DHt4CyHb.fa64319ab35b.svg.gz'
tandoor | Deleting 'vue3/assets/VChip-D7GkfSeA.js'
tandoor | Deleting 'vue3/assets/ConnectorConfigEditor-D06JOZDX.5e0dd3a66e81.js'
tandoor | Deleting 'vue3/assets/fileFilter-JaX38xV6.js.gz'
tandoor | Deleting 'vue3/assets/MealTypeEditor-DAAKjxZB.js.gz'
tandoor | Deleting 'vue3/assets/pl-B7dc5eNY.js'
tandoor | Deleting 'vue3/assets/MealPlanSettings-BU5yRyFO.js'
tandoor | Deleting 'vue3/assets/VAutocomplete-BnHJd-1b.css.gz'
tandoor | Deleting 'vue3/assets/framework-CKkm3ZT1.0da2482ae88a.js.gz'
tandoor | Deleting 'vue3/assets/AccessTokenEditor-BqYrLuQE.js'
tandoor | Deleting 'vue3/assets/VColorPicker-Bc1o5piM.js.gz'
tandoor | Deleting 'vue3/assets/UserSpaceEditor-BiMFbwI_.7d9049ae96b5.js.gz'
tandoor | Deleting 'vue3/assets/CookLogEditor-wf-1cNFJ.ef3a04991a05.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingSettings-DBfLsRlj.js'
tandoor | Deleting 'vue3/assets/AddToShoppingDialog-CS_S-d2g.eb5504799c65.js'
tandoor | Deleting 'vue3/assets/fa-solid-900-CTAAxXor.4a6591ab5460.woff2'
tandoor | Deleting 'vue3/assets/MealPlanSettings-BU5yRyFO.2f9dbd605868.js.gz'
tandoor | Deleting 'vue3/assets/AiProviderEditor-BYnKvCw_.js.gz'
tandoor | Deleting 'vue3/assets/uk-BClnjIfW.b429b8ed5096.js'
tandoor | Deleting 'vue3/assets/BookViewPage-CHarlNiQ.bdf998b08053.js.gz'
tandoor | Deleting 'vue3/assets/HouseholdPage-BsKZpym2.js'
tandoor | Deleting 'vue3/assets/fi-BLW_HATq.078772422941.js.gz'
tandoor | Deleting 'vue3/assets/fontello-CnWxryRb.e73a0647198c.eot.gz'
tandoor | Deleting 'vue3/assets/InviteLinkEditor-BZ7NMcrL.js'
tandoor | Deleting 'vue3/assets/VChip-D7GkfSeA.4de7c0a8c2e3.js.gz'
tandoor | Deleting 'vue3/assets/VRating-BAibLkoF.css'
tandoor | Deleting 'vue3/assets/RecipeBookEditor-Bha-wuB-.js'
tandoor | Deleting 'vue3/assets/VTextField-WpOvMnND.js'
tandoor | Deleting 'vue3/assets/el-DNs6HoDL.08d7c47f5d2b.js.gz'
tandoor | Deleting 'vue3/assets/AutomationEditor-C6fYAtLL.js.gz'
tandoor | Deleting 'vue3/assets/fontello-CnWxryRb.e73a0647198c.eot'
tandoor | Deleting 'vue3/assets/VDivider-rMXvH15P.085aaed48fa0.js'
tandoor | Deleting 'vue3/assets/ShoppingListView-Dgh1luaN.73de85b4e4df.css.gz'
tandoor | Deleting 'vue3/assets/UserFileEditor-DKOcBuK-.js.gz'
tandoor | Deleting 'vue3/assets/VAutocomplete-CFEp5VcY.js'
tandoor | Deleting 'vue3/assets/SpaceEditor-BG9pNfzF.css'
tandoor | Deleting 'vue3/assets/PropertyEditorPage-Ti9vpeer.js'
tandoor | Deleting 'vue3/assets/ShoppingListPage-Cg_SrILL.js'
tandoor | Deleting 'vue3/assets/integration_utils-D8RSOVmp.js.gz'
tandoor | Deleting 'vue3/assets/nb_NO-CdS1Hktt.294979d98dcb.js'
tandoor | Deleting 'vue3/assets/SearchSettings-CBkFhMns.js.gz'
tandoor | Deleting 'vue3/assets/VChip-Hpg9IuyM.8dc9d3e18964.css.gz'
tandoor | Deleting 'vue3/assets/VAutocomplete-BnHJd-1b.css'
tandoor | Deleting 'vue3/assets/ja-Cqm3qbrP.js'
tandoor | Deleting 'vue3/assets/VOverlay-BSdT-t2A.js'
tandoor | Deleting 'vue3/assets/VList-DL25Fkt0.5373fcf8fbc3.js'
tandoor | Deleting 'vue3/assets/SearchPage-BQ1P-4y8.js'
tandoor | Deleting 'vue3/assets/StartPage-0ugVot93.1c72303e8853.js.gz'
tandoor | Deleting 'vue3/assets/fdc-Byjxh21q.6a8962cb2f19.js.gz'
tandoor | Deleting 'vue3/assets/UserSpaceEditor-BiMFbwI_.7d9049ae96b5.js'
tandoor | Deleting 'vue3/assets/PropertyEditorPage-Ti9vpeer.e4b532c48301.js.gz'
tandoor | Deleting 'vue3/assets/SpaceEditor-CIrx7Wew.44bd56e30e62.js.gz'
tandoor | Deleting 'vue3/assets/CosmeticSettings-DTudQs61.css.gz'
tandoor | Deleting 'vue3/assets/transitions-BVkpOt9D.0916b5adcb73.js.gz'
tandoor | Deleting 'vue3/assets/ModelEditPage-B_U4Berv.js'
tandoor | Deleting 'vue3/assets/dimensions-B5x3TxJs.5c0bb4b51390.js'
tandoor | Deleting 'vue3/assets/AccessTokenEditor-BqYrLuQE.4d7347e87897.js'
tandoor | Deleting 'vue3/assets/VColorPicker-DoVATq5z.26d1fdd28765.css'
tandoor | Deleting 'vue3/assets/AddToShoppingDialog-BXt5jKLm.css'
tandoor | Deleting 'vue3/assets/ru-BXmxlY4u.js.gz'
tandoor | Deleting 'vue3/assets/hu-DlZ4REsp.c1bc941c31dc.js.gz'
tandoor | Deleting 'vue3/assets/VList-edQgt9_l.css'
tandoor | Deleting 'vue3/assets/UnitConversionEditor-BUHvM5Eh.js.gz'
tandoor | Deleting 'vue3/assets/VTextarea-zkkSnzux.js.gz'
tandoor | Deleting 'vue3/assets/ModelEditPage-B_U4Berv.7dc258e43ccf.js.gz'
tandoor | Deleting 'vue3/assets/RecipeCard-C2Hjv7vL.6b450d3cfcd0.js'
tandoor | Deleting 'vue3/assets/MealPlanEditor-DqGGZRzo.css'
tandoor | Deleting 'vue3/assets/VSwitch-Cs5DQi32.js.gz'
tandoor | Deleting 'vue3/assets/TestPage-CPX2qaEd.0b75aa57bbeb.js.gz'
tandoor | Deleting 'vue3/assets/dimensions-B5x3TxJs.5c0bb4b51390.js.gz'
tandoor | Deleting 'vue3/assets/main-nTFEtOSD.js.gz'
tandoor | Deleting 'vue3/assets/UserFileEditor-DKOcBuK-.cc1baa1c02f3.js'
tandoor | Deleting 'vue3/assets/StorageEditor-Up4uWQb6.js'
tandoor | Deleting 'vue3/assets/VBtn-DTdW4rEh.js.gz'
tandoor | Deleting 'vue3/assets/he-DxNGVUQd.js.gz'
tandoor | Deleting 'vue3/assets/VChip-Hpg9IuyM.8dc9d3e18964.css'
tandoor | Deleting 'vue3/assets/VTextarea-dHE66AZf.css'
tandoor | Deleting 'vue3/assets/intersect-siLrmRQw.cc9e340f1351.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListPage-Cg_SrILL.js.gz'
tandoor | Deleting 'vue3/assets/framework-CKkm3ZT1.js'
tandoor | Deleting 'vue3/assets/ca-C5QQCa9o.ff6e54a70768.js'
tandoor | Deleting 'vue3/assets/fa-solid-900-D0aA9rwL.ttf'
tandoor | Deleting 'vue3/assets/VListItemAction-CXKY8J-P.ffd6a13b9ab5.js.gz'
tandoor | Deleting 'vue3/assets/main-nTFEtOSD.4273b900f1bf.js'
tandoor | Deleting 'vue3/assets/transitions-BVkpOt9D.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListEditor-vKmfFTZN.4f5dd4c981a5.js'
tandoor | Deleting 'vue3/assets/ripple-CeGB3d9x.css'
tandoor | Deleting 'vue3/assets/ClosableHelpAlert-BoN8dDrm.js.gz'
tandoor | Deleting 'vue3/assets/position-D7bmUCsu.f212789ebec5.css'
tandoor | Deleting 'vue3/assets/ShoppingListView-C0_akhap.1b6d4259ca8e.js.gz'
tandoor | Deleting 'vue3/assets/hy-HqufUZnw.js'
tandoor | Deleting 'vue3/assets/InventoryBookingPage-orELmDxm.45c2c2f7531a.js'
tandoor | Deleting 'vue3/assets/el-DNs6HoDL.js'
tandoor | Deleting 'vue3/assets/VTabs-DzUjbg1Y.fa06924ae72f.js'
tandoor | Deleting 'vue3/assets/form-CDdumt48.5fcbf914ae94.js'
tandoor | Deleting 'vue3/assets/HouseholdPage-BsKZpym2.a5566a4564d6.js.gz'
tandoor | Deleting 'vue3/assets/forwardRefs-DVyU53sF.64171d66d1df.js.gz'
tandoor | Deleting 'vue3/assets/integration_utils-D8RSOVmp.8006123d3084.js.gz'
tandoor | Deleting 'vue3/assets/SpaceSettings-BPOt7vl3.js.gz'
tandoor | Deleting 'vue3/assets/ModelEditorBase-CZWlxxIQ.cf852babb62d.js'
tandoor | Deleting 'vue3/assets/RecipeBookEditor-Bha-wuB-.js.gz'
tandoor | Deleting 'vue3/assets/ModelEditPage-B5oBrkJw.0c31f8b7052c.css.gz'
tandoor | Deleting 'vue3/assets/VAutocomplete-CFEp5VcY.2a4e88a23ede.js.gz'
tandoor | Deleting 'vue3/assets/FdcSearchDialog-BvpKKey4.js'
tandoor | Deleting 'vue3/assets/transitions-BVkpOt9D.js'
tandoor | Deleting 'vue3/assets/ro-CG_JGo0i.c856bd470eef.js'
tandoor | Deleting 'vue3/assets/RecipeViewPage-BZECYYUo.js.gz'
tandoor | Deleting 'vue3/assets/IngredientsTable-DZblS1P-.js.gz'
tandoor | Deleting 'vue3/assets/RecipeCard-C2Hjv7vL.js.gz'
tandoor | Deleting 'vue3/assets/CosmeticSettings-i2TDHCpS.js'
tandoor | Deleting 'vue3/assets/VBtn-rFOjfrXe.css.gz'
tandoor | Deleting 'vue3/assets/FoodEditor-BR-tK8Pr.24df4c5c0e7e.js.gz'
tandoor | Deleting 'vue3/assets/VDivider-rMXvH15P.js'
tandoor | Deleting 'vue3/assets/cs-DUZpBKTY.js'
tandoor | Deleting 'vue3/assets/TestPage-CPX2qaEd.0b75aa57bbeb.js'
tandoor | Deleting 'vue3/assets/fdc-Byjxh21q.js'
tandoor | Deleting 'vue3/assets/CookLogEditor-wf-1cNFJ.js.gz'
tandoor | Deleting 'vue3/assets/HouseholdEditor-D5JQGcsU.js.gz'
tandoor | Deleting 'vue3/assets/VDivider-rMXvH15P.085aaed48fa0.js.gz'
tandoor | Deleting 'vue3/assets/ripple-Byn3Fc0w.3ad96cecfca7.js'
tandoor | Deleting 'vue3/assets/UserSpaceEditor-BiMFbwI_.js.gz'
tandoor | Deleting 'vue3/assets/fr-D1J9AIHe.a85f6556b6a2.js.gz'
tandoor | Deleting 'vue3/assets/fr-D1J9AIHe.js.gz'
tandoor | Deleting 'vue3/assets/VStepper-lk6OG_fY.css.gz'
tandoor | Deleting 'vue3/assets/ko-ADlXHFgo.js.gz'
tandoor | Deleting 'vue3/assets/WelcomePage-zPtXSDjc.4dfacc5c8da0.js'
tandoor | Deleting 'vue3/assets/VChip-D7GkfSeA.js.gz'
tandoor | Deleting 'vue3/assets/SpaceSetupPage-BSv2ZmPb.js'
tandoor | Deleting 'vue3/assets/zh_Hant-CERwsE1Q.8534ecee0fb0.js.gz'
tandoor | Deleting 'vue3/assets/ShoppingListPage-Cg_SrILL.f2cae0d44a21.js.gz'
tandoor | Deleting 'vue3/assets/UserSpaceEditor-BiMFbwI_.js'
tandoor | Deleting 'vue3/assets/VOverlay-BSdT-t2A.1f4f586d7141.js.gz'
tandoor | Deleting 'vue3/assets/RecipeImportPage-DBKJ6DXr.a23aec8a9383.js.gz'
tandoor | Deleting 'vue3/assets/VDataTableServer-BYvhcs5d.d5a7cfdcf126.js'
tandoor | Deleting 'vue3/assets/ar-Ct4DpnJT.js'
tandoor | Deleting 'vue3/assets/VRating-Qn4Hz2ci.119bbc89c24a.js'
tandoor | Deleting 'vue3/assets/number_utils-DFmVVcK0.cfc3e206a4c1.js.gz'
tandoor | Deleting 'vue3/assets/HelpPage-C-xlKPtR.fa54da2fd1cf.js.gz'
tandoor | Deleting 'vue3/assets/HierarchyEditor-wADOsT_-.885aa06e77cd.css.gz'
tandoor | Deleting 'vue3/assets/ripple-Byn3Fc0w.3ad96cecfca7.js.gz'
tandoor | Deleting 'vue3/assets/VChip-Hpg9IuyM.css.gz'
tandoor | Deleting 'vue3/assets/RecipeViewPage-BZECYYUo.94016f72f4cb.js'
tandoor | Deleting 'vue3/assets/PrivateRecipeBadge-BVOXRXwb.dcd01dd00de0.js'
tandoor | Deleting 'vue3/assets/SearchSettings-CBkFhMns.b9bc4a1f032c.js'
tandoor | Deleting 'vue3/assets/fontello-BEgLts9b.a782baa8633b.woff'
tandoor | Deleting 'vue3/assets/nl-DIqabTrY.js.gz'
tandoor | Deleting 'vue3/assets/et-zY9CrDMt.1761c6eb5f48.js'
tandoor | Deleting 'vue3/assets/DeleteConfirmDialog-C1xQIJsS.b663eac25ee4.js'
tandoor | Deleting 'vue3/assets/RecipeEditor-Cu9LLPvL.js.gz'
tandoor | Deleting 'vue3/assets/RecipeBookEditor-Bha-wuB-.e3586751a38a.js'
tandoor | Deleting 'vue3/assets/goto-DubWlX_o.js.gz'
tandoor | Deleting 'vue3/assets/ModelMergeDialog-BCXJZjTO.4753553f721f.js'
tandoor | Deleting 'vue3/assets/AutomationEditor-C6fYAtLL.js'
tandoor | Deleting 'vue3/assets/VTextField-j0TpvUy_.42df5f015009.css'
tandoor | Deleting 'vue3/assets/SupermarketEditor-L_B5nyx2.js'
tandoor | Deleting 'vue3/assets/el-DNs6HoDL.js.gz'
tandoor | Deleting 'vue3/assets/lv-BUrQRxBI.8efc7d113546.js.gz'
tandoor | Deleting 'vue3/assets/MealPlanSettings-BU5yRyFO.2f9dbd605868.js'
tandoor | Deleting 'vue3/assets/NumberScalerDialog-DoOvxgjM.js'
tandoor | Deleting 'vue3/assets/fa-solid-900-D0aA9rwL.ttf.gz'
tandoor | Deleting 'vue3/assets/intersect-siLrmRQw.cc9e340f1351.js'
tandoor | Deleting 'vue3/assets/VTabs-Bz9gKX-q.27a6a10279b7.css'
tandoor | Deleting 'vue3/assets/fa-regular-400-DZaxPHgR.ttf.gz'
tandoor | Deleting 'vue3/assets/fa-v4compatibility-CCth-dXg.ttf.gz'
tandoor | Deleting 'vue3/assets/tr-OeJMQhAK.2c406e95c585.js.gz'
tandoor | Deleting 'vue3/assets/CosmeticSettings-DTudQs61.css'
tandoor | Deleting 'vue3/assets/RecipeViewPage-BY3ErEFj.css.gz'
tandoor | Deleting 'vue3/assets/VSwitch-Djsboh2v.css.gz'
tandoor | Deleting 'vue3/assets/TestPage-CPX2qaEd.js.gz'
tandoor | Deleting 'vue3/assets/model_utils-a_hMB_Qu.js.gz'
tandoor | Deleting 'vue3/assets/ar-Ct4DpnJT.js.gz'
tandoor | Deleting 'vue3/assets/DeleteConfirmDialog-C1xQIJsS.js.gz'
tandoor | Deleting 'vue3/assets/BooksPage-Dh8_wlv_.js.gz'
tandoor | Deleting 'assets/recipe_no_image.c659e2604ad6.svg.gz'
tandoor | Deleting 'assets/logo_black.dc487b18028c.svg.gz'
tandoor | Deleting 'assets/logo_color_shopping.svg.gz'
tandoor | Deleting 'assets/brand_logo.ad2e3aa263da.svg'
tandoor | Deleting 'assets/logo_color_192.c9b9177ff941.png'
tandoor | Deleting 'assets/logo_black.svg'
tandoor | Deleting 'assets/header.svg.gz'
tandoor | Deleting 'assets/brand_logo.svg.gz'
tandoor | Deleting 'assets/logo_color_144.f09537dbf142.png'
tandoor | Deleting 'assets/logo_color_128.png'
tandoor | Deleting 'assets/brand_logo.ad2e3aa263da.svg.gz'
tandoor | Deleting 'assets/logo_color_plan.4ccbb336af9d.svg.gz'
tandoor | Deleting 'assets/spinner.168a09fd2600.svg.gz'
tandoor | Deleting 'assets/logo_color_plan_144.22c6c7678fdb.png'
tandoor | Deleting 'assets/spinner.svg.gz'
tandoor | Deleting 'assets/logo_color_512.png'
tandoor | Deleting 'assets/logo_black.svg.gz'
tandoor | Deleting 'assets/logo_color_svg.d7c2e31a63b7.svg.gz'
tandoor | Deleting 'assets/recipe_no_image.c659e2604ad6.svg'
tandoor | Deleting 'assets/logo_color_plan_144.png'
tandoor | Deleting 'assets/logo_color_32.b7d9707eac91.png'
tandoor | Deleting 'assets/logo_color_512.0a28df8511e3.png'
tandoor | Deleting 'assets/brand_logo_white.svg.gz'
tandoor | Deleting 'assets/logo_black.dc487b18028c.svg'
tandoor | Deleting 'assets/logo_color_plan.svg.gz'
tandoor | Deleting 'assets/logo_color_shopping.fd1e81a4dcab.svg.gz'
tandoor | Deleting 'assets/header.48e8ad9e7540.svg'
tandoor | Deleting 'assets/logo_color_plan_512.png'
tandoor | Deleting 'assets/logo_color_shopping_512.6b2e69402327.png'
tandoor | Deleting 'assets/recipe_no_image.svg'
tandoor | Deleting 'assets/logo_color_128.a90db52449d9.png'
tandoor | Deleting 'assets/logo_color_shopping_512.png'
tandoor | Deleting 'assets/brand_logo.svg'
tandoor | Deleting 'assets/logo_color_plan.svg'
tandoor | Deleting 'assets/logo_color_32.png'
tandoor | Deleting 'assets/logo_color_144.png'
tandoor | Deleting 'assets/logo_color_shopping.fd1e81a4dcab.svg'
tandoor | Deleting 'assets/header.48e8ad9e7540.svg.gz'
tandoor | Deleting 'assets/brand_logo_white.d43daa47dca3.svg.gz'
tandoor | Deleting 'assets/logo_color_180.0fcae5e85a72.png'
tandoor | Deleting 'assets/logo_color_180.png'
tandoor | Deleting 'assets/logo_color_shopping_144.png'
tandoor | Deleting 'assets/logo_color_svg.svg'
tandoor | Deleting 'assets/brand_logo_white.d43daa47dca3.svg'
tandoor | Deleting 'assets/logo_color_plan.4ccbb336af9d.svg'
tandoor | Deleting 'assets/logo_color_plan_512.028b9bcca1eb.png'
tandoor | Deleting 'assets/logo_color_shopping.svg'
tandoor | Deleting 'assets/recipe_no_image.svg.gz'
tandoor | Deleting 'assets/header.svg'
tandoor | Deleting 'assets/logo_color_svg.svg.gz'
tandoor | Deleting 'assets/spinner.168a09fd2600.svg'
tandoor | Deleting 'assets/brand_logo.6ebe02bf6707.png'
tandoor | Deleting 'assets/spinner.svg'
tandoor | Deleting 'assets/logo_color_svg.d7c2e31a63b7.svg'
tandoor | Deleting 'assets/logo_color_shopping_144.6c05e01d07b2.png'
tandoor | Deleting 'assets/logo_color_192.png'
tandoor | Deleting 'assets/brand_logo.png'
tandoor | Deleting 'assets/brand_logo_white.svg'
tandoor | Deleting 'mfa/js/webauthn-json.6a3183313556.js'
tandoor | Deleting 'mfa/js/webauthn-json.6a3183313556.js.gz'
tandoor | Deleting 'mfa/js/webauthn.88878ff60271.js'
tandoor | Deleting 'mfa/js/webauthn.88878ff60271.js.gz'
tandoor | Deleting 'mfa/js/webauthn.js.gz'
tandoor | Deleting 'mfa/js/webauthn-json.js.gz'
tandoor | Deleting 'mfa/js/webauthn-json.js'
tandoor | Deleting 'mfa/js/webauthn.js'
tandoor | Deleting 'themes/tandoor.min.css.gz'
tandoor | Deleting 'themes/tandoor.min.css'
tandoor | Deleting 'themes/tandoor.min.e62f1984b5e4.css'
tandoor | Deleting 'themes/tandoor.min.e62f1984b5e4.css.gz'
tandoor | Deleting 'themes/tandoor_dark.min.3bdb00cbb58c.css.gz'
tandoor | Deleting 'themes/tandoor_dark.min.css'
tandoor | Deleting 'themes/tandoor_dark.min.css.gz'
tandoor | Deleting 'themes/tandoor_dark.min.3bdb00cbb58c.css'
tandoor | Deleting 'custom/css/markdown_blockquote.22de6a06ad0b.css'
tandoor | Deleting 'custom/css/markdown_blockquote.css'
tandoor | Deleting 'custom/css/markdown_blockquote.css.gz'
tandoor | Deleting 'custom/css/markdown_blockquote.22de6a06ad0b.css.gz'
tandoor | Deleting 'webfonts/fa-solid-900.8e4a6dcc692b.eot.gz'
tandoor | Deleting 'webfonts/fa-solid-900.c2801fb415f0.svg'
tandoor | Deleting 'webfonts/fa-brands-400.c5e0f14f88a8.woff'
tandoor | Deleting 'webfonts/fa-regular-400.c4f508e7c4f0.woff'
tandoor | Deleting 'webfonts/poppins_latin_ext_500.d214b888d895.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.ttf'
tandoor | Deleting 'webfonts/fa-solid-900.eot.gz'
tandoor | Deleting 'webfonts/poppins_devanagari_500.fd9b8290076b.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.a9c4bb7348f4.svg'
tandoor | Deleting 'webfonts/poppins_latin_400.9ed361bba848.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.8e4a6dcc692b.eot'
tandoor | Deleting 'webfonts/fa-brands-400.cccc9d29470e.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.0bff33a5fd7e.ttf'
tandoor | Deleting 'webfonts/fa-regular-400.woff'
tandoor | Deleting 'webfonts/fa-regular-400.f5f2566b93e8.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.c1a866ec0e04.eot.gz'
tandoor | Deleting 'webfonts/poppins_devanagari_700.b9f2c13fc361.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.eot'
tandoor | Deleting 'webfonts/fa-brands-400.06147b6cd88c.ttf.gz'
tandoor | Deleting 'webfonts/poppins_devanagari_400.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.svg'
tandoor | Deleting 'webfonts/fa-brands-400.svg.gz'
tandoor | Deleting 'webfonts/fa-regular-400.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.eot'
tandoor | Deleting 'webfonts/poppins_latin_700.woff2'
tandoor | Deleting 'webfonts/poppins_devanagari_700.woff2'
tandoor | Deleting 'webfonts/poppins_devanagari_400.d5e78c53cb07.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.c2801fb415f0.svg.gz'
tandoor | Deleting 'webfonts/fa-solid-900.svg'
tandoor | Deleting 'webfonts/poppins_latin_500.woff2'
tandoor | Deleting 'webfonts/poppins_latin_ext_400.4d1490f32451.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.eot.gz'
tandoor | Deleting 'webfonts/poppins_latin_ext_700.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.7b9568e6389b.svg.gz'
tandoor | Deleting 'webfonts/poppins_latin_400.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.c1a866ec0e04.eot'
tandoor | Deleting 'webfonts/fa-brands-400.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.svg.gz'
tandoor | Deleting 'webfonts/fa-brands-400.a9c4bb7348f4.svg.gz'
tandoor | Deleting 'webfonts/fa-brands-400.5063b105c764.eot.gz'
tandoor | Deleting 'webfonts/fa-regular-400.7b9568e6389b.svg'
tandoor | Deleting 'webfonts/poppins_latin_ext_500.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.woff'
tandoor | Deleting 'webfonts/fa-brands-400.ttf.gz'
tandoor | Deleting 'webfonts/fa-solid-900.44d537ab79f9.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.svg.gz'
tandoor | Deleting 'webfonts/fa-solid-900.eot'
tandoor | Deleting 'webfonts/fa-brands-400.svg'
tandoor | Deleting 'webfonts/poppins_latin_500.84780596e268.woff2'
tandoor | Deleting 'webfonts/fa-brands-400.06147b6cd88c.ttf'
tandoor | Deleting 'webfonts/fa-solid-900.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.333bae208dc3.woff'
tandoor | Deleting 'webfonts/poppins_latin_ext_400.woff2'
tandoor | Deleting 'webfonts/fa-regular-400.65b286af947c.ttf.gz'
tandoor | Deleting 'webfonts/fa-solid-900.ttf.gz'
tandoor | Deleting 'webfonts/fa-brands-400.5063b105c764.eot'
tandoor | Deleting 'webfonts/fa-regular-400.ttf.gz'
tandoor | Deleting 'webfonts/poppins_latin_ext_700.62d7a4c78fc2.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.woff'
tandoor | Deleting 'webfonts/poppins_devanagari_500.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.0bff33a5fd7e.ttf.gz'
tandoor | Deleting 'webfonts/fa-regular-400.eot.gz'
tandoor | Deleting 'webfonts/fa-regular-400.ttf'
tandoor | Deleting 'webfonts/fa-regular-400.65b286af947c.ttf'
tandoor | Deleting 'webfonts/poppins_latin_700.f4f17fd53c7d.woff2'
tandoor | Deleting 'webfonts/fa-solid-900.ttf'
tandoor | 2026/09/22 10:54:37 [crit] 16#16: *9 connect() to unix:/tmp/tandoor.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /accounts/login/ HTTP/1.1", upstream: "http://unix:/tmp/tandoor.sock:/accounts/login/", host: "127.0.0.1:80"
tandoor | 127.0.0.1 - - [22/Sep/2026:10:54:37 +0200] "GET /accounts/login/ HTTP/1.1" 502 150 "-" "Wget" "-"
tandoor |
tandoor | 894 static files copied to '/opt/recipes/staticfiles', 2464 post-processed.
tandoor | Done
tandoor | Starting gunicorn
tandoor | [2026-09-22 10:54:37 +0200] [7] [INFO] Starting gunicorn 26.2.0
tandoor | [2026-09-22 10:54:37 +0200] [7] [INFO] Listening at: unix:/tmp/tandoor.sock (7)
tandoor | [2026-09-22 10:54:37 +0200] [7] [INFO] Using worker: gthread
tandoor | [2026-09-22 10:54:37 +0200] [66] [INFO] Booting worker with pid: 66
tandoor | [2026-09-22 10:54:37 +0200] [67] [INFO] Booting worker with pid: 67
tandoor | [2026-09-22 10:54:38 +0200] [68] [INFO] Booting worker with pid: 68
tandoor | [2026-09-22 10:54:38 +0200] [7] [INFO] Control socket listening at /root/.gunicorn/gunicorn.ctl
tandoor | Running django-vite in production mode (no HMR)
tandoor | Running django-vite in production mode (no HMR)
tandoor | Running django-vite in production mode (no HMR)
tandoor | 127.0.0.1 - - [22/Sep/2026:10:54:45 +0200] "GET /accounts/login/ HTTP/1.1" 200 4981 "-" "Wget" "-"
tandoor | - - [22/Sep/2026:10:54:45 +0200] "GET /accounts/login/ HTTP/1.0" 200 4981 "-" "Wget"
tandoor | ThreadPoolExecutor-0_0 ERROR 2026-09-22 10:54:47,243 django.security.DisallowedHost Invalid HTTP_HOST header: 'tandoor:80'. You may need to add 'tandoor' to ALLOWED_HOSTS.
tandoor | Traceback (most recent call last):
tandoor | File "/opt/recipes/venv/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner
tandoor | response = get_response(request)
tandoor | File "/opt/recipes/venv/lib/python3.13/site-packages/django/utils/deprecation.py", line 119, in __call__
tandoor | response = self.process_request(request)
tandoor | File "/opt/recipes/venv/lib/python3.13/site-packages/django/middleware/common.py", line 48, in process_request
tandoor | host = request.get_host()
tandoor | File "/opt/recipes/venv/lib/python3.13/site-packages/django/http/request.py", line 203, in get_host
tandoor | raise DisallowedHost(msg)
tandoor | django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: 'tandoor:80'. You may need to add 'tandoor' to ALLOWED_HOSTS.
tandoor | - - [22/Sep/2026:10:54:47 +0200] "GET /accounts/login/ HTTP/1.0" 400 143 "-" "Go-http-client/1.1"
tandoor | 172.18.0.2 - - [22/Sep/2026:10:54:47 +0200] "GET /accounts/login/ HTTP/1.1" 400 154 "-" "Go-http-client/1.1" "-"
@@ -0,0 +1,21 @@
{
"before": {
"hu": [],
"en": []
},
"after": {
"hu": [
{
"title": "Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.",
"text": "Frissítés elérhető — ma"
}
],
"en": [
{
"title": "A newer version of this app is available. Select the Update button to start it.",
"text": "Update available — today"
}
]
},
"drill_commit": "654a28192b38"
}
@@ -0,0 +1,25 @@
10:52:42 ==== tandoor: ghcr.io/tandoorrecipes/recipes:2.6.13 -> ghcr.io/tandoorrecipes/recipes:2.6.15 (sub=recipes, class=db)
10:52:42 [1] tandoor already deployed — reusing
10:52:45 [2] seeding through the app's own front door
10:52:55 tandoor: createsuperuser :: Running django-vite in production mode (no HMR) Superuser created successfully.
10:52:59 tandoor: seeded superuser drill1d392f
10:52:59 [3] control C1 — reading the seed back BEFORE the update
10:53:05 tandoor: readback of the seeded account found=True
10:53:05 [4] „Mentés most" -> 200 {'ok': True, 'message': 'Mentés elindítva'}
10:54:00 [4] backup idle; last=None
10:54:01 [5] drill commit 654a28192b38: tandoor ghcr.io/tandoorrecipes/recipes:2.6.13 -> ghcr.io/tandoorrecipes/recipes:2.6.15 (push rc=0)
10:54:06 [5] badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
10:54:06 [5] badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
10:54:06 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
10:54:06 + 0.0s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
10:54:07 + 1.0s phase=pulling label=Új verzió letöltése… err=None hold=None
10:54:08 + 2.1s phase=starting label=Indítás az új verzióval… err=None hold=None
10:54:11 + 5.2s phase=verifying label=Működés ellenőrzése… err=None hold=None
10:54:47 + 41.1s phase=done label=Frissítve err=None hold=None
10:54:47 [7] reading the seed back AFTER the update
10:54:54 tandoor: readback of the seeded account found=True
10:54:56 [8] pinned = {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:16-alpine'}
10:54:56 [8] installed = {'tandoor': 'ghcr.io/tandoorrecipes/recipes:2.6.15', 'tandoor-postgres': 'postgres:16-alpine'}
10:54:56 [8] compose = ['image: ghcr.io/tandoorrecipes/recipes:2.6.15', 'image: postgres:16-alpine']
10:54:56 [8] inspect = ['tandoor ghcr.io/tandoorrecipes/recipes:2.6.15 running=true restarts=0', 'tandoor-postgres postgres:16-alpine running=true restarts=0']
10:54:56 [9] verdict proven -> /mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/update-night-2026-09-21/apps/tandoor/verdict.json
@@ -0,0 +1,19 @@
{
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"catalog_images": null,
"live_compose_image_lines": [
"image: ghcr.io/tandoorrecipes/recipes:2.6.13",
"image: postgres:16-alpine"
],
"docker_inspect": [
"tandoor ghcr.io/tandoorrecipes/recipes:2.6.13 running=true restarts=0",
"tandoor-postgres postgres:16-alpine running=true restarts=0"
]
}
@@ -0,0 +1,43 @@
{
"before": {
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"catalog_images": null,
"live_compose_image_lines": [
"image: ghcr.io/tandoorrecipes/recipes:2.6.13",
"image: postgres:16-alpine"
],
"docker_inspect": [
"tandoor ghcr.io/tandoorrecipes/recipes:2.6.13 running=true restarts=0",
"tandoor-postgres postgres:16-alpine running=true restarts=0"
]
},
"after": {
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"catalog_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"live_compose_image_lines": [
"image: ghcr.io/tandoorrecipes/recipes:2.6.15",
"image: postgres:16-alpine"
],
"docker_inspect": [
"tandoor ghcr.io/tandoorrecipes/recipes:2.6.15 running=true restarts=0",
"tandoor-postgres postgres:16-alpine running=true restarts=0"
]
}
}
@@ -0,0 +1,51 @@
{
"accepted": true,
"http": "202",
"phases": [
{
"t": 0.0,
"phase": "safety-dump",
"label": "Adatbázis pillanatkép…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 1.0,
"phase": "pulling",
"label": "Új verzió letöltése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 2.1,
"phase": "starting",
"label": "Indítás az új verzióval…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 5.2,
"phase": "verifying",
"label": "Működés ellenőrzése…",
"updating": true,
"error": null,
"hold": null
},
{
"t": 41.1,
"phase": "done",
"label": "Frissítve",
"updating": false,
"error": null,
"hold": null
}
],
"duration_s": 41.1,
"final_phase": "done",
"update_error": null,
"hold_reason": null,
"state": "running"
}
@@ -0,0 +1,51 @@
{
"harness_version": 1,
"app": "tandoor",
"venue": "guest 9202 demo-hp-scratch, controller 0.261.0",
"class": "db",
"from": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.13",
"tandoor-postgres": "postgres:16-alpine"
},
"to": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"verdict": "proven",
"seed_read_before": true,
"seed_read_after": true,
"healthy_after": true,
"migration_observed": null,
"abort": "not-attempted",
"abort_detail": null,
"duration_s": 41.1,
"measured_at": "2026-09-22T08:52:42.724401+00:00",
"evidence": "apps/tandoor/",
"notes": [],
"badge_catchup_seconds": 4.5,
"observables_after": {
"pinned_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"installed_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"catalog_images": {
"tandoor": "ghcr.io/tandoorrecipes/recipes:2.6.15",
"tandoor-postgres": "postgres:16-alpine"
},
"live_compose_image_lines": [
"image: ghcr.io/tandoorrecipes/recipes:2.6.15",
"image: postgres:16-alpine"
],
"docker_inspect": [
"tandoor ghcr.io/tandoorrecipes/recipes:2.6.15 running=true restarts=0",
"tandoor-postgres postgres:16-alpine running=true restarts=0"
]
},
"final_phase": "done",
"hold_reason": null,
"update_error": null
}
@@ -0,0 +1,6 @@
origin https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (fetch)
origin https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git (push)
6c690a1 gates: refuse a health probe the app does not answer (R-618)
13: image: ghcr.io/tandoorrecipes/recipes:2.6.13
58: image: postgres:16-alpine