app_versions.json 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. {
  2. "1.0.10": {
  3. "healthy": true,
  4. "supported": true,
  5. "healthy_error": null,
  6. "location": "/__w/apps/apps/trains/community/kitchenowl/1.0.10",
  7. "last_update": "2025-09-02 11:33:24",
  8. "required_features": [],
  9. "human_version": "v0.7.3_1.0.10",
  10. "version": "1.0.10",
  11. "app_metadata": {
  12. "app_version": "v0.7.3",
  13. "capabilities": [],
  14. "categories": [
  15. "productivity"
  16. ],
  17. "changelog_url": "https://github.com/TomBursch/kitchenowl/releases",
  18. "date_added": "2025-06-26",
  19. "description": "KitchenOwl is a self-hosted grocery list and recipe manager. The backend is made with Flask and the frontend with Flutter. Easily add items to your shopping list before you go shopping. You can also create recipes and add items based on what you want to cook.",
  20. "home": "https://kitchenowl.org/",
  21. "host_mounts": [],
  22. "icon": "https://media.sys.truenas.net/apps/kitchenowl/icons/icon.png",
  23. "keywords": [
  24. "grocery list",
  25. "recipe manager",
  26. "shopping list"
  27. ],
  28. "lib_version": "2.1.49",
  29. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  30. "maintainers": [
  31. {
  32. "email": "dev@ixsystems.com",
  33. "name": "truenas",
  34. "url": "https://www.truenas.com/"
  35. }
  36. ],
  37. "name": "kitchenowl",
  38. "run_as_context": [
  39. {
  40. "description": "KitchenOwl runs as any non-root user.",
  41. "gid": 568,
  42. "group_name": "kitchenowl",
  43. "uid": 568,
  44. "user_name": "kitchenowl"
  45. },
  46. {
  47. "description": "Postgres runs as non-root user.",
  48. "gid": 999,
  49. "group_name": "postgres",
  50. "uid": 999,
  51. "user_name": "postgres"
  52. }
  53. ],
  54. "screenshots": [],
  55. "sources": [
  56. "https://github.com/TomBursch/kitchenowl",
  57. "https://hub.docker.com/r/tombursch/kitchenowl"
  58. ],
  59. "title": "KitchenOwl",
  60. "train": "community",
  61. "version": "1.0.10"
  62. },
  63. "schema": {
  64. "groups": [
  65. {
  66. "name": "KitchenOwl Configuration",
  67. "description": "Configure KitchenOwl"
  68. },
  69. {
  70. "name": "User and Group Configuration",
  71. "description": "Configure User and Group for KitchenOwl"
  72. },
  73. {
  74. "name": "Network Configuration",
  75. "description": "Configure Network for KitchenOwl"
  76. },
  77. {
  78. "name": "Storage Configuration",
  79. "description": "Configure Storage for KitchenOwl"
  80. },
  81. {
  82. "name": "Labels Configuration",
  83. "description": "Configure Labels for KitchenOwl"
  84. },
  85. {
  86. "name": "Resources Configuration",
  87. "description": "Configure Resources for KitchenOwl"
  88. }
  89. ],
  90. "questions": [
  91. {
  92. "variable": "TZ",
  93. "group": "KitchenOwl Configuration",
  94. "label": "Timezone",
  95. "schema": {
  96. "type": "string",
  97. "default": "Etc/UTC",
  98. "required": true,
  99. "$ref": [
  100. "definitions/timezone"
  101. ]
  102. }
  103. },
  104. {
  105. "variable": "kitchenowl",
  106. "label": "",
  107. "group": "KitchenOwl Configuration",
  108. "schema": {
  109. "type": "dict",
  110. "attrs": [
  111. {
  112. "variable": "postgres_image_selector",
  113. "label": "Postgres Image (CAUTION)",
  114. "description": "If you are changing this after the postgres directory has been initialized,</br>\nSTOP! and make sure you have a backup of your data.</br>\nChanging this will trigger an one way database upgrade.</br>\nYou can only select newer versions of postgres.</br>\nSelecting an older version will refuse to start.</br>\nIf something goes wrong, you will have to restore from backup.\n",
  115. "schema": {
  116. "type": "string",
  117. "default": "postgres_17_image",
  118. "required": true,
  119. "enum": [
  120. {
  121. "value": "postgres_17_image",
  122. "description": "Postgres 17"
  123. }
  124. ]
  125. }
  126. },
  127. {
  128. "variable": "db_password",
  129. "label": "Database Password",
  130. "description": "The password for KitchenOwl.",
  131. "schema": {
  132. "type": "string",
  133. "default": "",
  134. "required": true,
  135. "private": true
  136. }
  137. },
  138. {
  139. "variable": "jwt_secret_key",
  140. "label": "JWT Secret Key",
  141. "schema": {
  142. "type": "string",
  143. "default": "",
  144. "required": true,
  145. "private": true
  146. }
  147. },
  148. {
  149. "variable": "additional_envs",
  150. "label": "Additional Environment Variables",
  151. "schema": {
  152. "type": "list",
  153. "default": [],
  154. "items": [
  155. {
  156. "variable": "env",
  157. "label": "Environment Variable",
  158. "schema": {
  159. "type": "dict",
  160. "attrs": [
  161. {
  162. "variable": "name",
  163. "label": "Name",
  164. "schema": {
  165. "type": "string",
  166. "required": true
  167. }
  168. },
  169. {
  170. "variable": "value",
  171. "label": "Value",
  172. "schema": {
  173. "type": "string"
  174. }
  175. }
  176. ]
  177. }
  178. }
  179. ]
  180. }
  181. }
  182. ]
  183. }
  184. },
  185. {
  186. "variable": "run_as",
  187. "label": "",
  188. "group": "User and Group Configuration",
  189. "schema": {
  190. "type": "dict",
  191. "attrs": [
  192. {
  193. "variable": "user",
  194. "label": "User ID",
  195. "description": "The user id that KitchenOwl files will be owned by.",
  196. "schema": {
  197. "type": "int",
  198. "min": 568,
  199. "default": 568,
  200. "required": true
  201. }
  202. },
  203. {
  204. "variable": "group",
  205. "label": "Group ID",
  206. "description": "The group id that KitchenOwl files will be owned by.",
  207. "schema": {
  208. "type": "int",
  209. "min": 568,
  210. "default": 568,
  211. "required": true
  212. }
  213. }
  214. ]
  215. }
  216. },
  217. {
  218. "variable": "network",
  219. "label": "",
  220. "group": "Network Configuration",
  221. "schema": {
  222. "type": "dict",
  223. "attrs": [
  224. {
  225. "variable": "web_port",
  226. "label": "WebUI Port",
  227. "schema": {
  228. "type": "dict",
  229. "attrs": [
  230. {
  231. "variable": "bind_mode",
  232. "label": "Port Bind Mode",
  233. "description": "The port bind mode.</br>\n- Publish: The port will be published on the host for external access.</br>\n- Expose: The port will be exposed for inter-container communication.</br>\n- None: The port will not be exposed or published.</br>\nNote: If the Dockerfile defines an EXPOSE directive,\nthe port will still be exposed for inter-container communication regardless of this setting.\n",
  234. "schema": {
  235. "type": "string",
  236. "default": "published",
  237. "enum": [
  238. {
  239. "value": "published",
  240. "description": "Publish port on the host for external access"
  241. },
  242. {
  243. "value": "exposed",
  244. "description": "Expose port for inter-container communication"
  245. },
  246. {
  247. "value": "",
  248. "description": "None"
  249. }
  250. ]
  251. }
  252. },
  253. {
  254. "variable": "port_number",
  255. "label": "Port Number",
  256. "schema": {
  257. "type": "int",
  258. "default": 30211,
  259. "show_if": [
  260. [
  261. "bind_mode",
  262. "=",
  263. "published"
  264. ]
  265. ],
  266. "min": 1,
  267. "max": 65535,
  268. "required": true
  269. }
  270. },
  271. {
  272. "variable": "host_ips",
  273. "label": "Host IPs",
  274. "description": "IPs on the host to bind this port",
  275. "schema": {
  276. "type": "list",
  277. "show_if": [
  278. [
  279. "bind_mode",
  280. "=",
  281. "published"
  282. ]
  283. ],
  284. "default": [],
  285. "items": [
  286. {
  287. "variable": "host_ip",
  288. "label": "Host IP",
  289. "schema": {
  290. "type": "string",
  291. "required": true,
  292. "$ref": [
  293. "definitions/node_bind_ip"
  294. ]
  295. }
  296. }
  297. ]
  298. }
  299. }
  300. ]
  301. }
  302. }
  303. ]
  304. }
  305. },
  306. {
  307. "variable": "storage",
  308. "label": "",
  309. "group": "Storage Configuration",
  310. "schema": {
  311. "type": "dict",
  312. "attrs": [
  313. {
  314. "variable": "data",
  315. "label": "Data Storage",
  316. "schema": {
  317. "type": "dict",
  318. "attrs": [
  319. {
  320. "variable": "type",
  321. "label": "Type",
  322. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  323. "schema": {
  324. "type": "string",
  325. "required": true,
  326. "default": "ix_volume",
  327. "enum": [
  328. {
  329. "value": "host_path",
  330. "description": "Host Path (Path that already exists on the system)"
  331. },
  332. {
  333. "value": "ix_volume",
  334. "description": "ixVolume (Dataset created automatically by the system)"
  335. }
  336. ]
  337. }
  338. },
  339. {
  340. "variable": "ix_volume_config",
  341. "label": "ixVolume Configuration",
  342. "description": "The configuration for the ixVolume dataset.",
  343. "schema": {
  344. "type": "dict",
  345. "show_if": [
  346. [
  347. "type",
  348. "=",
  349. "ix_volume"
  350. ]
  351. ],
  352. "$ref": [
  353. "normalize/ix_volume"
  354. ],
  355. "attrs": [
  356. {
  357. "variable": "acl_enable",
  358. "label": "Enable ACL",
  359. "description": "Enable ACL for the storage.",
  360. "schema": {
  361. "type": "boolean",
  362. "default": false
  363. }
  364. },
  365. {
  366. "variable": "dataset_name",
  367. "label": "Dataset Name",
  368. "description": "The name of the dataset to use for storage.",
  369. "schema": {
  370. "type": "string",
  371. "required": true,
  372. "hidden": true,
  373. "default": "data"
  374. }
  375. },
  376. {
  377. "variable": "acl_entries",
  378. "label": "ACL Configuration",
  379. "schema": {
  380. "type": "dict",
  381. "show_if": [
  382. [
  383. "acl_enable",
  384. "=",
  385. true
  386. ]
  387. ],
  388. "attrs": []
  389. }
  390. }
  391. ]
  392. }
  393. },
  394. {
  395. "variable": "host_path_config",
  396. "label": "Host Path Configuration",
  397. "schema": {
  398. "type": "dict",
  399. "show_if": [
  400. [
  401. "type",
  402. "=",
  403. "host_path"
  404. ]
  405. ],
  406. "attrs": [
  407. {
  408. "variable": "acl_enable",
  409. "label": "Enable ACL",
  410. "description": "Enable ACL for the storage.",
  411. "schema": {
  412. "type": "boolean",
  413. "default": false
  414. }
  415. },
  416. {
  417. "variable": "acl",
  418. "label": "ACL Configuration",
  419. "schema": {
  420. "type": "dict",
  421. "show_if": [
  422. [
  423. "acl_enable",
  424. "=",
  425. true
  426. ]
  427. ],
  428. "attrs": [],
  429. "$ref": [
  430. "normalize/acl"
  431. ]
  432. }
  433. },
  434. {
  435. "variable": "path",
  436. "label": "Host Path",
  437. "description": "The host path to use for storage.",
  438. "schema": {
  439. "type": "hostpath",
  440. "show_if": [
  441. [
  442. "acl_enable",
  443. "=",
  444. false
  445. ]
  446. ],
  447. "required": true
  448. }
  449. }
  450. ]
  451. }
  452. }
  453. ]
  454. }
  455. },
  456. {
  457. "variable": "postgres_data",
  458. "label": "Postgres Data Storage",
  459. "description": "The path to store Postgres Data.",
  460. "schema": {
  461. "type": "dict",
  462. "attrs": [
  463. {
  464. "variable": "type",
  465. "label": "Type",
  466. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.\n",
  467. "schema": {
  468. "type": "string",
  469. "required": true,
  470. "default": "ix_volume",
  471. "enum": [
  472. {
  473. "value": "host_path",
  474. "description": "Host Path (Path that already exists on the system)"
  475. },
  476. {
  477. "value": "ix_volume",
  478. "description": "ixVolume (Dataset created automatically by the system)"
  479. }
  480. ]
  481. }
  482. },
  483. {
  484. "variable": "ix_volume_config",
  485. "label": "ixVolume Configuration",
  486. "description": "The configuration for the ixVolume dataset.",
  487. "schema": {
  488. "type": "dict",
  489. "show_if": [
  490. [
  491. "type",
  492. "=",
  493. "ix_volume"
  494. ]
  495. ],
  496. "$ref": [
  497. "normalize/ix_volume"
  498. ],
  499. "attrs": [
  500. {
  501. "variable": "acl_enable",
  502. "label": "Enable ACL",
  503. "description": "Enable ACL for the storage.",
  504. "schema": {
  505. "type": "boolean",
  506. "default": false
  507. }
  508. },
  509. {
  510. "variable": "dataset_name",
  511. "label": "Dataset Name",
  512. "description": "The name of the dataset to use for storage.",
  513. "schema": {
  514. "type": "string",
  515. "required": true,
  516. "hidden": true,
  517. "default": "pg_data"
  518. }
  519. },
  520. {
  521. "variable": "acl_entries",
  522. "label": "ACL Configuration",
  523. "schema": {
  524. "type": "dict",
  525. "show_if": [
  526. [
  527. "acl_enable",
  528. "=",
  529. true
  530. ]
  531. ],
  532. "attrs": []
  533. }
  534. }
  535. ]
  536. }
  537. },
  538. {
  539. "variable": "host_path_config",
  540. "label": "Host Path Configuration",
  541. "schema": {
  542. "type": "dict",
  543. "show_if": [
  544. [
  545. "type",
  546. "=",
  547. "host_path"
  548. ]
  549. ],
  550. "attrs": [
  551. {
  552. "variable": "acl_enable",
  553. "label": "Enable ACL",
  554. "description": "Enable ACL for the storage.",
  555. "schema": {
  556. "type": "boolean",
  557. "default": false
  558. }
  559. },
  560. {
  561. "variable": "acl",
  562. "label": "ACL Configuration",
  563. "schema": {
  564. "type": "dict",
  565. "show_if": [
  566. [
  567. "acl_enable",
  568. "=",
  569. true
  570. ]
  571. ],
  572. "attrs": [],
  573. "$ref": [
  574. "normalize/acl"
  575. ]
  576. }
  577. },
  578. {
  579. "variable": "path",
  580. "label": "Host Path",
  581. "description": "The host path to use for storage.",
  582. "schema": {
  583. "type": "hostpath",
  584. "show_if": [
  585. [
  586. "acl_enable",
  587. "=",
  588. false
  589. ]
  590. ],
  591. "required": true
  592. }
  593. },
  594. {
  595. "variable": "auto_permissions",
  596. "label": "Automatic Permissions",
  597. "description": "Automatically set permissions for the host path.\nEnabling this, will check the top level directory,</br>\nIf it finds incorrect permissions, it will `chown` the\nhost path to the user and group required for the\npostgres container.\n",
  598. "schema": {
  599. "type": "boolean",
  600. "default": false,
  601. "show_if": [
  602. [
  603. "acl_enable",
  604. "=",
  605. false
  606. ]
  607. ]
  608. }
  609. }
  610. ]
  611. }
  612. }
  613. ]
  614. }
  615. },
  616. {
  617. "variable": "additional_storage",
  618. "label": "Additional Storage",
  619. "schema": {
  620. "type": "list",
  621. "default": [],
  622. "items": [
  623. {
  624. "variable": "storageEntry",
  625. "label": "Storage Entry",
  626. "schema": {
  627. "type": "dict",
  628. "attrs": [
  629. {
  630. "variable": "type",
  631. "label": "Type",
  632. "description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.</br>\nSMB Share: Is a SMB share that is mounted to as a volume.\n",
  633. "schema": {
  634. "type": "string",
  635. "required": true,
  636. "default": "ix_volume",
  637. "enum": [
  638. {
  639. "value": "host_path",
  640. "description": "Host Path (Path that already exists on the system)"
  641. },
  642. {
  643. "value": "ix_volume",
  644. "description": "ixVolume (Dataset created automatically by the system)"
  645. },
  646. {
  647. "value": "cifs",
  648. "description": "SMB/CIFS Share (Mounts a volume to a SMB share)"
  649. }
  650. ]
  651. }
  652. },
  653. {
  654. "variable": "read_only",
  655. "label": "Read Only",
  656. "description": "Mount the volume as read only.",
  657. "schema": {
  658. "type": "boolean",
  659. "default": false
  660. }
  661. },
  662. {
  663. "variable": "mount_path",
  664. "label": "Mount Path",
  665. "description": "The path inside the container to mount the storage.",
  666. "schema": {
  667. "type": "path",
  668. "required": true
  669. }
  670. },
  671. {
  672. "variable": "host_path_config",
  673. "label": "Host Path Configuration",
  674. "schema": {
  675. "type": "dict",
  676. "show_if": [
  677. [
  678. "type",
  679. "=",
  680. "host_path"
  681. ]
  682. ],
  683. "attrs": [
  684. {
  685. "variable": "acl_enable",
  686. "label": "Enable ACL",
  687. "description": "Enable ACL for the storage.",
  688. "schema": {
  689. "type": "boolean",
  690. "default": false
  691. }
  692. },
  693. {
  694. "variable": "acl",
  695. "label": "ACL Configuration",
  696. "schema": {
  697. "type": "dict",
  698. "show_if": [
  699. [
  700. "acl_enable",
  701. "=",
  702. true
  703. ]
  704. ],
  705. "attrs": [],
  706. "$ref": [
  707. "normalize/acl"
  708. ]
  709. }
  710. },
  711. {
  712. "variable": "path",
  713. "label": "Host Path",
  714. "description": "The host path to use for storage.",
  715. "schema": {
  716. "type": "hostpath",
  717. "show_if": [
  718. [
  719. "acl_enable",
  720. "=",
  721. false
  722. ]
  723. ],
  724. "required": true
  725. }
  726. }
  727. ]
  728. }
  729. },
  730. {
  731. "variable": "ix_volume_config",
  732. "label": "ixVolume Configuration",
  733. "description": "The configuration for the ixVolume dataset.",
  734. "schema": {
  735. "type": "dict",
  736. "show_if": [
  737. [
  738. "type",
  739. "=",
  740. "ix_volume"
  741. ]
  742. ],
  743. "$ref": [
  744. "normalize/ix_volume"
  745. ],
  746. "attrs": [
  747. {
  748. "variable": "acl_enable",
  749. "label": "Enable ACL",
  750. "description": "Enable ACL for the storage.",
  751. "schema": {
  752. "type": "boolean",
  753. "default": false
  754. }
  755. },
  756. {
  757. "variable": "dataset_name",
  758. "label": "Dataset Name",
  759. "description": "The name of the dataset to use for storage.",
  760. "schema": {
  761. "type": "string",
  762. "required": true,
  763. "default": "storage_entry"
  764. }
  765. },
  766. {
  767. "variable": "acl_entries",
  768. "label": "ACL Configuration",
  769. "schema": {
  770. "type": "dict",
  771. "show_if": [
  772. [
  773. "acl_enable",
  774. "=",
  775. true
  776. ]
  777. ],
  778. "attrs": [],
  779. "$ref": [
  780. "normalize/acl"
  781. ]
  782. }
  783. }
  784. ]
  785. }
  786. },
  787. {
  788. "variable": "cifs_config",
  789. "label": "SMB Configuration",
  790. "description": "The configuration for the SMB dataset.",
  791. "schema": {
  792. "type": "dict",
  793. "show_if": [
  794. [
  795. "type",
  796. "=",
  797. "cifs"
  798. ]
  799. ],
  800. "attrs": [
  801. {
  802. "variable": "server",
  803. "label": "Server",
  804. "description": "The server to mount the SMB share.",
  805. "schema": {
  806. "type": "string",
  807. "required": true
  808. }
  809. },
  810. {
  811. "variable": "path",
  812. "label": "Path",
  813. "description": "The path to mount the SMB share.",
  814. "schema": {
  815. "type": "string",
  816. "required": true
  817. }
  818. },
  819. {
  820. "variable": "username",
  821. "label": "Username",
  822. "description": "The username to use for the SMB share.",
  823. "schema": {
  824. "type": "string",
  825. "required": true
  826. }
  827. },
  828. {
  829. "variable": "password",
  830. "label": "Password",
  831. "description": "The password to use for the SMB share.",
  832. "schema": {
  833. "type": "string",
  834. "required": true,
  835. "private": true
  836. }
  837. },
  838. {
  839. "variable": "domain",
  840. "label": "Domain",
  841. "description": "The domain to use for the SMB share.",
  842. "schema": {
  843. "type": "string"
  844. }
  845. }
  846. ]
  847. }
  848. }
  849. ]
  850. }
  851. }
  852. ]
  853. }
  854. }
  855. ]
  856. }
  857. },
  858. {
  859. "variable": "labels",
  860. "label": "",
  861. "group": "Labels Configuration",
  862. "schema": {
  863. "type": "list",
  864. "default": [],
  865. "items": [
  866. {
  867. "variable": "label",
  868. "label": "Label",
  869. "schema": {
  870. "type": "dict",
  871. "attrs": [
  872. {
  873. "variable": "key",
  874. "label": "Key",
  875. "schema": {
  876. "type": "string",
  877. "required": true
  878. }
  879. },
  880. {
  881. "variable": "value",
  882. "label": "Value",
  883. "schema": {
  884. "type": "string",
  885. "required": true
  886. }
  887. },
  888. {
  889. "variable": "containers",
  890. "label": "Containers",
  891. "description": "Containers where the label should be applied",
  892. "schema": {
  893. "type": "list",
  894. "items": [
  895. {
  896. "variable": "container",
  897. "label": "Container",
  898. "schema": {
  899. "type": "string",
  900. "required": true,
  901. "enum": [
  902. {
  903. "value": "kitchenowl",
  904. "description": "kitchenowl"
  905. },
  906. {
  907. "value": "postgres",
  908. "description": "postgres"
  909. }
  910. ]
  911. }
  912. }
  913. ]
  914. }
  915. }
  916. ]
  917. }
  918. }
  919. ]
  920. }
  921. },
  922. {
  923. "variable": "resources",
  924. "label": "",
  925. "group": "Resources Configuration",
  926. "schema": {
  927. "type": "dict",
  928. "attrs": [
  929. {
  930. "variable": "limits",
  931. "label": "Limits",
  932. "schema": {
  933. "type": "dict",
  934. "attrs": [
  935. {
  936. "variable": "cpus",
  937. "label": "CPUs",
  938. "description": "CPUs limit for KitchenOwl.",
  939. "schema": {
  940. "type": "int",
  941. "default": 2,
  942. "required": true
  943. }
  944. },
  945. {
  946. "variable": "memory",
  947. "label": "Memory (in MB)",
  948. "description": "Memory limit for KitchenOwl.",
  949. "schema": {
  950. "type": "int",
  951. "default": 4096,
  952. "required": true
  953. }
  954. }
  955. ]
  956. }
  957. }
  958. ]
  959. }
  960. }
  961. ]
  962. },
  963. "readme": "<h1>KitchenOwl</h1> <p><a href=\"https://kitchenowl.org/\">KitchenOwl</a> is a self-hosted grocery list and recipe manager. The backend is made with Flask and the frontend with Flutter. Easily add items to your shopping list before you go shopping. You can also create recipes and add items based on what you want to cook.</p>",
  964. "changelog": null,
  965. "chart_metadata": {
  966. "app_version": "v0.7.3",
  967. "capabilities": [],
  968. "categories": [
  969. "productivity"
  970. ],
  971. "changelog_url": "https://github.com/TomBursch/kitchenowl/releases",
  972. "date_added": "2025-06-26",
  973. "description": "KitchenOwl is a self-hosted grocery list and recipe manager. The backend is made with Flask and the frontend with Flutter. Easily add items to your shopping list before you go shopping. You can also create recipes and add items based on what you want to cook.",
  974. "home": "https://kitchenowl.org/",
  975. "host_mounts": [],
  976. "icon": "https://media.sys.truenas.net/apps/kitchenowl/icons/icon.png",
  977. "keywords": [
  978. "grocery list",
  979. "recipe manager",
  980. "shopping list"
  981. ],
  982. "lib_version": "2.1.49",
  983. "lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
  984. "maintainers": [
  985. {
  986. "email": "dev@ixsystems.com",
  987. "name": "truenas",
  988. "url": "https://www.truenas.com/"
  989. }
  990. ],
  991. "name": "kitchenowl",
  992. "run_as_context": [
  993. {
  994. "description": "KitchenOwl runs as any non-root user.",
  995. "gid": 568,
  996. "group_name": "kitchenowl",
  997. "uid": 568,
  998. "user_name": "kitchenowl"
  999. },
  1000. {
  1001. "description": "Postgres runs as non-root user.",
  1002. "gid": 999,
  1003. "group_name": "postgres",
  1004. "uid": 999,
  1005. "user_name": "postgres"
  1006. }
  1007. ],
  1008. "screenshots": [],
  1009. "sources": [
  1010. "https://github.com/TomBursch/kitchenowl",
  1011. "https://hub.docker.com/r/tombursch/kitchenowl"
  1012. ],
  1013. "title": "KitchenOwl",
  1014. "train": "community",
  1015. "version": "1.0.10"
  1016. }
  1017. }
  1018. }