From f86de73b1509821b6a04488047b900e03db627db Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 13 Nov 2025 01:04:55 +0100 Subject: [PATCH] removed app karakeep (is already in runtipi demo under old name "hoarder") --- apps/karakeep/config.json | 20 ------ apps/karakeep/docker-compose.json | 77 --------------------- apps/karakeep/metadata/description.md | 95 -------------------------- apps/karakeep/metadata/favicon.ico | Bin 15086 -> 0 bytes apps/karakeep/metadata/logo-0.jpg | Bin 162 -> 0 bytes apps/karakeep/metadata/logo-1.jpg | Bin 165 -> 0 bytes apps/karakeep/metadata/logo-2.jpg | Bin 170 -> 0 bytes apps/karakeep/metadata/logo.jpg | Bin 6999 -> 0 bytes 8 files changed, 192 deletions(-) delete mode 100644 apps/karakeep/config.json delete mode 100644 apps/karakeep/docker-compose.json delete mode 100644 apps/karakeep/metadata/description.md delete mode 100644 apps/karakeep/metadata/favicon.ico delete mode 100644 apps/karakeep/metadata/logo-0.jpg delete mode 100644 apps/karakeep/metadata/logo-1.jpg delete mode 100644 apps/karakeep/metadata/logo-2.jpg delete mode 100644 apps/karakeep/metadata/logo.jpg diff --git a/apps/karakeep/config.json b/apps/karakeep/config.json deleted file mode 100644 index 415cf88..0000000 --- a/apps/karakeep/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "karakeep", - "available": true, - "port": 8646, - "exposable": true, - "dynamic_config": true, - "id": "karakeep", - "description": "A self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search", - "tipi_version": 1, - "version": "0.28.0", - "categories": ["utilities"], - "short_desc": "self-hosted bookmark manager", - "author": "karakeep", - "source": "https://github.com/karakeep-app/karakeep", - "website": "https://karakeep.app/", - "form_fields": [], - "supported_architectures": ["arm64", "amd64"], - "created_at": 1762991164223, - "updated_at": 1762991164223 -} diff --git a/apps/karakeep/docker-compose.json b/apps/karakeep/docker-compose.json deleted file mode 100644 index 9f574ae..0000000 --- a/apps/karakeep/docker-compose.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "schemaVersion": 2, - "services": [ - { - "name": "web", - "image": "ghcr.io/karakeep-app/karakeep:0.28.0", - "isMain": true, - "environment": [ - { - "key": "MEILI_ADDR", - "value": "http://meilisearch:7700" - }, - { - "key": "BROWSER_WEB_URL", - "value": "http://chrome:9222" - }, - { - "key": "MEILI_MASTER_KEY", - "value": "TRpPzgxyO9pw4P/ewzYs5zRh1W4VKmGGPjZYGWnpdtmhqyNP" - }, - { - "key": "NEXTAUTH_SECRET", - "value": "yPvAlLXC1rbjJp+TbdCOM/NX9SFC8Tdg1r70bKPDRXeTsgcP" - }, - { - "key": "DATA_DIR", - "value": "/data" - } - ], - "internalPort": 3000, - "volumes": [ - { - "hostPath": "${APP_DATA_DIR}/data/data", - "containerPath": "/data", - "readOnly": false, - "shared": false, - "private": false - } - ] - }, - { - "name": "chrome", - "image": "gcr.io/zenika-hub/alpine-chrome:124", - "command": [ - "--no-sandbox", - "--disable-gpu", - "--disable-dev-shm-usage", - "--remote-debugging-address=0.0.0.0", - "--remote-debugging-port=9222", - "--hide-scrollbars" - ] - }, - { - "name": "meilisearch", - "image": "getmeili/meilisearch:v1.13.3", - "environment": [ - { - "key": "MEILI_NO_ANALYTICS", - "value": "true" - }, - { - "key": "MEILI_MASTER_KEY", - "value": "TRpPzgxyO9pw4P/ewzYs5zRh1W4VKmGGPjZYGWnpdtmhqyNP" - } - ], - "volumes": [ - { - "hostPath": "${APP_DATA_DIR}/data/meili_data", - "containerPath": "/meili_data", - "readOnly": false, - "shared": false, - "private": false - } - ] - } - ] -} diff --git a/apps/karakeep/metadata/description.md b/apps/karakeep/metadata/description.md deleted file mode 100644 index 5f51ad9..0000000 --- a/apps/karakeep/metadata/description.md +++ /dev/null @@ -1,95 +0,0 @@ -Karakeep (previously Hoarder) is a self-hostable bookmark-everything app with a touch of AI for the data hoarders out there. - -![homepage screenshot](https://github.com/karakeep-app/karakeep/blob/main/screenshots/homepage.png?raw=true) - -## Features - -- 🔗 Bookmark links, take simple notes and store images and pdfs. -- ⬇️ Automatic fetching for link titles, descriptions and images. -- 📋 Sort your bookmarks into lists. -- 🔎 Full text search of all the content stored. -- ✨ AI-based (aka chatgpt) automatic tagging and summarization. With supports for local models using ollama! -- 🤖 Rule-based engine for customized management. -- 🎆 OCR for extracting text from images. -- 🔖 [Chrome plugin](https://chromewebstore.google.com/detail/karakeep/kgcjekpmcjjogibpjebkhaanilehneje) and [Firefox addon](https://addons.mozilla.org/en-US/firefox/addon/karakeep/) for quick bookmarking. -- 📱 An [iOS app](https://apps.apple.com/us/app/karakeep-app/id6479258022), and an [Android app](https://play.google.com/store/apps/details?id=app.hoarder.hoardermobile&pcampaignid=web_share). -- 📰 Auto hoarding from RSS feeds. -- 🔌 REST API and multiple clients. -- 🌐 Multi-language support. -- 🖍️ Mark and store highlights from your hoarded content. -- 🗄️ Full page archival (using [monolith](https://github.com/Y2Z/monolith)) to protect against link rot. -- ▶️ Auto video archiving using [yt-dlp](https://github.com/yt-dlp/yt-dlp). -- ☑️ Bulk actions support. -- 🔐 SSO support. -- 🌙 Dark mode support. -- 💾 Self-hosting first. -- ⬇️ Bookmark importers from Chrome, Pocket, Linkwarden, Omnivore, Tab Session Manager. -- 🔄 Automatic sync with browser bookmarks via [floccus](https://floccus.org/). -- [Planned] Offline reading on mobile, semantic search across bookmarks, ... - -**⚠️ This app is under heavy development.** - -## Documentation - -- [Installation](https://docs.karakeep.app/Installation/docker) -- [Configuration](https://docs.karakeep.app/configuration) -- [Screenshots](https://docs.karakeep.app/screenshots) -- [Security Considerations](https://docs.karakeep.app/security-considerations) -- [Development](https://docs.karakeep.app/Development/setup) - -## Demo - -You can access the demo at [https://try.karakeep.app](https://try.karakeep.app). Login with the following creds: - -``` -email: demo@karakeep.app -password: demodemo -``` - -The demo is seeded with some content, but it's in read-only mode to prevent abuse. - -## About the name - -The name Karakeep is inspired by the Arabic word "كراكيب" (karakeeb), a colloquial term commonly used to refer to miscellaneous clutter, odds and ends, or items that may seem disorganized but often hold personal value or hidden usefulness. It evokes the image of a messy drawer or forgotten box, full of stuff you can't quite throw away—because somehow, it matters (or more likely, because you're a hoarder!). - -## Stack - -- [NextJS](https://nextjs.org/) for the web app. Using app router. -- [Drizzle](https://orm.drizzle.team/) for the database and its migrations. -- [NextAuth](https://next-auth.js.org) for authentication. -- [tRPC](https://trpc.io) for client->server communication. -- [Puppeteer](https://pptr.dev/) for crawling the bookmarks. -- [OpenAI](https://openai.com/) because AI is so hot right now. -- [Meilisearch](https://meilisearch.com) for the full content search. - -## Why did I build it? - -I browse reddit, twitter and hackernews a lot from my phone. I frequently find interesting stuff (articles, tools, etc) that I'd like to bookmark and read later when I'm in front of a laptop. Typical read-it-later apps usecase. Initially, I was using [Pocket](https://getpocket.com) for that. Then I got into self-hosting and I wanted to self-host this usecase. I used [memos](https://github.com/usememos/memos) for those quick notes and I loved it but it was lacking some features that I found important for that usecase such as link previews and automatic tagging (more on that in the next section). - -I'm a systems engineer in my day job (and have been for the past 7 years). I didn't want to get too detached from the web development world. I decided to build this app as a way to keep my hand dirty with web development, and at the same time, build something that I care about and use every day. - -## Alternatives - -- [memos](https://github.com/usememos/memos): I love memos. I have it running on my home server and it's one of my most used self-hosted apps. It doesn't, however, archive or preview the links shared in it. It's just that I dump a lot of links there and I'd have loved if I'd be able to figure which link is that by just looking at my timeline. Also, given the variety of things I dump there, I'd have loved if it does some sort of automatic tagging for what I save there. This is exactly the usecase that I'm trying to tackle with Karakeep. -- [mymind](https://mymind.com/): Mymind is the closest alternative to this project and from where I drew a lot of inspirations. It's a commercial product though. -- [raindrop](https://raindrop.io): A polished open source bookmark manager that supports links, images and files. It's not self-hostable though. -- Bookmark managers (mostly focused on bookmarking links): - - [Pocket](https://getpocket.com): Pocket is what hooked me into the whole idea of read-it-later apps. I used it [a lot](https://blog.mbassem.com/2019/01/27/favorite-articles-2018/). However, I recently got into home-labbing and became obsessed with the idea of running my services in my home server. Karakeep is meant to be a self-hosting first app. - - [Linkwarden](https://linkwarden.app/): An open-source self-hostable bookmark manager that I ran for a bit in my homelab. It's focused mostly on links and supports collaborative collections. - - [Omnivore](https://omnivore.app/): Omnivore is pretty cool open source read-it-later app. Unfortunately, it's heavily dependent on google cloud infra which makes self-hosting it quite hard. They published a [blog post](https://docs.omnivore.app/self-hosting/self-hosting.html) on how to run a minimal omnivore but it was lacking a lot of stuff. Self-hosting doesn't really seem to be a high priority for them, and that's something I care about, so I decided to build an alternative. - - [Wallabag](https://wallabag.it): Wallabag is a well-established open source read-it-later app written in php and I think it's the common recommendation on reddit for such apps. To be honest, I didn't give it a real shot, and the UI just felt a bit dated for my liking. Honestly, it's probably much more stable and feature complete than this app, but where's the fun in that? - - [Shiori](https://github.com/go-shiori/shiori): Shiori is meant to be an open source pocket clone written in Go. It ticks all the marks but doesn't have my super sophisticated AI-based tagging. (JK, I only found about it after I decided to build my own app, so here we are 🤷). - -## Translations - -Karakeep uses Weblate for managing translations. If you want to help translate Karakeep, you can do so [here](https://hosted.weblate.org/engage/hoarder/). - -## Support - -If you're enjoying using Karakeep, drop a ⭐️ on the repo! - -Buy Me A Coffee - -## License - -Karakeep is licensed under [AGPL-3.0](https://github.com/karakeep-app/karakeep/blob/main/LICENSE) and owned by [Localhost Labs Ltd](https://localhostlabs.co.uk). diff --git a/apps/karakeep/metadata/favicon.ico b/apps/karakeep/metadata/favicon.ico deleted file mode 100644 index d940a939b2c876c5c13bfe5d57325b78db309236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI2ONbmr7{_Z(bbO#$jY80fqxjf}(I^@X3hqHS5llcu(UYTy1QY~C@Dhw-1U>k` z7Y5dYCLs4`;34A4Ku|%+NYp%ZHNHnpTz~(W`8Kt^)zdwl>7E{$g5Orx^ZW1D z)m7EiZ;9r_XV2;uPn`s6!DgTKPoIQE%~a zEt=`ppU;W@X>)+sP~P8d{A=Y|{q0=;3p4O5{N(Wq*D4e0Q+0&W>O)?C%0XD!6P`fwa;r6xl^D}9=#SdqZ_!jm6UUAFdW;hmBgKVd5e=c?Xu!cn5 z?WK7)NPial=hII9%i8_|+D^x`zlHpR(8+&s?dAX1K=(gQ`@Pg#4vgI9xOkb^#!XUt zjUA2Ek6|0^0~@bt?8|?u7l+yZjXJl%c_6=!!4072A+D|2w`XKOb*0ZxTVHFaANk=k zkPczbr9H1Ik3;o8h1sx_tEE>2;Aw1@seHC}>q7r%6~;mHQ!_B}1m>ChDBA^pfS&gv zkgc6?7ib)Xd{{)@SJ+OvmwD>Y_>9`u^BXrdEMMa&sw>)0s61LHYG36~!33;{L1p)V z=6188ex3k5&z9%Md&qwT-ink*?Q1={36g^5;P1d}Xg<-rb~;SLpP(}N=|i{*6gGgh zQQS-WnhO<Qad;%rEB|Xf)iZ6+ zlAb>s{}GdOlD)EjA-zsRzwBRzZS4#CWq%d6wU6(Y{VTDpxwBjQo4ht^n|1!xeBP~n z&4pX~XkYu!ulr}xym}iKLG2j@()nN9V;_To##i>+z5q5+2UW33l z=zJ0ugVx^z5H}Xeny+8hhYZVwRGrcC*I*BR>X-?P)n|5Mx>?KAJ} zf*N(7hR_%;z1!?ZN_6*wNZiMLjg^l4(`X8iSmavRQd%4?o*^&Ob>$ z_sfUl$M;6^b(;Avsg^cZ&x_|Fvkh@6@JU@u29x4y~d0m&4Kje&Bw}Cwc6juczP8H;JtJ zEA+RuK>cfbtbdgL^qU2LEZTJ*{_nN^#W!IGg!UX|(x0RyOL>w0&!R7>%}_rBHxky84(;EPe3_+u=>LfG zNe;UI*Og@ayo(NfN6`D=L`trq-V2arEN5xcY5eQ^limZh?sP+%bw7*NP@7KrL-os+ z_kYl@_v*6wHLaeVXx|Kj`1=h#n~#I`uFt|Q&^N$AKz`o@`u3M8jLc}*@!O)A{YQ_q q;uCaGLweDocC105biZRwq|%{5rdX4y;(9wKQd&{wxY;u!bAA8@g|gUr5_1-VFB2~KG4g0UO@zq z7wnA_nq5_Ub$0#fk^N?felSo&(eo!qM^Eizn&|z!j|&gsW8+Pbait##A&>xew>R{>o>mY6 z(q5`{N|J{#Y V;_aRK!GHDy*IyP~4nA4z@d3Td6jcBK diff --git a/apps/karakeep/metadata/logo-2.jpg b/apps/karakeep/metadata/logo-2.jpg deleted file mode 100644 index e0855af880f5fde69d6b3e8862c3cf533b0485b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 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