Files
app-catalog-felhom.eu/templates/karakeep/.felhom.yml
T
admin 882ac14309
gates / gates (push) Successful in 2s
Karakeep: the second new app through the checklist — template, record, fixture, first ladder step 0.33.1 -> 0.33.2
Bookmarks/articles/notes with a crawler (karakeep-chrome) and search (meilisearch v1.41.0). AI off unless the household
enters a key; setup gate + sign-up closed twice; Chrome healthcheck over bash /dev/tcp; smtp_mapping (plaintext), mail-off
boot measured; web memory 768M -> 1536M on measurements (bench watch, box crawl burst). onboarding/karakeep.md complete.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-01 18:01:07 +02:00

136 lines
6.9 KiB
YAML

# =============================================================================
# .felhom.yml - App metadata for felhom-controller
# =============================================================================
# Karakeep (formerly Hoarder) — ghcr.io/karakeep-app/karakeep. Onboarding record: onboarding/karakeep.md.
# First admin: CLASS 4 — the first account that signs up becomes the admin. So: the setup gate (decision 46) keeps a
# fresh install closed to everyone but the household until it says „Kész, beállítottam"; then the box closes sign-up
# twice (decision 47): the app's own switch (after_setup → DISABLE_SIGNUPS, which would refuse the FIRST account too, so
# never at install) and a block of the sign-up routes.
# --- Display info (shown on dashboard) ---
display_name: "Karakeep"
description: "Könyvjelzők, cikkek, jegyzetek és képek egy helyen, kereshetően"
category: "productivity"
subdomain: "bookmarks"
slug: "karakeep"
# catalog_since: the date THIS repo last changed this app's pinned images. Any commit that
# changes an image: line must set this to the same day (see CLAUDE.md).
catalog_since: "2026-10-01"
# --- Resource hints (displayed on deploy screen) ---
resources:
mem_request: "700M"
mem_limit: "2816M" # karakeep 1536M + karakeep-chrome 768M + karakeep-meilisearch 512M = 2816M
pi_compatible: false
needs_hdd: false
# --- Deploy wizard fields ---
deploy_fields:
- env_var: DOMAIN
label: "Domain"
type: domain
description: "A szerver domain neve"
locked_after_deploy: true
- env_var: SUBDOMAIN
label: "Aldomain"
type: subdomain
default: "bookmarks"
required: true
locked_after_deploy: true
description: "Az alkalmazás aldomainje"
- env_var: NEXTAUTH_SECRET
label: "Munkamenet-kulcs"
type: secret
generate: "hex:32"
locked_after_deploy: true
- env_var: MEILI_MASTER_KEY
label: "Keresőindex-kulcs"
type: secret
generate: "hex:32"
locked_after_deploy: true
- env_var: OPENAI_API_KEY
label: "OpenAI API-kulcs (nem kötelező)"
type: secret_input
required: false
description: "Üresen hagyva az automatikus AI-címkézés ki van kapcsolva, és semmi nem megy ki a szerveredről. Ha megadod, minden új könyvjelző szövege az OpenAI-hoz kerül címkézésre."
setup_gate: true
signup_block: "PathRegexp(`(?i)^/+(signup|api/trpc/[^?]*users\\.create)`)"
after_setup:
env:
SIGNUP_CLOSED: "true"
# --- App-email (password reset) through the box's mail relay; plaintext :2526 (see the compose comment) ---
smtp_mapping:
tls_mode: plaintext
host_var: SMTP_HOST
port_var: SMTP_PORT
from_var: SMTP_FROM
from_local: karakeep
# --- Customer-facing info ---
app_info:
tagline: "Könyvjelzők, cikkek és jegyzetek mentése - kereshető saját archívum"
add_people: "A családtagodat te hozod létre: Beállítások, Admin, Felhasználók, Új felhasználó."
docs_url: "https://docs.karakeep.app/"
use_cases:
- 'Weboldalak mentése: a Karakeep letölti és elteszi a tartalmukat, akkor is, ha az oldal később eltűnik'
- 'Jegyzetek, képek és PDF-ek egy helyen, teljes szöveges kereséssel'
- 'Böngészőbővítmény és telefonos alkalmazás a gyors mentéshez'
- 'AI-címkézés csak akkor, ha te megadsz hozzá egy OpenAI-kulcsot - alapból ki van kapcsolva'
first_steps:
- 'Nyisd meg a bookmarks.DOMAIN címet, és hozd létre a fiókodat (az első fiók lesz az admin)'
- 'Kattints a „Kész, beállítottam" gombra az alkalmazás oldalán - ezután más már nem regisztrálhat'
- 'Telepítsd a böngészőbővítményt vagy a telefonos alkalmazást, és add meg: https://bookmarks.DOMAIN és egy API-kulcsot (Beállítások, API-kulcsok)'
- 'Mentsd el az első könyvjelződet'
# --- Controller health probe (dials what the compose healthcheck dials) ---
healthcheck:
checks:
- type: api
port: 3000
path: "/api/health"
expect:
status: 200
i18n:
en:
description: 'Bookmarks, articles, notes and images in one place, searchable'
app_info:
tagline: 'Save bookmarks, articles and notes - your own searchable archive'
add_people: "You create your family member's account: Settings, Admin, Users, New user."
use_cases:
- 'Save web pages: Karakeep downloads and keeps their content, even if the page disappears later'
- 'Notes, images and PDFs in one place, with full-text search'
- 'A browser extension and a phone app for quick saving'
- 'AI tagging only if you give it an OpenAI key - off by default'
first_steps:
- 'Open bookmarks.DOMAIN and create your account (the first account becomes the admin)'
- 'Press "Done, I set it up" on the app page - after that nobody else can sign up'
- 'Install the browser extension or the phone app and enter: https://bookmarks.DOMAIN and an API key (Settings, API keys)'
- 'Save your first bookmark'
deploy_fields:
- env_var: DOMAIN
label: 'Domain'
description: 'The server domain name'
- env_var: SUBDOMAIN
label: 'Subdomain'
description: 'The subdomain this app answers on'
- env_var: NEXTAUTH_SECRET
label: 'Session key'
- env_var: MEILI_MASTER_KEY
label: 'Search index key'
- env_var: OPENAI_API_KEY
label: 'OpenAI API key (optional)'
description: 'Left empty, automatic AI tagging is off and nothing leaves your server. If you enter one, the text of every new bookmark goes to OpenAI for tagging.'
# update_ladder — the test record: one tested step per line, oldest first (JSON flow mappings,
# `09-update-architecture.md` §6.4 part 4). WRITTEN BY scripts/upgrade-test.py, never by hand;
# gated by scripts/check-test-record.py. An image: move without a proven entry here is refused.
update_ladder:
- {"from": {"karakeep": "ghcr.io/karakeep-app/karakeep:0.33.1", "karakeep-chrome": "ghcr.io/karakeep-app/karakeep-chrome:151.0.7922.47-r1", "karakeep-meilisearch": "getmeili/meilisearch:v1.41.0"}, "to": {"karakeep": "ghcr.io/karakeep-app/karakeep:0.33.2", "karakeep-chrome": "ghcr.io/karakeep-app/karakeep-chrome:151.0.7922.47-r1", "karakeep-meilisearch": "getmeili/meilisearch:v1.41.0"}, "digest": {"karakeep": "sha256:b069e4307dec06ea06d16989c6861c30a1ff208568be44ed5fb5d422cd3e950c", "karakeep-chrome": "sha256:5b19bbb160e9ff60681a3abd97e1c4ec9f64212301410de658c3900ab7ef31e7", "karakeep-meilisearch": "sha256:860fa4baed04ae1c235de870edab0c8006227546dea1bbb6411fbfc5e27cf1db"}, "verdict": "proven", "tested_at": "2026-10-01T15:36:10Z", "harness_version": 4, "evidence": "felhom.eu/documentation/audits/new-apps-2026-10-01/bench/karakeep/evidence/MV-karakeep/verdict.json", "box_evidence": "felhom.eu/documentation/audits/new-apps-2026-10-01/box/karakeep/step.txt", "memory_peak_pct": 51.4, "marks": {"files_may_change": false, "needs_person": null, "memory_tight": false}, "memory_basis": "anon", "memory_cgroup_peak_pct": 55.4}