khoj 1.25.1.dev12__py3-none-any.whl → 1.26.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. khoj/database/adapters/__init__.py +87 -9
  2. khoj/database/admin.py +16 -0
  3. khoj/database/migrations/0068_alter_agent_output_modes.py +24 -0
  4. khoj/database/migrations/0069_webscraper_serverchatsettings_web_scraper.py +89 -0
  5. khoj/database/models/__init__.py +78 -2
  6. khoj/interface/compiled/404/index.html +1 -1
  7. khoj/interface/compiled/_next/static/chunks/1603-fa3ee48860b9dc5c.js +1 -0
  8. khoj/interface/compiled/_next/static/chunks/{9417-1d158bf46d3a0dc9.js → 9417-46ed3aaa639c85ef.js} +1 -1
  9. khoj/interface/compiled/_next/static/chunks/{9479-563e4d61f91d5a7c.js → 9479-ea776e73f549090c.js} +1 -1
  10. khoj/interface/compiled/_next/static/chunks/app/agents/{layout-e71c8e913cccf792.js → layout-75636ab3a413fa8e.js} +1 -1
  11. khoj/interface/compiled/_next/static/chunks/app/agents/{page-f8d03847a0fa2539.js → page-88aa3042711107b7.js} +1 -1
  12. khoj/interface/compiled/_next/static/chunks/app/chat/{layout-8102549127db3067.js → layout-96fcf62857bf8f30.js} +1 -1
  13. khoj/interface/compiled/_next/static/chunks/app/{layout-f3e40d346da53112.js → layout-d0f0a9067427fb20.js} +1 -1
  14. khoj/interface/compiled/_next/static/chunks/app/settings/{layout-6f9314b0d7a26046.js → layout-a8f33dfe92f997fb.js} +1 -1
  15. khoj/interface/compiled/_next/static/chunks/app/share/chat/{layout-39f03f9e32399f0f.js → layout-2df56074e42adaa0.js} +1 -1
  16. khoj/interface/compiled/_next/static/chunks/{webpack-dff708c71e9234cb.js → webpack-64dc39af85cd2625.js} +1 -1
  17. khoj/interface/compiled/_next/static/css/467a524c75e7d7c0.css +1 -0
  18. khoj/interface/compiled/agents/index.html +1 -1
  19. khoj/interface/compiled/agents/index.txt +2 -2
  20. khoj/interface/compiled/automations/index.html +1 -1
  21. khoj/interface/compiled/automations/index.txt +2 -2
  22. khoj/interface/compiled/chat/index.html +1 -1
  23. khoj/interface/compiled/chat/index.txt +2 -2
  24. khoj/interface/compiled/factchecker/index.html +1 -1
  25. khoj/interface/compiled/factchecker/index.txt +2 -2
  26. khoj/interface/compiled/index.html +1 -1
  27. khoj/interface/compiled/index.txt +2 -2
  28. khoj/interface/compiled/search/index.html +1 -1
  29. khoj/interface/compiled/search/index.txt +2 -2
  30. khoj/interface/compiled/settings/index.html +1 -1
  31. khoj/interface/compiled/settings/index.txt +3 -3
  32. khoj/interface/compiled/share/chat/index.html +1 -1
  33. khoj/interface/compiled/share/chat/index.txt +2 -2
  34. khoj/interface/web/assets/icons/agents.svg +1 -0
  35. khoj/interface/web/assets/icons/automation.svg +1 -0
  36. khoj/interface/web/assets/icons/chat.svg +24 -0
  37. khoj/interface/web/login.html +11 -22
  38. khoj/processor/content/images/image_to_entries.py +2 -0
  39. khoj/processor/content/pdf/pdf_to_entries.py +1 -1
  40. khoj/processor/conversation/google/utils.py +4 -0
  41. khoj/processor/conversation/prompts.py +1 -1
  42. khoj/processor/embeddings.py +1 -0
  43. khoj/processor/tools/online_search.py +135 -40
  44. khoj/routers/api_chat.py +41 -31
  45. khoj/routers/helpers.py +13 -11
  46. khoj/search_type/text_search.py +7 -2
  47. khoj/utils/helpers.py +50 -5
  48. {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/METADATA +4 -4
  49. {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/RECORD +56 -53
  50. khoj/interface/compiled/_next/static/chunks/1603-67a89278e2c5dbe6.js +0 -1
  51. khoj/interface/compiled/_next/static/css/1538cedb321e3a97.css +0 -1
  52. /khoj/interface/compiled/_next/static/chunks/{9178-f208a3e6404714a9.js → 9178-899fe9a6b754ecfe.js} +0 -0
  53. /khoj/interface/compiled/_next/static/chunks/app/{page-421d13f70c505dd9.js → page-10a5aad6e04f3cf8.js} +0 -0
  54. /khoj/interface/compiled/_next/static/{CGyts-FEbV6owmPboHtLL → eim4XajTfG4ub4ft5AEkJ}/_buildManifest.js +0 -0
  55. /khoj/interface/compiled/_next/static/{CGyts-FEbV6owmPboHtLL → eim4XajTfG4ub4ft5AEkJ}/_ssgManifest.js +0 -0
  56. {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/WHEEL +0 -0
  57. {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/entry_points.txt +0 -0
  58. {khoj-1.25.1.dev12.dist-info → khoj-1.26.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import logging
3
3
  import math
4
+ import os
4
5
  import random
5
6
  import re
6
7
  import secrets
@@ -10,7 +11,6 @@ from enum import Enum
10
11
  from typing import Callable, Iterable, List, Optional, Type
11
12
 
12
13
  import cron_descriptor
13
- import django
14
14
  from apscheduler.job import Job
15
15
  from asgiref.sync import sync_to_async
16
16
  from django.contrib.sessions.backends.db import SessionStore
@@ -52,6 +52,7 @@ from khoj.database.models import (
52
52
  UserTextToImageModelConfig,
53
53
  UserVoiceModelConfig,
54
54
  VoiceModelOption,
55
+ WebScraper,
55
56
  )
56
57
  from khoj.processor.conversation import prompts
57
58
  from khoj.search_filter.date_filter import DateFilter
@@ -59,7 +60,12 @@ from khoj.search_filter.file_filter import FileFilter
59
60
  from khoj.search_filter.word_filter import WordFilter
60
61
  from khoj.utils import state
61
62
  from khoj.utils.config import OfflineChatProcessorModel
62
- from khoj.utils.helpers import generate_random_name, is_none_or_empty, timer
63
+ from khoj.utils.helpers import (
64
+ generate_random_name,
65
+ in_debug_mode,
66
+ is_none_or_empty,
67
+ timer,
68
+ )
63
69
 
64
70
  logger = logging.getLogger(__name__)
65
71
 
@@ -1031,6 +1037,70 @@ class ConversationAdapters:
1031
1037
  return server_chat_settings.chat_advanced
1032
1038
  return await ConversationAdapters.aget_default_conversation_config(user)
1033
1039
 
1040
+ @staticmethod
1041
+ async def aget_server_webscraper():
1042
+ server_chat_settings = await ServerChatSettings.objects.filter().prefetch_related("web_scraper").afirst()
1043
+ if server_chat_settings is not None and server_chat_settings.web_scraper is not None:
1044
+ return server_chat_settings.web_scraper
1045
+ return None
1046
+
1047
+ @staticmethod
1048
+ async def aget_enabled_webscrapers() -> list[WebScraper]:
1049
+ enabled_scrapers: list[WebScraper] = []
1050
+ server_webscraper = await ConversationAdapters.aget_server_webscraper()
1051
+ if server_webscraper:
1052
+ # Only use the webscraper set in the server chat settings
1053
+ enabled_scrapers = [server_webscraper]
1054
+ if not enabled_scrapers:
1055
+ # Use the enabled web scrapers, ordered by priority, until get web page content
1056
+ enabled_scrapers = [scraper async for scraper in WebScraper.objects.all().order_by("priority").aiterator()]
1057
+ if not enabled_scrapers:
1058
+ # Use scrapers enabled via environment variables
1059
+ if os.getenv("FIRECRAWL_API_KEY"):
1060
+ api_url = os.getenv("FIRECRAWL_API_URL", "https://api.firecrawl.dev")
1061
+ enabled_scrapers.append(
1062
+ WebScraper(
1063
+ type=WebScraper.WebScraperType.FIRECRAWL,
1064
+ name=WebScraper.WebScraperType.FIRECRAWL.capitalize(),
1065
+ api_key=os.getenv("FIRECRAWL_API_KEY"),
1066
+ api_url=api_url,
1067
+ )
1068
+ )
1069
+ if os.getenv("OLOSTEP_API_KEY"):
1070
+ api_url = os.getenv("OLOSTEP_API_URL", "https://agent.olostep.com/olostep-p2p-incomingAPI")
1071
+ enabled_scrapers.append(
1072
+ WebScraper(
1073
+ type=WebScraper.WebScraperType.OLOSTEP,
1074
+ name=WebScraper.WebScraperType.OLOSTEP.capitalize(),
1075
+ api_key=os.getenv("OLOSTEP_API_KEY"),
1076
+ api_url=api_url,
1077
+ )
1078
+ )
1079
+ # Jina is the default fallback scrapers to use as it does not require an API key
1080
+ api_url = os.getenv("JINA_READER_API_URL", "https://r.jina.ai/")
1081
+ enabled_scrapers.append(
1082
+ WebScraper(
1083
+ type=WebScraper.WebScraperType.JINA,
1084
+ name=WebScraper.WebScraperType.JINA.capitalize(),
1085
+ api_key=os.getenv("JINA_API_KEY"),
1086
+ api_url=api_url,
1087
+ )
1088
+ )
1089
+
1090
+ # Only enable the direct web page scraper by default in self-hosted single user setups.
1091
+ # Useful for reading webpages on your intranet.
1092
+ if state.anonymous_mode or in_debug_mode():
1093
+ enabled_scrapers.append(
1094
+ WebScraper(
1095
+ type=WebScraper.WebScraperType.DIRECT,
1096
+ name=WebScraper.WebScraperType.DIRECT.capitalize(),
1097
+ api_key=None,
1098
+ api_url=None,
1099
+ )
1100
+ )
1101
+
1102
+ return enabled_scrapers
1103
+
1034
1104
  @staticmethod
1035
1105
  def create_conversation_from_public_conversation(
1036
1106
  user: KhojUser, public_conversation: PublicConversation, client_app: ClientApplication
@@ -1393,12 +1463,15 @@ class EntryAdapters:
1393
1463
  file_filters = EntryAdapters.file_filter.get_filter_terms(query)
1394
1464
  date_filters = EntryAdapters.date_filter.get_query_date_range(query)
1395
1465
 
1396
- user_or_agent = Q(user=user)
1466
+ owner_filter = Q()
1467
+
1468
+ if user != None:
1469
+ owner_filter = Q(user=user)
1397
1470
  if agent != None:
1398
- user_or_agent |= Q(agent=agent)
1471
+ owner_filter |= Q(agent=agent)
1399
1472
 
1400
1473
  if len(word_filters) == 0 and len(file_filters) == 0 and len(date_filters) == 0:
1401
- return Entry.objects.filter(user_or_agent)
1474
+ return Entry.objects.filter(owner_filter)
1402
1475
 
1403
1476
  for term in word_filters:
1404
1477
  if term.startswith("+"):
@@ -1434,7 +1507,7 @@ class EntryAdapters:
1434
1507
  formatted_max_date = date.fromtimestamp(max_date).strftime("%Y-%m-%d")
1435
1508
  q_filter_terms &= Q(embeddings_dates__date__lte=formatted_max_date)
1436
1509
 
1437
- relevant_entries = Entry.objects.filter(user_or_agent).filter(q_filter_terms)
1510
+ relevant_entries = Entry.objects.filter(owner_filter).filter(q_filter_terms)
1438
1511
  if file_type_filter:
1439
1512
  relevant_entries = relevant_entries.filter(file_type=file_type_filter)
1440
1513
  return relevant_entries
@@ -1449,13 +1522,18 @@ class EntryAdapters:
1449
1522
  max_distance: float = math.inf,
1450
1523
  agent: Agent = None,
1451
1524
  ):
1452
- user_or_agent = Q(user=user)
1525
+ owner_filter = Q()
1453
1526
 
1527
+ if user != None:
1528
+ owner_filter = Q(user=user)
1454
1529
  if agent != None:
1455
- user_or_agent |= Q(agent=agent)
1530
+ owner_filter |= Q(agent=agent)
1531
+
1532
+ if owner_filter == Q():
1533
+ return Entry.objects.none()
1456
1534
 
1457
1535
  relevant_entries = EntryAdapters.apply_filters(user, raw_query, file_type_filter, agent)
1458
- relevant_entries = relevant_entries.filter(user_or_agent).annotate(
1536
+ relevant_entries = relevant_entries.filter(owner_filter).annotate(
1459
1537
  distance=CosineDistance("embeddings", embeddings)
1460
1538
  )
1461
1539
  relevant_entries = relevant_entries.filter(distance__lte=max_distance)
khoj/database/admin.py CHANGED
@@ -31,6 +31,7 @@ from khoj.database.models import (
31
31
  UserSearchModelConfig,
32
32
  UserVoiceModelConfig,
33
33
  VoiceModelOption,
34
+ WebScraper,
34
35
  )
35
36
  from khoj.utils.helpers import ImageIntentType
36
37
 
@@ -198,9 +199,24 @@ class ServerChatSettingsAdmin(admin.ModelAdmin):
198
199
  list_display = (
199
200
  "chat_default",
200
201
  "chat_advanced",
202
+ "web_scraper",
201
203
  )
202
204
 
203
205
 
206
+ @admin.register(WebScraper)
207
+ class WebScraperAdmin(admin.ModelAdmin):
208
+ list_display = (
209
+ "priority",
210
+ "name",
211
+ "type",
212
+ "api_key",
213
+ "api_url",
214
+ "created_at",
215
+ )
216
+ search_fields = ("name", "api_key", "api_url", "type")
217
+ ordering = ("priority",)
218
+
219
+
204
220
  @admin.register(Conversation)
205
221
  class ConversationAdmin(admin.ModelAdmin):
206
222
  list_display = (
@@ -0,0 +1,24 @@
1
+ # Generated by Django 5.0.8 on 2024-10-17 18:13
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("database", "0067_alter_agent_style_icon"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="agent",
15
+ name="output_modes",
16
+ field=django.contrib.postgres.fields.ArrayField(
17
+ base_field=models.CharField(
18
+ choices=[("text", "Text"), ("image", "Image"), ("automation", "Automation")], max_length=200
19
+ ),
20
+ default=list,
21
+ size=None,
22
+ ),
23
+ ),
24
+ ]
@@ -0,0 +1,89 @@
1
+ # Generated by Django 5.0.8 on 2024-10-18 00:41
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("database", "0068_alter_agent_output_modes"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name="WebScraper",
15
+ fields=[
16
+ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
17
+ ("created_at", models.DateTimeField(auto_now_add=True)),
18
+ ("updated_at", models.DateTimeField(auto_now=True)),
19
+ (
20
+ "name",
21
+ models.CharField(
22
+ blank=True,
23
+ default=None,
24
+ help_text="Friendly name. If not set, it will be set to the type of the scraper.",
25
+ max_length=200,
26
+ null=True,
27
+ unique=True,
28
+ ),
29
+ ),
30
+ (
31
+ "type",
32
+ models.CharField(
33
+ choices=[
34
+ ("Firecrawl", "Firecrawl"),
35
+ ("Olostep", "Olostep"),
36
+ ("Jina", "Jina"),
37
+ ("Direct", "Direct"),
38
+ ],
39
+ default="Jina",
40
+ max_length=20,
41
+ ),
42
+ ),
43
+ (
44
+ "api_key",
45
+ models.CharField(
46
+ blank=True,
47
+ default=None,
48
+ help_text="API key of the web scraper. Only set if scraper service requires an API key. Default is set from env var.",
49
+ max_length=200,
50
+ null=True,
51
+ ),
52
+ ),
53
+ (
54
+ "api_url",
55
+ models.URLField(
56
+ blank=True,
57
+ default=None,
58
+ help_text="API URL of the web scraper. Only set if scraper service on non-default URL.",
59
+ null=True,
60
+ ),
61
+ ),
62
+ (
63
+ "priority",
64
+ models.IntegerField(
65
+ blank=True,
66
+ default=None,
67
+ help_text="Priority of the web scraper. Lower numbers run first.",
68
+ null=True,
69
+ unique=True,
70
+ ),
71
+ ),
72
+ ],
73
+ options={
74
+ "abstract": False,
75
+ },
76
+ ),
77
+ migrations.AddField(
78
+ model_name="serverchatsettings",
79
+ name="web_scraper",
80
+ field=models.ForeignKey(
81
+ blank=True,
82
+ default=None,
83
+ null=True,
84
+ on_delete=django.db.models.deletion.CASCADE,
85
+ related_name="web_scraper",
86
+ to="database.webscraper",
87
+ ),
88
+ ),
89
+ ]
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import re
2
3
  import uuid
3
4
  from random import choice
@@ -11,8 +12,6 @@ from django.dispatch import receiver
11
12
  from pgvector.django import VectorField
12
13
  from phonenumber_field.modelfields import PhoneNumberField
13
14
 
14
- from khoj.utils.helpers import ConversationCommand
15
-
16
15
 
17
16
  class BaseModel(models.Model):
18
17
  created_at = models.DateTimeField(auto_now_add=True)
@@ -174,6 +173,7 @@ class Agent(BaseModel):
174
173
  # These map to various ConversationCommand types
175
174
  TEXT = "text"
176
175
  IMAGE = "image"
176
+ AUTOMATION = "automation"
177
177
 
178
178
  creator = models.ForeignKey(
179
179
  KhojUser, on_delete=models.CASCADE, default=None, null=True, blank=True
@@ -243,6 +243,79 @@ class GithubRepoConfig(BaseModel):
243
243
  github_config = models.ForeignKey(GithubConfig, on_delete=models.CASCADE, related_name="githubrepoconfig")
244
244
 
245
245
 
246
+ class WebScraper(BaseModel):
247
+ class WebScraperType(models.TextChoices):
248
+ FIRECRAWL = "Firecrawl"
249
+ OLOSTEP = "Olostep"
250
+ JINA = "Jina"
251
+ DIRECT = "Direct"
252
+
253
+ name = models.CharField(
254
+ max_length=200,
255
+ default=None,
256
+ null=True,
257
+ blank=True,
258
+ unique=True,
259
+ help_text="Friendly name. If not set, it will be set to the type of the scraper.",
260
+ )
261
+ type = models.CharField(max_length=20, choices=WebScraperType.choices, default=WebScraperType.JINA)
262
+ api_key = models.CharField(
263
+ max_length=200,
264
+ default=None,
265
+ null=True,
266
+ blank=True,
267
+ help_text="API key of the web scraper. Only set if scraper service requires an API key. Default is set from env var.",
268
+ )
269
+ api_url = models.URLField(
270
+ max_length=200,
271
+ default=None,
272
+ null=True,
273
+ blank=True,
274
+ help_text="API URL of the web scraper. Only set if scraper service on non-default URL.",
275
+ )
276
+ priority = models.IntegerField(
277
+ default=None,
278
+ null=True,
279
+ blank=True,
280
+ unique=True,
281
+ help_text="Priority of the web scraper. Lower numbers run first.",
282
+ )
283
+
284
+ def clean(self):
285
+ error = {}
286
+ if self.name is None:
287
+ self.name = self.type.capitalize()
288
+ if self.api_url is None:
289
+ if self.type == self.WebScraperType.FIRECRAWL:
290
+ self.api_url = os.getenv("FIRECRAWL_API_URL", "https://api.firecrawl.dev")
291
+ elif self.type == self.WebScraperType.OLOSTEP:
292
+ self.api_url = os.getenv("OLOSTEP_API_URL", "https://agent.olostep.com/olostep-p2p-incomingAPI")
293
+ elif self.type == self.WebScraperType.JINA:
294
+ self.api_url = os.getenv("JINA_READER_API_URL", "https://r.jina.ai/")
295
+ if self.api_key is None:
296
+ if self.type == self.WebScraperType.FIRECRAWL:
297
+ self.api_key = os.getenv("FIRECRAWL_API_KEY")
298
+ if not self.api_key and self.api_url == "https://api.firecrawl.dev":
299
+ error["api_key"] = "Set API key to use default Firecrawl. Get API key from https://firecrawl.dev."
300
+ elif self.type == self.WebScraperType.OLOSTEP:
301
+ self.api_key = os.getenv("OLOSTEP_API_KEY")
302
+ if self.api_key is None:
303
+ error["api_key"] = "Set API key to use Olostep. Get API key from https://olostep.com/."
304
+ elif self.type == self.WebScraperType.JINA:
305
+ self.api_key = os.getenv("JINA_API_KEY")
306
+ if error:
307
+ raise ValidationError(error)
308
+
309
+ def save(self, *args, **kwargs):
310
+ self.clean()
311
+
312
+ if self.priority is None:
313
+ max_priority = WebScraper.objects.aggregate(models.Max("priority"))["priority__max"]
314
+ self.priority = max_priority + 1 if max_priority else 1
315
+
316
+ super().save(*args, **kwargs)
317
+
318
+
246
319
  class ServerChatSettings(BaseModel):
247
320
  chat_default = models.ForeignKey(
248
321
  ChatModelOptions, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="chat_default"
@@ -250,6 +323,9 @@ class ServerChatSettings(BaseModel):
250
323
  chat_advanced = models.ForeignKey(
251
324
  ChatModelOptions, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="chat_advanced"
252
325
  )
326
+ web_scraper = models.ForeignKey(
327
+ WebScraper, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="web_scraper"
328
+ )
253
329
 
254
330
 
255
331
  class LocalOrgConfig(BaseModel):
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/0e790e04fd40ad16-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/1538cedb321e3a97.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/b9a6bf04305d98d7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-dff708c71e9234cb.js"/><script src="/_next/static/chunks/fd9d1056-2b978342deb60015.js" async=""></script><script src="/_next/static/chunks/7023-a5bf5744d19b3bd3.js" async=""></script><script src="/_next/static/chunks/main-app-6d6ee3495efe03d4.js" async=""></script><meta name="robots" content="noindex"/><meta http-equiv="Content-Security-Policy" content="default-src &#x27;self&#x27; https://assets.khoj.dev; media-src * blob:; script-src &#x27;self&#x27; https://assets.khoj.dev &#x27;unsafe-inline&#x27; &#x27;unsafe-eval&#x27;; connect-src &#x27;self&#x27; blob: https://ipapi.co/json ws://localhost:42110; style-src &#x27;self&#x27; https://assets.khoj.dev &#x27;unsafe-inline&#x27; https://fonts.googleapis.com; img-src &#x27;self&#x27; data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src &#x27;self&#x27; https://assets.khoj.dev https://fonts.gstatic.com; child-src &#x27;none&#x27;; object-src &#x27;none&#x27;;"/><title>404: This page could not be found.</title><title>Khoj AI - Home</title><meta name="description" content="Your Second Brain."/><link rel="manifest" href="/static/khoj.webmanifest" crossorigin="use-credentials"/><meta property="og:title" content="Khoj AI - Home"/><meta property="og:description" content="Your Second Brain."/><meta property="og:url" content="https://app.khoj.dev/"/><meta property="og:site_name" content="Khoj AI"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta property="og:image:width" content="256"/><meta property="og:image:height" content="256"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Khoj AI - Home"/><meta name="twitter:description" content="Your Second Brain."/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta name="twitter:image:width" content="256"/><meta name="twitter:image:height" content="256"/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/static/assets/icons/khoj_lantern.ico"/><link rel="apple-touch-icon" href="/static/assets/icons/khoj_lantern_256x256.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_90df87"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-dff708c71e9234cb.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e790e04fd40ad16-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/1538cedb321e3a97.css\",\"style\"]\n3:HL[\"/_next/static/css/b9a6bf04305d98d7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"4:I[95751,[],\"\"]\n6:I[39275,[],\"\"]\n7:I[61343,[],\"\"]\nd:I[76130,[],\"\"]\n8:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n9:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\na:{\"display\":\"inline-block\"}\nb:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\ne:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"CGyts-FEbV6owmPboHtLL\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1538cedb321e3a97.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b9a6bf04305d98d7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"meta\",null,{\"httpEquiv\":\"Content-Security-Policy\",\"content\":\"default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';\"}],[\"$\",\"body\",null,{\"className\":\"__className_90df87\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$9\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$b\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Lc\"],\"globalErrorComponent\":\"$d\",\"missingSlots\":\"$We\"}]\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"link\",\"4\",{\"rel\":\"manifest\",\"href\":\"/static/khoj.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:url\",\"content\":\"https://app.khoj.dev/\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:site_name\",\"content\":\"Khoj AI\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/static/assets/icons/khoj_lantern.ico\"}],[\"$\",\"link\",\"26\",{\"rel\":\"apple-touch-icon\",\"href\":\"/static/assets/icons/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"5:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/0e790e04fd40ad16-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/467a524c75e7d7c0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/b9a6bf04305d98d7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-64dc39af85cd2625.js"/><script src="/_next/static/chunks/fd9d1056-2b978342deb60015.js" async=""></script><script src="/_next/static/chunks/7023-a5bf5744d19b3bd3.js" async=""></script><script src="/_next/static/chunks/main-app-6d6ee3495efe03d4.js" async=""></script><meta name="robots" content="noindex"/><meta http-equiv="Content-Security-Policy" content="default-src &#x27;self&#x27; https://assets.khoj.dev; media-src * blob:; script-src &#x27;self&#x27; https://assets.khoj.dev &#x27;unsafe-inline&#x27; &#x27;unsafe-eval&#x27;; connect-src &#x27;self&#x27; blob: https://ipapi.co/json ws://localhost:42110; style-src &#x27;self&#x27; https://assets.khoj.dev &#x27;unsafe-inline&#x27; https://fonts.googleapis.com; img-src &#x27;self&#x27; data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src &#x27;self&#x27; https://assets.khoj.dev https://fonts.gstatic.com; child-src &#x27;none&#x27;; object-src &#x27;none&#x27;;"/><title>404: This page could not be found.</title><title>Khoj AI - Home</title><meta name="description" content="Your Second Brain."/><link rel="manifest" href="/static/khoj.webmanifest" crossorigin="use-credentials"/><meta property="og:title" content="Khoj AI - Home"/><meta property="og:description" content="Your Second Brain."/><meta property="og:url" content="https://app.khoj.dev/"/><meta property="og:site_name" content="Khoj AI"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta property="og:image:width" content="256"/><meta property="og:image:height" content="256"/><meta property="og:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Khoj AI - Home"/><meta name="twitter:description" content="Your Second Brain."/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_256x256.png"/><meta name="twitter:image:width" content="256"/><meta name="twitter:image:height" content="256"/><meta name="twitter:image" content="https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/static/assets/icons/khoj_lantern.ico"/><link rel="apple-touch-icon" href="/static/assets/icons/khoj_lantern_256x256.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_e594dd"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-64dc39af85cd2625.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/0e790e04fd40ad16-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/467a524c75e7d7c0.css\",\"style\"]\n3:HL[\"/_next/static/css/b9a6bf04305d98d7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"4:I[95751,[],\"\"]\n6:I[39275,[],\"\"]\n7:I[61343,[],\"\"]\nd:I[76130,[],\"\"]\n8:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n9:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\na:{\"display\":\"inline-block\"}\nb:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\ne:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"eim4XajTfG4ub4ft5AEkJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\",\"\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L5\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/467a524c75e7d7c0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/b9a6bf04305d98d7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"meta\",null,{\"httpEquiv\":\"Content-Security-Policy\",\"content\":\"default-src 'self' https://assets.khoj.dev; media-src * blob:; script-src 'self' https://assets.khoj.dev 'unsafe-inline' 'unsafe-eval'; connect-src 'self' blob: https://ipapi.co/json ws://localhost:42110; style-src 'self' https://assets.khoj.dev 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https://*.khoj.dev https://*.googleusercontent.com https://*.google.com/ https://*.gstatic.com; font-src 'self' https://assets.khoj.dev https://fonts.gstatic.com; child-src 'none'; object-src 'none';\"}],[\"$\",\"body\",null,{\"className\":\"__className_e594dd\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$9\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$a\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$b\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Lc\"],\"globalErrorComponent\":\"$d\",\"missingSlots\":\"$We\"}]\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"link\",\"4\",{\"rel\":\"manifest\",\"href\":\"/static/khoj.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:url\",\"content\":\"https://app.khoj.dev/\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:site_name\",\"content\":\"Khoj AI\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Khoj AI - Home\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Your Second Brain.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"256\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"256\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://assets.khoj.dev/khoj_lantern_logomarktype_1200x630.png\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/static/assets/icons/khoj_lantern.ico\"}],[\"$\",\"link\",\"26\",{\"rel\":\"apple-touch-icon\",\"href\":\"/static/assets/icons/khoj_lantern_256x256.png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"5:null\n"])</script></body></html>