[{"data":1,"prerenderedAt":1191},["ShallowReactive",2],{"db-company":3,"page-building-articles-karakeep-kubernetes-n8n-matrix-en":24},{"id":4,"extension":5,"meta":6,"stem":22,"__hash__":23},"db/db/company.json","json",{"name":7,"registrationNumber":8,"businessNumber":8,"dateOfIncorporation":9,"type":8,"publicationManager":7,"registeredOffice":10,"corporateOffice":14,"emails":19,"social":20,"url":21},"Nicolas Bages","","1986",{"phone":11,"address":12},"none",{"unit":8,"street":8,"postalCode":13,"city":8,"country":8},false,{"phone":15,"address":16},"+00/00000000",{"unit":8,"street":8,"postalCode":8,"city":8,"country":8,"gps":17},{"latitude":18,"longitude":18},0,{"sales":8},{"facebook":8,"linkedin":8,"x":8,"instagram":8,"teams":8,"gmaps":8},{"website":8},"db/company","0ivZqUmrLRJhhXT1FJE9r0Yfyu61ogQvu0tIXACVB04",{"id":25,"title":26,"body":27,"description":1176,"extension":1177,"meta":1178,"navigation":754,"path":1183,"seo":1184,"sitemap":1185,"stem":1189,"__hash__":1190},"pages_en/building/articles/karakeep-kubernetes-n8n-matrix.md","From saving links to an active inbox: a smarter bookmarking workflow",{"type":28,"value":29,"toc":1151},"minimark",[30,35,39,47,58,61,65,68,71,77,99,103,125,129,155,158,169,172,184,193,197,202,217,221,227,248,253,261,266,283,288,296,300,305,309,349,353,358,401,405,438,449,453,457,460,464,467,534,544,548,552,555,647,651,692,696,699,702,826,830,833,837,845,849,855,858,862,865,1059,1066,1114,1118,1132,1135,1139,1147],[31,32,34],"h2",{"id":33},"overview","Overview",[36,37,38],"p",{},"I've been saving URLs in different places for a long time. Sometimes to share them, sometimes to aggregate ideas, sometimes to read later. Truth is, we collect more than we use and all these links end up in a cemetery before I can sort and process them. I needed an inbox I could automate.",[36,40,41,42,46],{},"There are several bookmark managers available and I spent some time looking at them. I wanted to self-host and automate some tasks like sharing bookmarks tagged ",[43,44,45],"code",{},"X"," in a Matrix room, while avoiding duplicates.",[36,48,49,50,57],{},"A few months ago I discovered ",[51,52,56],"a",{"href":53,"rel":54},"https://karakeep.app/",[55],"nofollow","Karakeep",", an open-source bookmark manager, with a Chrome extension and an iOS app. At the time it didn't have all features I needed. They are now available or under development, thanks to the active community.",[36,59,60],{},"So, I decided to give Karakeep and n8n a try on a weekend project.",[31,62,64],{"id":63},"architecture","Architecture",[36,66,67],{},"Before touching the infrastructure, we must understand the topology of the stack. Karakeep operates as a multi-tiered architecture that relies on headless browser isolation and search indexes.",[36,69,70],{},"Here is what we're gonna build:",[72,73],"img",{"src":74,"alt":75,"style":76},"/_content/images/karakeep-kubernetes-n8n-matrix/karakeep-n8n-matrix-kubernetes.png","Architecture diagram","display:block; width:clamp(300px, 90%, 600px); margin:2rem auto;",[78,79,80],"blockquote",{},[36,81,82,86,87,92,93,98],{},[83,84,85],"strong",{},"Note:"," Karakeep relies on SQLite only but developers have ",[51,88,91],{"href":89,"rel":90},"https://github.com/karakeep-app/karakeep/issues/1782",[55],"approved Postgres"," and ",[51,94,97],{"href":95,"rel":96},"https://github.com/karakeep-app/karakeep/pull/2825",[55],"a PR is on its way",".",[31,100,102],{"id":101},"preparation","Preparation",[104,105,106,113,122],"ul",{},[107,108,109,110,98],"li",{},"Create a DNS record for karakeep: ",[43,111,112],{},"karakeep.domain.tld",[107,114,115,116,121],{},"Read the ",[51,117,120],{"href":118,"rel":119},"https://docs.karakeep.app/administration/security-considerations",[55],"security considerations"," related to web crawling and multi-users.",[107,123,124],{},"Ensure your Matrix and n8n instance are ready and available over HTTPS.",[31,126,128],{"id":127},"install-karakeep-on-kubernetes","Install Karakeep on Kubernetes",[36,130,131,132,137,138,143,144,149,150,98],{},"The ",[51,133,136],{"href":134,"rel":135},"https://github.com/karakeep-app/karakeep",[55],"Karakeep repository"," contains the sources and ",[51,139,142],{"href":140,"rel":141},"https://github.com/karakeep-app/karakeep/tree/main/kubernetes",[55],"the Kustomize manifests",".\nThe team also maintains ",[51,145,148],{"href":146,"rel":147},"https://github.com/karakeep-app/helm-charts",[55],"a Helm chart"," based on a ",[51,151,154],{"href":152,"rel":153},"https://github.com/Code-Age/helm-template-chart",[55],"template Chart",[36,156,157],{},"The cluster I use runs with Traefik and Cert-Manager, so I picked the Kustomize approach because it is faster to add my own manifests.",[36,159,160,165,166,98],{},[51,161,164],{"href":162,"rel":163},"https://docs.karakeep.app/configuration/environment-variables/",[55],"Environment variables"," can be set using the ",[43,167,168],{},".env",[36,170,171],{},"Secrets must be generated beforehand:",[104,173,174,179],{},[107,175,176],{},[43,177,178],{},"APPLICATION_SECRET_KEY=\"\u003Cgenerate-key>\"",[107,180,181],{},[43,182,183],{},"MEILISEARCH_MASTER_KEY=\"\u003Cgenerate-key>\"",[36,185,186,187,192],{},"The documentation comes with a ",[51,188,191],{"href":189,"rel":190},"https://docs.karakeep.app/administration/troubleshooting/",[55],"troubleshooting page"," if needed.",[31,194,196],{"id":195},"administration-first-steps","Administration first steps",[78,198,199],{},[36,200,201],{},"Note: Users cannot change their username or email, so double check the values before creating the user.",[203,204,205,208,211],"ol",{},[107,206,207],{},"Create an admin user by signing up first.",[107,209,210],{},"Create a tenant by signing up second.",[107,212,213,214],{},"Disable sign up: ",[43,215,216],{},"APPLICATION_DISABLE_SIGNUPS=true",[31,218,220],{"id":219},"understanding-the-basics","Understanding the basics",[36,222,223,226],{},[83,224,225],{},"Entries",":",[104,228,229,232],{},[107,230,231],{},"Karakeep separates text entries (Notes) and url entries (Bookmarks). A note is a multi-line entry with more than a URL, while a bookmark is just a link. That little detail is important to keep in mind when creating entries because the crawler won't run on a note. However, a bookmark can be edited to add a notes!",[107,233,234,235,238,239,238,242,238,245],{},"Open bookmark first instead of opening link: ",[83,236,237],{},"Settings"," → ",[83,240,241],{},"User Info",[83,243,244],{},"Bookmark Click Action",[83,246,247],{},"Open Bookmark Details",[36,249,250,226],{},[83,251,252],{},"Tags",[104,254,255,258],{},[107,256,257],{},"Adding tags comes after an entry is created. There is currently no way to add tags on creation.",[107,259,260],{},"When playing around with Rules, one cannot act on an \"entry that has no tag\".",[36,262,263,226],{},[83,264,265],{},"Lists",[104,267,268,271,274],{},[107,269,270],{},"Entries can belong to one list only.",[107,272,273],{},"Collaborations are possible on lists by inviting other users. The list owner can promote other users to owner or admin.",[107,275,276,277,282],{},"Lists can have children (sub-lists). Developers already ",[51,278,281],{"href":279,"rel":280},"https://github.com/karakeep-app/karakeep/issues/2877",[55],"approved"," the development for the feature to collaborate on sublists.",[36,284,285,226],{},[83,286,287],{},"Productivity",[104,289,290,293],{},[107,291,292],{},"Install Chrome extension",[107,294,295],{},"Install iOS app",[31,297,299],{"id":298},"connecting-karakeep-to-n8n-via-webhooks","Connecting Karakeep to n8n via Webhooks",[301,302,304],"h3",{"id":303},"understanding-the-lifecycle","Understanding the lifecycle",[72,306],{"src":307,"alt":308,"style":76},"/_content/images/karakeep-kubernetes-n8n-matrix/karakeep-n8n-workflow.png","Karakeep n8n workflow",[203,310,311,320,330,339],{},[107,312,313,316,317,98],{},[83,314,315],{},"Trigger event",": A bookmark is added to Karakeep. It spins up Chrome headless, parses and extracts the page and generates an event ",[43,318,319],{},"bookmark.crawled",[107,321,322,325,326,329],{},[83,323,324],{},"Webhook",": Karakeep sends an HTTP ",[43,327,328],{},"POST"," request containing a light payload to n8n.",[107,331,332,335,336,98],{},[83,333,334],{},"Authentication",": The n8n Webhook node validates the request against Header Authentication: ",[43,337,338],{},"Authorization: Bearer \u003Ctoken>",[107,340,341,344,345,348],{},[83,342,343],{},"API call",": n8n sends an authenticated HTTP ",[43,346,347],{},"GET"," request back to the Karakeep API to retrieve the complete object of a bookmark.",[301,350,352],{"id":351},"webhook-configuration-on-n8n","Webhook configuration on n8n",[354,355,357],"h4",{"id":356},"_1-configure-the-n8n-webhook-node","1. Configure the n8n Webhook node",[104,359,360,365,370,376],{},[107,361,362,363],{},"Node type: ",[43,364,324],{},[107,366,367,368],{},"HTTP Method: ",[43,369,328],{},[107,371,372,373],{},"Authentication: ",[43,374,375],{},"Header Auth",[107,377,378,379],{},"Credentials setup:\n",[104,380,381,398],{},[107,382,383,384],{},"Create a new credential.\n",[104,385,386,392],{},[107,387,388,389],{},"Name: ",[43,390,391],{},"Authorization",[107,393,394,395,98],{},"Value: ",[43,396,397],{},"Bearer YOUR_SECRET_TOKEN",[107,399,400],{},"Execution: Save the node and copy the Production URL or Test URL for the next step.",[354,402,404],{"id":403},"_2-configure-karakeep-webhook-settings","2. Configure Karakeep webhook settings",[104,406,407,419,422,425],{},[107,408,409,410,238,412,238,415,418],{},"Navigate to ",[83,411,237],{},[83,413,414],{},"Webhooks",[83,416,417],{},"Add Endpoint"," in your Karakeep instance.",[107,420,421],{},"Target URL: Paste the URL copied from your n8n Webhook node.",[107,423,424],{},"Secret / Token: Paste only your raw token string (Do not include the word Bearer or spaces here; Karakeep appends the standard prefix automatically).",[107,426,427,428,431,432,431,435,98],{},"Trigger events: ",[43,429,430],{},"crawled",", ",[43,433,434],{},"created",[43,436,437],{},"edited",[78,439,440],{},[36,441,442,443,445,446,448],{},"Note: Using ",[43,444,434],{}," executes too quickly, before Karakeep finishes fetching page summaries, titles, and screenshots. ",[43,447,430],{}," ensures the full webpage data is already processed.",[301,450,452],{"id":451},"fetching-complete-bookmark-content","Fetching complete bookmark content",[354,454,456],{"id":455},"create-a-karakeep-api-key","Create a Karakeep API Key",[36,458,459],{},"Go to your Karakeep account settings and generate a new API Key.",[354,461,463],{"id":462},"configure-the-n8n-http-request-node","Configure the n8n HTTP Request Node",[36,465,466],{},"Add an HTTP Request node immediately following your Webhook node.",[104,468,469,474,514,517,520],{},[107,470,471,472],{},"Method: ",[43,473,347],{},[107,475,476,477],{},"URL (Expression):",[478,479,483],"pre",{"className":480,"code":481,"language":482,"meta":8,"style":8},"language-bash shiki shiki-themes plastic","https://karakeep.domain.tld/api/v1/bookmarks/{{ $('On: Bookmark').item.json.body.bookmarkId }}\n","bash",[43,484,485],{"__ignoreMap":8},[486,487,490,494,498,502,505,508,511],"span",{"class":488,"line":489},"line",1,[486,491,493],{"class":492},"sJix2","https://karakeep.domain.tld/api/v1/bookmarks/",[486,495,497],{"class":496},"subq3","{{",[486,499,501],{"class":500},"sGSqi"," $(",[486,503,504],{"class":492},"'On: Bookmark'",[486,506,507],{"class":500},")",[486,509,510],{"class":496},".item.json.body.bookmarkId",[486,512,513],{"class":496}," }}\n",[107,515,516],{},"Authentication: Predefined credential type",[107,518,519],{},"Credential Type: Header Auth",[107,521,522,523],{},"Credential Parameters:",[104,524,525,529],{},[107,526,388,527],{},[43,528,391],{},[107,530,394,531,98],{},[43,532,533],{},"Bearer \u003CYOUR_KARAKEEP_API_KEY>",[78,535,536,541],{},[36,537,538,226],{},[83,539,540],{},"Note",[36,542,543],{},"The object payload does not contain lists. Karakeep maintains a structural separation between items and collections.\nTo locate which list the processed bookmark belongs to, you must fetch all lists and filter them inside your workflow.",[31,545,547],{"id":546},"connecting-n8n-to-matrix","Connecting n8n to Matrix",[301,549,551],{"id":550},"create-a-matrix-bot","Create a Matrix bot",[36,553,554],{},"To protect your infrastructure's identity, always deploy isolated bots with specialized permissions rather than using your own profile.",[203,556,557,624,638,641,644],{},[107,558,559,560],{},"Create a Matrix user for the bot from the homeserver:",[478,561,563],{"className":480,"code":562,"language":482,"meta":8,"style":8},"register_new_matrix_user \\\n  -u \"$USERNAME\" \\\n  -p \"$PASSWORD\" \\\n  -c /data/homeserver.yaml \\\n  http://localhost:8008\n",[43,564,565,574,592,607,618],{"__ignoreMap":8},[486,566,567,570],{"class":488,"line":489},[486,568,569],{"class":492},"register_new_matrix_user",[486,571,573],{"class":572},"sjrmR"," \\\n",[486,575,577,580,583,587,590],{"class":488,"line":576},2,[486,578,579],{"class":572},"  -u",[486,581,582],{"class":500}," \"",[486,584,586],{"class":585},"sVs6v","$USERNAME",[486,588,589],{"class":500},"\"",[486,591,573],{"class":572},[486,593,595,598,600,603,605],{"class":488,"line":594},3,[486,596,597],{"class":572},"  -p",[486,599,582],{"class":500},[486,601,602],{"class":585},"$PASSWORD",[486,604,589],{"class":500},[486,606,573],{"class":572},[486,608,610,613,616],{"class":488,"line":609},4,[486,611,612],{"class":572},"  -c",[486,614,615],{"class":496}," /data/homeserver.yaml",[486,617,573],{"class":572},[486,619,621],{"class":488,"line":620},5,[486,622,623],{"class":496},"  http://localhost:8008\n",[107,625,626,627,238,629,238,632,238,635],{},"Get Matrix bot access token by logging in and fetching the token in ",[83,628,237],{},[83,630,631],{},"Help & About",[83,633,634],{},"Advanced",[83,636,637],{},"Access Token",[107,639,640],{},"Invite the Matrix bot to the room where you want to share bookmarks",[107,642,643],{},"Join the room with the bot (need to accept the invite from the web UI) otherwise Matrix bot won't be able to send messages to the room.",[107,645,646],{},"Create credentials for Matrix bot in n8n",[301,648,650],{"id":649},"credentials-for-matrix-bot","Credentials for Matrix bot",[104,652,653],{},[107,654,655,656],{},"Create credentials for Matrix bot\n",[104,657,658,669,672],{},[107,659,660,661,238,663,238,666],{},"Go to ",[83,662,237],{},[83,664,665],{},"Credentials",[83,667,668],{},"Create Credentials",[107,670,671],{},"Credential Type: Matrix Bot",[107,673,674,675],{},"Credential Parameters:\n",[104,676,677,680,686],{},[107,678,679],{},"Name: Matrix Bot",[107,681,682,683],{},"User ID: ",[43,684,685],{},"@bot:your-domain.com",[107,687,688,689],{},"Access Token: ",[43,690,691],{},"YOUR_MATRIX_BOT_ACCESS_TOKEN",[301,693,695],{"id":694},"sending-matrix-message","Sending Matrix message",[36,697,698],{},"Use the Matrix Bot node to send the bookmark to the Matrix room.",[36,700,701],{},"The message in the node can be:",[478,703,707],{"className":704,"code":705,"language":706,"meta":8,"style":8},"language-js shiki shiki-themes plastic","{{ $('Fetch: Bookmark Details').item.json.content.title }}\n\n{{ $('Fetch: Bookmark Details').item.json.content.description }}\n\n{{ $('Fetch: Bookmark Details').item.json.content.url }}\n","js",[43,708,709,750,756,789,793],{"__ignoreMap":8},[486,710,711,714,717,720,723,726,728,731,734,736,738,740,743,745,748],{"class":488,"line":489},[486,712,713],{"class":500},"{{ ",[486,715,716],{"class":492},"$",[486,718,719],{"class":500},"(",[486,721,722],{"class":500},"'",[486,724,725],{"class":496},"Fetch: Bookmark Details",[486,727,722],{"class":500},[486,729,730],{"class":500},").",[486,732,733],{"class":585},"item",[486,735,98],{"class":500},[486,737,5],{"class":585},[486,739,98],{"class":500},[486,741,742],{"class":585},"content",[486,744,98],{"class":500},[486,746,747],{"class":585},"title",[486,749,513],{"class":500},[486,751,752],{"class":488,"line":576},[486,753,755],{"emptyLinePlaceholder":754},true,"\n",[486,757,758,760,762,764,766,768,770,772,774,776,778,780,782,784,787],{"class":488,"line":594},[486,759,713],{"class":500},[486,761,716],{"class":492},[486,763,719],{"class":500},[486,765,722],{"class":500},[486,767,725],{"class":496},[486,769,722],{"class":500},[486,771,730],{"class":500},[486,773,733],{"class":585},[486,775,98],{"class":500},[486,777,5],{"class":585},[486,779,98],{"class":500},[486,781,742],{"class":585},[486,783,98],{"class":500},[486,785,786],{"class":585},"description",[486,788,513],{"class":500},[486,790,791],{"class":488,"line":609},[486,792,755],{"emptyLinePlaceholder":754},[486,794,795,797,799,801,803,805,807,809,811,813,815,817,819,821,824],{"class":488,"line":620},[486,796,713],{"class":500},[486,798,716],{"class":492},[486,800,719],{"class":500},[486,802,722],{"class":500},[486,804,725],{"class":496},[486,806,722],{"class":500},[486,808,730],{"class":500},[486,810,733],{"class":585},[486,812,98],{"class":500},[486,814,5],{"class":585},[486,816,98],{"class":500},[486,818,742],{"class":585},[486,820,98],{"class":500},[486,822,823],{"class":585},"url",[486,825,513],{"class":500},[31,827,829],{"id":828},"production-readiness","Production readiness",[36,831,832],{},"Well, this is a prototype for now. When it comes to production, here are some things to consider.",[301,834,836],{"id":835},"documentation","Documentation",[36,838,839,844],{},[51,840,843],{"href":841,"rel":842},"https://www.weinto.com/en/codex/topics/documentation",[55],"Document this software and its operations",". What is not documented does not exist.",[301,846,848],{"id":847},"backup-and-restore","Backup and restore",[36,850,851,852,98],{},"Because Karakeep relies on a local SQLite, backup the file ",[43,853,854],{},"/data/karakeep.db",[36,856,857],{},"Don't forget to lock the file first or the database will corrupt itself.",[301,859,861],{"id":860},"healthchecks-and-monitoring","Healthchecks and monitoring",[36,863,864],{},"An example of probes to add to the statefulset:",[478,866,870],{"className":867,"code":868,"language":869,"meta":8,"style":8},"language-yaml shiki shiki-themes plastic","livenessProbe:\n  httpGet:\n    path: /api/health\n    port: 3000\n    scheme: HTTP\n  initialDelaySeconds: 10\n  timeoutSeconds: 1\n  periodSeconds: 10\n  successThreshold: 1\n  failureThreshold: 3\nreadinessProbe:\n  httpGet:\n    path: /api/health\n    port: 3000\n    scheme: HTTP\n  initialDelaySeconds: 10\n  timeoutSeconds: 1\n  periodSeconds: 10\n  successThreshold: 1\n  failureThreshold: 3\n","yaml",[43,871,872,881,888,899,909,919,930,941,951,961,972,980,987,996,1005,1014,1023,1032,1041,1050],{"__ignoreMap":8},[486,873,874,878],{"class":488,"line":489},[486,875,877],{"class":876},"sU0A5","livenessProbe",[486,879,880],{"class":500},":\n",[486,882,883,886],{"class":488,"line":576},[486,884,885],{"class":876},"  httpGet",[486,887,880],{"class":500},[486,889,890,893,896],{"class":488,"line":594},[486,891,892],{"class":876},"    path",[486,894,895],{"class":500},": ",[486,897,898],{"class":496},"/api/health\n",[486,900,901,904,906],{"class":488,"line":609},[486,902,903],{"class":876},"    port",[486,905,895],{"class":500},[486,907,908],{"class":572},"3000\n",[486,910,911,914,916],{"class":488,"line":620},[486,912,913],{"class":876},"    scheme",[486,915,895],{"class":500},[486,917,918],{"class":496},"HTTP\n",[486,920,922,925,927],{"class":488,"line":921},6,[486,923,924],{"class":876},"  initialDelaySeconds",[486,926,895],{"class":500},[486,928,929],{"class":572},"10\n",[486,931,933,936,938],{"class":488,"line":932},7,[486,934,935],{"class":876},"  timeoutSeconds",[486,937,895],{"class":500},[486,939,940],{"class":572},"1\n",[486,942,944,947,949],{"class":488,"line":943},8,[486,945,946],{"class":876},"  periodSeconds",[486,948,895],{"class":500},[486,950,929],{"class":572},[486,952,954,957,959],{"class":488,"line":953},9,[486,955,956],{"class":876},"  successThreshold",[486,958,895],{"class":500},[486,960,940],{"class":572},[486,962,964,967,969],{"class":488,"line":963},10,[486,965,966],{"class":876},"  failureThreshold",[486,968,895],{"class":500},[486,970,971],{"class":572},"3\n",[486,973,975,978],{"class":488,"line":974},11,[486,976,977],{"class":876},"readinessProbe",[486,979,880],{"class":500},[486,981,983,985],{"class":488,"line":982},12,[486,984,885],{"class":876},[486,986,880],{"class":500},[486,988,990,992,994],{"class":488,"line":989},13,[486,991,892],{"class":876},[486,993,895],{"class":500},[486,995,898],{"class":496},[486,997,999,1001,1003],{"class":488,"line":998},14,[486,1000,903],{"class":876},[486,1002,895],{"class":500},[486,1004,908],{"class":572},[486,1006,1008,1010,1012],{"class":488,"line":1007},15,[486,1009,913],{"class":876},[486,1011,895],{"class":500},[486,1013,918],{"class":496},[486,1015,1017,1019,1021],{"class":488,"line":1016},16,[486,1018,924],{"class":876},[486,1020,895],{"class":500},[486,1022,929],{"class":572},[486,1024,1026,1028,1030],{"class":488,"line":1025},17,[486,1027,935],{"class":876},[486,1029,895],{"class":500},[486,1031,940],{"class":572},[486,1033,1035,1037,1039],{"class":488,"line":1034},18,[486,1036,946],{"class":876},[486,1038,895],{"class":500},[486,1040,929],{"class":572},[486,1042,1044,1046,1048],{"class":488,"line":1043},19,[486,1045,956],{"class":876},[486,1047,895],{"class":500},[486,1049,940],{"class":572},[486,1051,1053,1055,1057],{"class":488,"line":1052},20,[486,1054,966],{"class":876},[486,1056,895],{"class":500},[486,1058,971],{"class":572},[36,1060,1061,1062,1065],{},"The path ",[43,1063,1064],{},"karakeep.domain.tld/api/health"," should show:",[478,1067,1070],{"className":1068,"code":1069,"language":5,"meta":8,"style":8},"language-json shiki shiki-themes plastic","{ \"status\": \"ok\", \"message\": \"Web app is working\" }\n",[43,1071,1072],{"__ignoreMap":8},[486,1073,1074,1077,1079,1082,1084,1086,1088,1091,1093,1095,1097,1100,1102,1104,1106,1109,1111],{"class":488,"line":489},[486,1075,1076],{"class":500},"{ ",[486,1078,589],{"class":500},[486,1080,1081],{"class":585},"status",[486,1083,589],{"class":500},[486,1085,895],{"class":500},[486,1087,589],{"class":500},[486,1089,1090],{"class":496},"ok",[486,1092,589],{"class":500},[486,1094,431],{"class":500},[486,1096,589],{"class":500},[486,1098,1099],{"class":585},"message",[486,1101,589],{"class":500},[486,1103,895],{"class":500},[486,1105,589],{"class":500},[486,1107,1108],{"class":496},"Web app is working",[486,1110,589],{"class":500},[486,1112,1113],{"class":500}," }\n",[301,1115,1117],{"id":1116},"increase-crawlers-and-resources","Increase crawlers and resources",[36,1119,1120,1121,1128,1129,730],{},"Increase the ",[51,1122,1125],{"href":1123,"rel":1124},"https://docs.karakeep.app/configuration/environment-variables#crawler-configs",[55],[43,1126,1127],{},"CRAWLER_NUM_WORKERS"," (default ",[43,1130,1131],{},"1",[36,1133,1134],{},"You can also increase pods' resources.",[301,1136,1138],{"id":1137},"upgrades","Upgrades",[36,1140,1141,1142,98],{},"Follow the official documentation for ",[51,1143,1146],{"href":1144,"rel":1145},"https://docs.karakeep.app/administration/hoarder-to-karakeep-migration/",[55],"upgrading Karakeep",[1148,1149,1150],"style",{},"html pre.shiki code .sJix2, html code.shiki .sJix2{--shiki-default:#B57EDC}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVs6v, html code.shiki .sVs6v{--shiki-default:#C6CCD7}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}",{"title":8,"searchDepth":576,"depth":576,"links":1152},[1153,1154,1155,1156,1157,1158,1159,1164,1169],{"id":33,"depth":576,"text":34},{"id":63,"depth":576,"text":64},{"id":101,"depth":576,"text":102},{"id":127,"depth":576,"text":128},{"id":195,"depth":576,"text":196},{"id":219,"depth":576,"text":220},{"id":298,"depth":576,"text":299,"children":1160},[1161,1162,1163],{"id":303,"depth":594,"text":304},{"id":351,"depth":594,"text":352},{"id":451,"depth":594,"text":452},{"id":546,"depth":576,"text":547,"children":1165},[1166,1167,1168],{"id":550,"depth":594,"text":551},{"id":649,"depth":594,"text":650},{"id":694,"depth":594,"text":695},{"id":828,"depth":576,"text":829,"children":1170},[1171,1172,1173,1174,1175],{"id":835,"depth":594,"text":836},{"id":847,"depth":594,"text":848},{"id":860,"depth":594,"text":861},{"id":1116,"depth":594,"text":1117},{"id":1137,"depth":594,"text":1138},"Collect less, use more. This guide covers setting up an automated bookmarking lifecycle that crawls pages and shares them in a Matrix room.","md",{"publication_date":1179,"views":1180,"status":1182},"2026-06-14",[1181],"builder","published","/building/articles/karakeep-kubernetes-n8n-matrix",{"title":26,"description":1176},{"loc":1183,"images":1186},[1187,1188],{"loc":74},{"loc":307},"building/articles/karakeep-kubernetes-n8n-matrix","cnqqtXZ59xBPRgpXl7oOmnsRNThgtO1ZwF0EW_SkLd0",1781436153104]