Hoarder is an open-source bookmark and read-it-later tool replacing Raindrop with self-hosted privacy, local AI tagging, and full-page web archiving.
Hoarder is an open-source bookmark and content manager designed to preserve web pages, personal notes, images, and documents on self-hosted infrastructure. Rather than storing pointers to remote sites that can vanish, it captures local copies and analyzes your reading list with on-premises or cloud artificial intelligence. The resulting repository keeps personal browsing history searchable and under your direct administrative control.
Raindrop.io provides a polished bookmarking service, but it operates as closed-source cloud software where your links, annotations, and reading patterns reside on external servers. Capabilities like full-text search across article bodies and permanent webpage caching also require a paid subscription. Hoarder eliminates third-party reliance by storing every bookmark, image, and note on your own server or NAS. Because full-text indexing runs locally through Meilisearch and content preservation uses Monolith to create standalone HTML snapshots, you retain access to your library without subscription paywalls.
Automation control further distinguishes the two. While commercial platforms process data through proprietary cloud pipelines, Hoarder lets you connect local models through Ollama. This generates tags and summaries without sending personal reading history to remote AI providers. In return, Hoarder requires operational effort that Raindrop.io avoids. Instead of registering an account, you must manage a Docker stack comprising the web application, a headless browser for crawling, and a search engine, alongside your own backups and remote networking.
How does Hoarder compare to Raindrop.io? Raindrop.io is a managed cloud service with zero setup, whereas Hoarder is a self-hosted alternative providing complete data ownership, free full-text search, and local AI tagging.
Can Hoarder run without sending data to OpenAI? Yes. You can disable AI entirely or point the service to a local Ollama instance so tagging and summarization occur strictly on your local network.
Does Hoarder support reading articles offline on mobile devices? The mobile apps include dedicated reading views for saved content, but clipping new links still requires connectivity to your self-hosted server.
Hoarder is an ideal fit if you want an automated, private reading archive and can manage a multi-container Docker environment, whereas people wanting zero-maintenance bookmarking will prefer a managed service. Active development through August 2026 and an AGPL-3.0 license make it a dependable foundation for personal data ownership.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Hoarder's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p hoarder && cd hoarder
curl -fsSL https://open-source.store/tools/hoarder/compose.yml -o compose.ymlcat > .env <<EOF
NEXTAUTH_SECRET=$(openssl rand -hex 16)
MEILI_MASTER_KEY=$(openssl rand -hex 16)
NEXTAUTH_URL=http://localhost:3000
DISABLE_SIGNUPS=false
EOFNEXTAUTH_SECRET — Random secret key used to sign session cookies. Generated above; keep it secret.MEILI_MASTER_KEY — Master key for Meilisearch authentication. Generated above; keep it secret.NEXTAUTH_URL — Public URL where Hoarder is reached (e.g. http://<your-server>:3000); set this to your server's public URL.DISABLE_SIGNUPS — Set to true after registering the admin account to disable open user registration.docker compose up -dservices:
web:
image: ghcr.io/karakeep-app/karakeep:0.34.1
restart: unless-stopped
ports:
- "3000:3000"
environment:
MEILI_ADDR: http://meilisearch:7700
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
NEXTAUTH_URL: ${NEXTAUTH_URL}
DISABLE_SIGNUPS: ${DISABLE_SIGNUPS}
BROWSER_WEB_URL: http://chrome:9222
DATA_DIR: /data
volumes:
- data:/data
depends_on:
meilisearch:
condition: service_healthy
chrome:
condition: service_started
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1"]
interval: 5s
timeout: 5s
retries: 20
chrome:
image: ghcr.io/karakeep-app/karakeep-chrome:156.0.8078.47-r1
restart: unless-stopped
init: true
command:
- --disable-gpu
- --disable-dev-shm-usage
- --hide-scrollbars
- --disable-blink-features=AutomationControlled
- --window-size=1440,900
meilisearch:
image: getmeili/meilisearch:v1.41.0
restart: unless-stopped
environment:
MEILI_NO_ANALYTICS: "true"
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
volumes:
- meilisearch:/meili_data
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:7700/health"]
interval: 5s
timeout: 5s
retries: 10
volumes:
meilisearch:
data:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that Hoarder is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 101 s: ghcr.io/karakeep-app/karakeep-chrome:156.0.8078.47-r1, getmeili/meilisearch:v1.41.0, ghcr.io/karakeep-app/karakeep:0.34.1.
Based on the upstream setup. Official compose. Images pinned to concrete tags; Meilisearch master key, NextAuth secret, and signups config moved to .env; healthchecks added.
web-1 | 2026-11-01T01:06:20.680214671Z 2026-11-01T01:06:20.680Z info: <-- GET /api/get_device_details web-1 | 2026-11-01T01:06:20.680256546Z 2026-11-01T01:06:20.680Z info: --> GET /api/get_device_details 404 0ms web-1 | 2026-11-01T01:06:20.680674213Z 2026-11-01T01:06:20.680Z info: <-- GET /api/get_device_details web-1 | 2026-11-01T01:06:20.680715838Z 2026-11-01T01:06:20.680Z info: --> GET /api/get_device_details 404 0ms web-1 | 2026-11-01T01:06:20.701751505Z 2026-11-01T01:06:20.701Z info: <-- GET /api/sso/v2/sso/jwt?error_url=http%3A%2F%2Finteract.sh web-1 | 2026-11-01T01:06:20.701801380Z 2026-11-01T01:06:20.701Z info: --> GET /api/sso/v2/sso/jwt?error_url=http%3A%2F%2Finteract.sh 404 0ms web-1 | 2026-11-01T01:06:20.702240088Z 2026-11-01T01:06:20.702Z info: <-- GET /api/sso/v2/sso/jwt?error_url=http%3A%2F%2Finteract.sh web-1 | 2026-11-01T01:06:20.702278130Z 2026-11-01T01:06:20.702Z info: --> GET /api/sso/v2/sso/jwt?error_url=http%3A%2F%2Finteract.sh 404 0ms web-1 | 2026-11-01T01:06:21.612598630Z 2026-11-01T01:06:21.612Z info: <-- GET /api/sms_check.php?param=1%27+and+updatexml%281%2Cconcat%280x7e%2C%28SELECT+md5%28999999999%29%29%2C0x7e%29%2C1%29--+ web-1 | 2026-11-01T01:06:21.612787880Z 2026-11-01T01:06:21.612Z info: --> GET /api/sms_check.php?param=1%27+and+updatexml%281%2Cconcat%280x7e%2C%28SELECT+md5%28999999999%29%29%2C0x7e%29%2C1%29--+ 404 0ms web-1 | 2026-11-01T01:06:21.630180380Z 2026-11-01T01:06:21.630Z info: <-- GET /api/sms_check.php?param=1%27+and+updatexml%281%2Cconcat%280x7e%2C%28SELECT+md5%28999999999%29%29%2C0x7e%29%2C1%29--+ web-1 | 2026-11-01T01:06:21.630242255Z 2026-11-01T01:06:21.630Z info: --> GET /api/sms_check.php?param=1%27+and+updatexml%281%2Cconcat%280x7e%2C%28SELECT+md5%28999999999%29%29%2C0x7e%29%2C1%29--+ 404 0ms web-1 | 2026-11-01T01:06:21.632191672Z 2026-11-01T01:06:21.632Z info: <-- GET /api/v1/GetSrc web-1 | 2026-11-01T01:06:21.632225922Z 2026-11-01T01:06:21.632Z info: --> GET /api/v1/GetSrc 404 0ms web-1 | 2026-11-01T01:06:21.632593380Z 2026-11-01T01:06:21.632Z info: <-- GET /api/v1/GetSrc web-1 | 2026-11-01T01:06:21.632643130Z 2026-11-01T01:06:21.632Z info: --> GET /api/v1/GetSrc 404 0ms web-1 | 2026-11-01T01:06:21.639649005Z 2026-11-01T01:06:21.639Z info: <-- GET /api/v1/GetDevice web-1 | 2026-11-01T01:06:21.639698380Z 2026-11-01T01:06:21.639Z info: --> GET /api/v1/GetDevice 404 0ms web-1 | 2026-11-01T01:06:21.640162672Z 2026-11-01T01:06:21.640Z info: <-- GET /api/v1/GetDevice web-1 | 2026-11-01T01:06:21.640194630Z 2026-11-01T01:06:21.640Z info: --> GET /api/v1/GetDevice 404 0ms web-1 | 2026-11-01T01:06:21.651010380Z 2026-11-01T01:06:21.650Z info: <-- GET /api/v1/workflows/argo web-1 | 2026-11-01T01:06:21.651079005Z 2026-11-01T01:06:21.651Z info: --> GET /api/v1/workflows/argo 404 1ms web-1 | 2026-11-01T01:06:21.651549547Z 2026-11-01T01:06:21.651Z info: <-- GET /api/v1/workflows/argo web-1 | 2026-11-01T01:06:21.651563213Z 2026-11-01T01:06:21.651Z info: --> GET /api/v1/workflows/argo 404 0ms web-1 | 2026-11-01T01:06:21.679159380Z 2026-11-01T01:06:21.679Z info: <-- GET /api/config web-1 | 2026-11-01T01:06:21.679203463Z 2026-11-01T01:06:21.679Z info: --> GET /api/config 404 0ms web-1 | 2026-11-01T01:06:21.679903922Z 2026-11-01T01:06:21.679Z info: <-- GET /api/config web-1 | 2026-11-01T01:06:21.679906838Z 2026-11-01T01:06:21.679Z info: --> GET /api/config 404 0ms web-1 | 2026-11-01T01:06:21.681899463Z 2026-11-01T01:06:21.681Z info: <-- GET /api/snapshots/:key web-1 | 2026-11-01T01:06:21.681943505Z 2026-11-01T01:06:21.681Z info: --> GET /api/snapshots/:key 404 0ms web-1 | 2026-11-01T01:06:21.682345255Z 2026-11-01T01:06:21.682Z info: <-- GET /api/snapshots/:key web-1 | 2026-11-01T01:06:21.682380297Z 2026-11-01T01:06:21.682Z info: --> GET /api/snapshots/:key 404 0ms web-1 | 2026-11-01T01:06:21.711094713Z 2026-11-01T01:06:21.710Z info: <-- GET /api/users/search_authors web-1 | 2026-11-01T01:06:21.711108547Z 2026-11-01T01:06:21.711Z info: --> GET /api/users/search_authors 404 0ms web-1 | 2026-11-01T01:06:21.711485588Z 2026-11-01T01:06:21.711Z info: <-- GET /api/users/search_authors web-1 | 2026-11-01T01:06:21.711517797Z 2026-11-01T01:06:21.711Z info: --> GET /api/users/search_authors 404 0ms web-1 | 2026-11-01T01:06:21.746682880Z 2026-11-01T01:06:21.746Z info: <-- GET /api/tags web-1 | 2026-11-01T01:06:21.746727880Z 2026-11-01T01:06:21.746Z info: --> GET /api/tags 404 0ms web-1 | 2026-11-01T01:06:21.747160380Z 2026-11-01T01:06:21.747Z info: <-- GET /api/tags web-1 | 2026-11-01T01:06:21.747201797Z 2026-11-01T01:06:21.747Z info: --> GET /api/tags 404 0ms web-1 | 2026-11-01T01:06:22.642046839Z 2026-11-01T01:06:22.641Z info: <-- GET /api/Image/withpath/C:%5CWindows%5Cwin.ini web-1 | 2026-11-01T01:06:22.642110672Z 2026-11-01T01:06:22.642Z info: --> GET /api/Image/withpath/C:%5CWindows%5Cwin.ini 404 0ms web-1 | 2026-11-01T01:06:22.646285047Z 2026-11-01T01:06:22.646Z info: <-- GET /api/Image/withpath/C:%5CWindows%5Cwin.ini web-1 | 2026-11-01T01:06:22.646323631Z 2026-11-01T01:06:22.646Z info: --> GET /api/Image/withpath/C:%5CWindows%5Cwin.ini 404 0ms web-1 | 2026-11-01T01:06:23.688904673Z 2026-11-01T01:06:23.688Z info: <-- GET /api/BetterImageGallery/imagehandler?path=..%2F..%2F..%2FWeb.Config web-1 | 2026-11-01T01:06:23.691018006Z 2026-11-01T01:06:23.688Z info: --> GET /api/BetterImageGallery/imagehandler?path=..%2F..%2F..%2FWeb.Config 404 0ms web-1 | 2026-11-01T01:06:23.691026423Z 2026-11-01T01:06:23.690Z info: <-- GET /api/BetterImageGallery/imagehandler?path=..%2F..%2F..%2FWeb.Config web-1 | 2026-11-01T01:06:23.691027548Z 2026-11-01T01:06:23.690Z info: --> GET /api/BetterImageGallery/imagehandler?path=..%2F..%2F..%2FWeb.Config 404 0ms web-1 | 2026-11-01T01:06:23.892626006Z 2026-11-01T01:06:23.892Z info: <-- HEAD /api/health web-1 | 2026-11-01T01:06:23.892971256Z 2026-11-01T01:06:23.892Z info: --> HEAD /api/health 200 0ms web-1 | 2026-11-01T01:06:24.677013631Z 2026-11-01T01:06:24.676Z info: <-- GET /api/portalTsLogin/utils/getE9DevelopAllNameValue2?fileName=portaldev_%2F..%2Fweaver.properties web-1 | 2026-11-01T01:06:24.677248673Z 2026-11-01T01:06:24.677Z info: --> GET /api/portalTsLogin/utils/getE9DevelopAllNameValue2?fileName=portaldev_%2F..%2Fweaver.properties 404 1ms web-1 | 2026-11-01T01:06:24.688786048Z 2026-11-01T01:06:24.688Z info: <-- GET /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd web-1 | 2026-11-01T01:06:24.688838423Z 2026-11-01T01:06:24.688Z info: --> GET /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd 404 0ms web-1 | 2026-11-01T01:06:24.689298256Z 2026-11-01T01:06:24.689Z info: <-- GET /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd web-1 | 2026-11-01T01:06:24.689345465Z 2026-11-01T01:06:24.689Z info: --> GET /api/console/api_server?sense_version=%40%40SENSE_VERSION&apis=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd 404 0ms web-1 | 2026-11-01T01:06:24.689725631Z 2026-11-01T01:06:24.689Z info: <-- GET /api/portalTsLogin/utils/getE9DevelopAllNameValue2?fileName=portaldev_%2F..%2Fweaver.properties web-1 | 2026-11-01T01:06:24.689766506Z 2026-11-01T01:06:24.689Z info: --> GET /api/portalTsLogin/utils/getE9DevelopAllNameValue2?fileName=portaldev_%2F..%2Fweaver.properties 404 0ms web-1 | 2026-11-01T01:06:24.715428090Z 2026-11-01T01:06:24.715Z info: <-- GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctext%3E web-1 | 2026-11-01T01:06:24.715490631Z 2026-11-01T01:06:24.715Z info: --> GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctext%3E 404 0ms web-1 | 2026-11-01T01:06:24.723700465Z 2026-11-01T01:06:24.723Z info: <-- GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cimage+href%3Dx+onerror%3Dalert%28document.domain%29%3E%3C%2Fimage%3E%3Ctext%3E web-1 | 2026-11-01T01:06:24.723767340Z 2026-11-01T01:06:24.723Z info: --> GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cimage+href%3Dx+onerror%3Dalert%28document.domain%29%3E%3C%2Fimage%3E%3Ctext%3E 404 0ms web-1 | 2026-11-01T01:06:24.724885381Z 2026-11-01T01:06:24.724Z info: <-- GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctext%3E web-1 | 2026-11-01T01:06:24.724937215Z 2026-11-01T01:06:24.724Z info: --> GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Ctext%3E 404 0ms web-1 | 2026-11-01T01:06:24.726660715Z 2026-11-01T01:06:24.726Z info: <-- GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cimage+href%3Dx+onerror%3Dalert%28document.domain%29%3E%3C%2Fimage%3E%3Ctext%3E web-1 | 2026-11-01T01:06:24.726683173Z 2026-11-01T01:06:24.726Z info: --> GET /api/icon/getDynamicIcon?type=8&content=%3C%2Ftext%3E%3Cimage+href%3Dx+onerror%3Dalert%28document.domain%29%3E%3C%2Fimage%3E%3Ctext%3E 404 0ms web-1 | 2026-11-01T01:06:25.651537132Z 2026-11-01T01:06:25.651Z info: <-- GET /api/scim/v2/Users web-1 | 2026-11-01T01:06:25.651590424Z 2026-11-01T01:06:25.651Z info: --> GET /api/scim/v2/Users 404 0ms web-1 | 2026-11-01T01:06:25.703720757Z 2026-11-01T01:06:25.703Z info: <-- GET /api/ping?count=5&host=%3Bcat+%2Fetc%2Fpasswd%3B&port=80&source=1.1.1.1&type=icmp web-1 | 2026-11-01T01:06:25.703789965Z 2026-11-01T01:06:25.703Z info: --> GET /api/ping?count=5&host=%3Bcat+%2Fetc%2Fpasswd%3B&port=80&source=1.1.1.1&type=icmp 404 0ms web-1 | 2026-11-01T01:06:25.709342507Z 2026-11-01T01:06:25.709Z info: <-- GET /api/scim/v2/Users web-1 | 2026-11-01T01:06:25.709411674Z 2026-11-01T01:06:25.709Z info: --> GET /api/scim/v2/Users 404 0ms web-1 | 2026-11-01T01:06:25.747786674Z 2026-11-01T01:06:25.747Z info: <-- GET /api/ping?count=5&host=%3Bcat+%2Fetc%2Fpasswd%3B&port=80&source=1.1.1.1&type=icmp web-1 | 2026-11-01T01:06:25.747852757Z 2026-11-01T01:06:25.747Z info: --> GET /api/ping?count=5&host=%3Bcat+%2Fetc%2Fpasswd%3B&port=80&source=1.1.1.1&type=icmp 404 0ms web-1 | 2026-11-01T01:06:26.643157424Z 2026-11-01T01:06:26.643Z info: <-- GET /api/v1/search?key=%27+and+extractvalue%281%2Cconcat%280x7e%2C%27d560dd6c7086117678ac804ffda32a9b%27%2C0x7e%29%29--+a web-1 | 2026-11-01T01:06:26.643228216Z 2026-11-01T01:06:26.643Z info: --> GET /api/v1/search?key=%27+and+extractvalue%281%2Cconcat%280x7e%2C%27d560dd6c7086117678ac804ffda32a9b%27%2C0x7e%29%29--+a 404 0ms web-1 | 2026-11-01T01:06:26.643667132Z 2026-11-01T01:06:26.643Z info: <-- GET /api/v1/search?key=%27+and+extractvalue%281%2Cconcat%280x7e%2C%27d560dd6c7086117678ac804ffda32a9b%27%2C0x7e%29%29--+a web-1 | 2026-11-01T01:06:26.643711507Z 2026-11-01T01:06:26.643Z info: --> GET /api/v1/search?key=%27+and+extractvalue%281%2Cconcat%280x7e%2C%27d560dd6c7086117678ac804ffda32a9b%27%2C0x7e%29%29--+a 404 0ms web-1 | 2026-11-01T01:06:26.670035257Z 2026-11-01T01:06:26.669Z info: <-- GET /api/agents web-1 | 2026-11-01T01:06:26.670086049Z 2026-11-01T01:06:26.670Z info: --> GET /api/agents 404 1ms web-1 | 2026-11-01T01:06:26.670553591Z 2026-11-01T01:06:26.670Z info: <-- GET /api/agents web-1 | 2026-11-01T01:06:26.670592341Z 2026-11-01T01:06:26.670Z info: --> GET /api/agents 404 0ms web-1 | 2026-11-01T01:06:26.676737257Z 2026-11-01T01:06:26.676Z info: <-- GET /api/auth.json web-1 | 2026-11-01T01:06:26.676788757Z 2026-11-01T01:06:26.676Z info: --> GET /api/auth.json 404 0ms web-1 | 2026-11-01T01:06:26.744261841Z 2026-11-01T01:06:26.744Z info: <-- GET /api/v1/serverinfo web-1 | 2026-11-01T01:06:26.744288757Z 2026-11-01T01:06:26.744Z info: --> GET /api/v1/serverinfo 404 0ms web-1 | 2026-11-01T01:06:26.744728841Z 2026-11-01T01:06:26.744Z info: <-- GET /api/v1/serverinfo web-1 | 2026-11-01T01:06:26.744770341Z 2026-11-01T01:06:26.744Z info: --> GET /api/v1/serverinfo 404 0ms web-1 | 2026-11-01T01:06:27.619075925Z 2026-11-01T01:06:27.618Z info: <-- GET /api/persons/latest?bypass=%2Fapi%2Fpublic web-1 | 2026-11-01T01:06:27.619371175Z 2026-11-01T01:06:27.619Z info: --> GET /api/persons/latest?bypass=%2Fapi%2Fpublic 404 0ms web-1 | 2026-11-01T01:06:27.624491133Z 2026-11-01T01:06:27.624Z info: <-- GET /api/persons/latest?bypass=%2Fapi%2Fpublic web-1 | 2026-11-01T01:06:27.624578008Z 2026-11-01T01:06:27.624Z info: --> GET /api/persons/latest?bypass=%2Fapi%2Fpublic 404 0ms web-1 | 2026-11-01T01:06:27.645172800Z 2026-11-01T01:06:27.645Z info: <-- GET /api/v1/user/save?ID=&Username=ffcid&Role=%E7%AE%A1%E7%90%86%E5%91%98&Enable=true web-1 | 2026-11-01T01:06:27.645208966Z 2026-11-01T01:06:27.645Z info: --> GET /api/v1/user/save?ID=&Username=ffcid&Role=%E7%AE%A1%E7%90%86%E5%91%98&Enable=true 404 0ms web-1 | 2026-11-01T01:06:27.645740341Z 2026-11-01T01:06:27.645Z info: <-- GET /api/v1/user/save?ID=&Username=ffcid&Role=%E7%AE%A1%E7%90%86%E5%91%98&Enable=true web-1 | 2026-11-01T01:06:27.646015591Z 2026-11-01T01:06:27.645Z info: --> GET /api/v1/user/save?ID=&Username=ffcid&Role=%E7%AE%A1%E7%90%86%E5%91%98&Enable=true 404 0ms web-1 | 2026-11-01T01:06:27.662820925Z 2026-11-01T01:06:27.662Z info: <-- GET /api/logout?redirect_to=%0D%0ASet-Cookie%3Acrlfinjection%3D1%3B web-1 | 2026-11-01T01:06:27.662859716Z 2026-11-01T01:06:27.662Z info: --> GET /api/logout?redirect_to=%0D%0ASet-Cookie%3Acrlfinjection%3D1%3B 404 0ms web-1 | 2026-11-01T01:06:27.667800716Z 2026-11-01T01:06:27.667Z info: <-- GET /api/TeacherQuery/SearchTeacherInSiteWithPagerRecords web-1 | 2026-11-01T01:06:27.667808966Z 2026-11-01T01:06:27.667Z info: --> GET /api/TeacherQuery/SearchTeacherInSiteWithPagerRecords 404 0ms web-1 | 2026-11-01T01:06:27.672001341Z 2026-11-01T01:06:27.671Z info: <-- GET /api/TeacherQuery/SearchTeacherInSiteWithPagerRecords web-1 | 2026-11-01T01:06:27.672050216Z 2026-11-01T01:06:27.672Z info: --> GET /api/TeacherQuery/SearchTeacherInSiteWithPagerRecords 404 1ms web-1 | 2026-11-01T01:06:27.715090341Z 2026-11-01T01:06:27.714Z info: <-- GET /api/auth.json web-1 | 2026-11-01T01:06:27.715123341Z 2026-11-01T01:06:27.715Z info: --> GET /api/auth.json 404 0ms web-1 | 2026-11-01T01:06:27.717794050Z 2026-11-01T01:06:27.717Z info: <-- GET /api/fs/read?allowOutsideWorkspace=true&path=%2Fetc%2Fpasswd web-1 | 2026-11-01T01:06:27.717831925Z 2026-11-01T01:06:27.717Z info: --> GET /api/fs/read?allowOutsideWorkspace=true&path=%2Fetc%2Fpasswd 404 0ms web-1 | 2026-11-01T01:06:27.719118466Z 2026-11-01T01:06:27.719Z info: <-- GET /api/fs/read?allowOutsideWorkspace=true&path=%2Fetc%2Fpasswd web-1 | 2026-11-01T01:06:27.719153175Z 2026-11-01T01:06:27.719Z info: --> GET /api/fs/read?allowOutsideWorkspace=true&path=%2Fetc%2Fpasswd 404 0ms web-1 | 2026-11-01T01:06:27.725864300Z 2026-11-01T01:06:27.725Z info: <-- GET /api/logout?redirect_to=%0D%0ASet-Cookie%3Acrlfinjection%3D1%3B web-1 | 2026-11-01T01:06:27.725914425Z 2026-11-01T01:06:27.725Z info: --> GET /api/logout?redirect_to=%0D%0ASet-Cookie%3Acrlfinjection%3D1%3B 404 0ms web-1 | 2026-11-01T01:06:27.740156550Z 2026-11-01T01:06:27.740Z info: <-- GET /api/image/cover-upload?filename=..%2Fappsettings.json web-1 | 2026-11-01T01:06:27.740197966Z 2026-11-01T01:06:27.740Z info: --> GET /api/image/cover-upload?filename=..%2Fappsettings.json 404 0ms web-1 | 2026-11-01T01:06:27.758751800Z 2026-11-01T01:06:27.758Z info: <-- GET /api/image/cover-upload?filename=..%2Fappsettings.json web-1 | 2026-11-01T01:06:27.758782716Z 2026-11-01T01:06:27.758Z info: --> GET /api/image/cover-upload?filename=..%2Fappsettings.json 404 0ms web-1 | 2026-11-01T01:06:28.669171758Z 2026-11-01T01:06:28.669Z info: <-- GET /api/dp/rptsvcsyncpoint?ccid=1 web-1 | 2026-11-01T01:06:28.669236050Z 2026-11-01T01:06:28.669Z info: --> GET /api/dp/rptsvcsyncpoint?ccid=1 404 0ms web-1 | 2026-11-01T01:06:28.669716883Z 2026-11-01T01:06:28.669Z info: <-- GET /api/dp/rptsvcsyncpoint?ccid=1 web-1 | 2026-11-01T01:06:28.669763508Z 2026-11-01T01:06:28.669Z info: --> GET /api/dp/rptsvcsyncpoint?ccid=1 404 0ms web-1 | 2026-11-01T01:06:28.927822634Z 2026-11-01T01:06:28.927Z info: <-- HEAD /api/health web-1 | 2026-11-01T01:06:28.927983675Z 2026-11-01T01:06:28.927Z info: --> HEAD /api/health 200 0ms