diff --git a/apps/browser-extension/entrypoints/content/chatgpt.ts b/apps/browser-extension/entrypoints/content/chatgpt.ts index d7cb9903..51a04736 100644 --- a/apps/browser-extension/entrypoints/content/chatgpt.ts +++ b/apps/browser-extension/entrypoints/content/chatgpt.ts @@ -209,7 +209,6 @@ function addSupermemoryButtonToMemoriesDialog() { if (memoriesDialog.querySelector("#supermemory-save-button")) return - const deleteAllContainer = memoriesDialog.querySelector( ".flex.items-center.gap-0\\.5", ) diff --git a/apps/browser-extension/entrypoints/content/selection-search.ts b/apps/browser-extension/entrypoints/content/selection-search.ts index 6473b84c..57c87188 100644 --- a/apps/browser-extension/entrypoints/content/selection-search.ts +++ b/apps/browser-extension/entrypoints/content/selection-search.ts @@ -4,7 +4,7 @@ import { ELEMENT_IDS, MESSAGE_TYPES, UI_CONFIG } from "../../utils/constants" let currentQuery = "" let fabElement: HTMLElement | null = null let panelElement: HTMLElement | null = null -let selectedResults: Set = new Set() +const selectedResults: Set = new Set() /** * Get the selection rectangle for positioning the FAB diff --git a/apps/browser-extension/entrypoints/content/shared.ts b/apps/browser-extension/entrypoints/content/shared.ts index 428dc0d3..68d117a1 100644 --- a/apps/browser-extension/entrypoints/content/shared.ts +++ b/apps/browser-extension/entrypoints/content/shared.ts @@ -117,7 +117,10 @@ export function setupStorageListener() { } try { - await Promise.all([bearerToken.setValue(token), userData.setValue(user)]) + await Promise.all([ + bearerToken.setValue(token), + userData.setValue(user), + ]) } catch { // Do nothing } diff --git a/apps/browser-extension/entrypoints/content/twitter.ts b/apps/browser-extension/entrypoints/content/twitter.ts index d5328245..57bf6960 100644 --- a/apps/browser-extension/entrypoints/content/twitter.ts +++ b/apps/browser-extension/entrypoints/content/twitter.ts @@ -92,7 +92,6 @@ async function handleAllBookmarksImportClick() { } } - async function showAllBookmarksProjectModal( projects: Array<{ id: string; name: string; containerTag: string }>, ) { diff --git a/apps/browser-extension/utils/storage.ts b/apps/browser-extension/utils/storage.ts index 974b6474..1c3c4860 100644 --- a/apps/browser-extension/utils/storage.ts +++ b/apps/browser-extension/utils/storage.ts @@ -2,7 +2,7 @@ * Centralized storage layer using WXT's built-in storage API */ -import { storage } from '#imports'; +import { storage } from "#imports" import type { Project } from "./types" /** @@ -118,4 +118,3 @@ export async function getTokensLogged(): Promise { export async function setTokensLogged(): Promise { await tokensLogged.setValue(true) } - diff --git a/apps/mcp/src/server.ts b/apps/mcp/src/server.ts index bbcd493e..f5ea5f48 100644 --- a/apps/mcp/src/server.ts +++ b/apps/mcp/src/server.ts @@ -37,7 +37,6 @@ export class SupermemoryMCP extends McpAgent { initPosthog(this.env.POSTHOG_API_KEY) - // Hook MCP McpAgent to capture client info this.server.server.oninitialized = async () => { const clientVersion = this.server.server.getClientVersion() diff --git a/apps/mcp/tsconfig.json b/apps/mcp/tsconfig.json index dead8a5f..576d1175 100644 --- a/apps/mcp/tsconfig.json +++ b/apps/mcp/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "lib": ["ESNext"], - "types": ["@cloudflare/workers-types"], - "jsx": "react-jsx", - "jsxImportSource": "hono/jsx", - "esModuleInterop": true, - "resolveJsonModule": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": ".", - }, - "include": ["src/**/*"], - "exclude": ["node_modules"], + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "skipLibCheck": true, + "lib": ["ESNext"], + "types": ["@cloudflare/workers-types"], + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "esModuleInterop": true, + "resolveJsonModule": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "." + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] } diff --git a/apps/mcp/wrangler.jsonc b/apps/mcp/wrangler.jsonc index 69996dfa..2260493a 100644 --- a/apps/mcp/wrangler.jsonc +++ b/apps/mcp/wrangler.jsonc @@ -9,12 +9,12 @@ "API_URL": "https://api.supermemory.ai" }, "routes": [ - { - "pattern": "mcp.supermemory.ai", - "zone_name": "supermemory.ai", - "custom_domain": true - } - ], + { + "pattern": "mcp.supermemory.ai", + "zone_name": "supermemory.ai", + "custom_domain": true + } + ], "durable_objects": { "bindings": [ { diff --git a/apps/memory-graph-playground/src/app/page.tsx b/apps/memory-graph-playground/src/app/page.tsx index 581557b6..0682905a 100644 --- a/apps/memory-graph-playground/src/app/page.tsx +++ b/apps/memory-graph-playground/src/app/page.tsx @@ -31,7 +31,9 @@ export default function Home() { // State for slideshow const [isSlideshowActive, setIsSlideshowActive] = useState(false) - const [currentSlideshowNode, setCurrentSlideshowNode] = useState(null) + const [currentSlideshowNode, setCurrentSlideshowNode] = useState< + string | null + >(null) const PAGE_SIZE = 500 diff --git a/apps/raycast-extension/src/api.ts b/apps/raycast-extension/src/api.ts index 55672a77..f36d82fb 100644 --- a/apps/raycast-extension/src/api.ts +++ b/apps/raycast-extension/src/api.ts @@ -1,222 +1,222 @@ -import { getPreferenceValues, showToast, Toast } from "@raycast/api"; +import { getPreferenceValues, showToast, Toast } from "@raycast/api" export interface Project { - id: string; - name: string; - containerTag: string; - description?: string; + id: string + name: string + containerTag: string + description?: string } export interface Memory { - id: string; - content: string; - title?: string; - url?: string; - containerTag?: string; - createdAt: string; + id: string + content: string + title?: string + url?: string + containerTag?: string + createdAt: string } export interface SearchResult { - documentId: string; - chunks: unknown[]; - title?: string; - metadata: Record; - score?: number; - createdAt: string; - updatedAt: string; - type: string; + documentId: string + chunks: unknown[] + title?: string + metadata: Record + score?: number + createdAt: string + updatedAt: string + type: string } export interface AddMemoryRequest { - content: string; - containerTags?: string[]; - title?: string; - url?: string; - metadata?: Record; + content: string + containerTags?: string[] + title?: string + url?: string + metadata?: Record } interface AddProjectRequest { - name: string; + name: string } export interface SearchRequest { - q: string; - containerTags?: string[]; - limit?: number; + q: string + containerTags?: string[] + limit?: number } export interface SearchResponse { - results: SearchResult[]; - timing: number; - total: number; + results: SearchResult[] + timing: number + total: number } -const API_BASE_URL = "https://api.supermemory.ai"; +const API_BASE_URL = "https://api.supermemory.ai" class SupermemoryAPIError extends Error { - constructor( - message: string, - public status?: number, - ) { - super(message); - this.name = "SupermemoryAPIError"; - } + constructor( + message: string, + public status?: number, + ) { + super(message) + this.name = "SupermemoryAPIError" + } } class AuthenticationError extends Error { - constructor(message: string) { - super(message); - this.name = "AuthenticationError"; - } + constructor(message: string) { + super(message) + this.name = "AuthenticationError" + } } function getApiKey(): string { - const { apiKey } = getPreferenceValues(); - return apiKey; + const { apiKey } = getPreferenceValues() + return apiKey } async function makeAuthenticatedRequest( - endpoint: string, - options: RequestInit = {}, + endpoint: string, + options: RequestInit = {}, ): Promise { - const apiKey = getApiKey(); + const apiKey = getApiKey() - const url = `${API_BASE_URL}${endpoint}`; + const url = `${API_BASE_URL}${endpoint}` - try { - const response = await fetch(url, { - ...options, - headers: { - Authorization: `Bearer ${apiKey}`, - "Content-Type": "application/json", - ...options.headers, - }, - }); + try { + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Bearer ${apiKey}`, + "Content-Type": "application/json", + ...options.headers, + }, + }) - if (!response.ok) { - if (response.status === 401) { - throw new AuthenticationError( - "Invalid API key. Please check your API key in preferences. Get a new one from https://supermemory.link/raycast", - ); - } + if (!response.ok) { + if (response.status === 401) { + throw new AuthenticationError( + "Invalid API key. Please check your API key in preferences. Get a new one from https://supermemory.link/raycast", + ) + } - let errorMessage = `API request failed: ${response.statusText}`; - try { - const errorBody = (await response.json()) as { message?: string }; - if (errorBody.message) { - errorMessage = errorBody.message; - } - } catch { - // Ignore JSON parsing errors, use default message - } + let errorMessage = `API request failed: ${response.statusText}` + try { + const errorBody = (await response.json()) as { message?: string } + if (errorBody.message) { + errorMessage = errorBody.message + } + } catch { + // Ignore JSON parsing errors, use default message + } - throw new SupermemoryAPIError(errorMessage, response.status); - } + throw new SupermemoryAPIError(errorMessage, response.status) + } - if (!response.headers.get("content-type")?.includes("application/json")) { - throw new SupermemoryAPIError("Invalid response format from API"); - } + if (!response.headers.get("content-type")?.includes("application/json")) { + throw new SupermemoryAPIError("Invalid response format from API") + } - const data = (await response.json()) as T; - return data; - } catch (err) { - if ( - err instanceof AuthenticationError || - err instanceof SupermemoryAPIError - ) { - throw err; - } + const data = (await response.json()) as T + return data + } catch (err) { + if ( + err instanceof AuthenticationError || + err instanceof SupermemoryAPIError + ) { + throw err + } - // Handle network errors or other fetch errors - throw new SupermemoryAPIError( - `Network error: ${err instanceof Error ? err.message : "Unknown error"}`, - ); - } + // Handle network errors or other fetch errors + throw new SupermemoryAPIError( + `Network error: ${err instanceof Error ? err.message : "Unknown error"}`, + ) + } } export async function fetchProjects(): Promise { - try { - const response = await makeAuthenticatedRequest<{ projects: Project[] }>( - "/v3/projects", - ); - return response.projects || []; - } catch (error) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to fetch projects", - message: - error instanceof Error ? error.message : "Unknown error occurred", - }); - throw error; - } + try { + const response = await makeAuthenticatedRequest<{ projects: Project[] }>( + "/v3/projects", + ) + return response.projects || [] + } catch (error) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to fetch projects", + message: + error instanceof Error ? error.message : "Unknown error occurred", + }) + throw error + } } export async function addProject(request: AddProjectRequest): Promise { - const response = await makeAuthenticatedRequest("/v3/projects", { - method: "POST", - body: JSON.stringify(request), - }); + const response = await makeAuthenticatedRequest("/v3/projects", { + method: "POST", + body: JSON.stringify(request), + }) - await showToast({ - style: Toast.Style.Success, - title: "Project Added", - message: "Successfully added project to Supermemory", - }); + await showToast({ + style: Toast.Style.Success, + title: "Project Added", + message: "Successfully added project to Supermemory", + }) - return response; + return response } export async function addMemory(request: AddMemoryRequest): Promise { - try { - const response = await makeAuthenticatedRequest("/v3/documents", { - method: "POST", - body: JSON.stringify(request), - }); + try { + const response = await makeAuthenticatedRequest("/v3/documents", { + method: "POST", + body: JSON.stringify(request), + }) - await showToast({ - style: Toast.Style.Success, - title: "Memory Added", - message: "Successfully added memory to Supermemory", - }); + await showToast({ + style: Toast.Style.Success, + title: "Memory Added", + message: "Successfully added memory to Supermemory", + }) - return response; - } catch (error) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to add memory", - message: - error instanceof Error ? error.message : "Unknown error occurred", - }); - throw error; - } + return response + } catch (error) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to add memory", + message: + error instanceof Error ? error.message : "Unknown error occurred", + }) + throw error + } } export async function searchMemories( - request: SearchRequest, + request: SearchRequest, ): Promise { - try { - const response = await makeAuthenticatedRequest( - "/v3/search", - { - method: "POST", - body: JSON.stringify(request), - }, - ); + try { + const response = await makeAuthenticatedRequest( + "/v3/search", + { + method: "POST", + body: JSON.stringify(request), + }, + ) - return response.results || []; - } catch (error) { - await showToast({ - style: Toast.Style.Failure, - title: "Failed to search memories", - message: - error instanceof Error ? error.message : "Unknown error occurred", - }); - throw error; - } + return response.results || [] + } catch (error) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to search memories", + message: + error instanceof Error ? error.message : "Unknown error occurred", + }) + throw error + } } // Helper function to check if API key is configured and valid export async function fetchSettings(): Promise { - const response = await makeAuthenticatedRequest("/v3/settings"); - return response; + const response = await makeAuthenticatedRequest("/v3/settings") + return response } diff --git a/apps/raycast-extension/src/search-projects.tsx b/apps/raycast-extension/src/search-projects.tsx index bacd8537..02b423d5 100644 --- a/apps/raycast-extension/src/search-projects.tsx +++ b/apps/raycast-extension/src/search-projects.tsx @@ -1,106 +1,106 @@ import { - ActionPanel, - List, - Action, - Icon, - Form, - useNavigation, -} from "@raycast/api"; -import { useState } from "react"; -import { fetchProjects, addProject } from "./api"; + ActionPanel, + List, + Action, + Icon, + Form, + useNavigation, +} from "@raycast/api" +import { useState } from "react" +import { fetchProjects, addProject } from "./api" import { - FormValidation, - showFailureToast, - useCachedPromise, - useForm, -} from "@raycast/utils"; -import { withSupermemory } from "./withSupermemory"; + FormValidation, + showFailureToast, + useCachedPromise, + useForm, +} from "@raycast/utils" +import { withSupermemory } from "./withSupermemory" -export default withSupermemory(Command); +export default withSupermemory(Command) function Command() { - const { isLoading, data: projects, mutate } = useCachedPromise(fetchProjects); + const { isLoading, data: projects, mutate } = useCachedPromise(fetchProjects) - return ( - - {!isLoading && !projects?.length ? ( - - } - onPop={mutate} - /> - - } - /> - ) : ( - projects?.map((project) => ( - - } - onPop={mutate} - /> - - } - /> - )) - )} - - ); + return ( + + {!isLoading && !projects?.length ? ( + + } + onPop={mutate} + /> + + } + /> + ) : ( + projects?.map((project) => ( + + } + onPop={mutate} + /> + + } + /> + )) + )} + + ) } function CreateProject() { - const { pop } = useNavigation(); - const [isLoading, setIsLoading] = useState(false); - const { handleSubmit, itemProps } = useForm<{ name: string }>({ - async onSubmit(values) { - setIsLoading(true); - try { - await addProject(values); - pop(); - } catch (error) { - await showFailureToast(error, { title: "Failed to add project" }); - } finally { - setIsLoading(false); - } - }, - validation: { - name: FormValidation.Required, - }, - }); - return ( -
- - - } - > - - - ); + const { pop } = useNavigation() + const [isLoading, setIsLoading] = useState(false) + const { handleSubmit, itemProps } = useForm<{ name: string }>({ + async onSubmit(values) { + setIsLoading(true) + try { + await addProject(values) + pop() + } catch (error) { + await showFailureToast(error, { title: "Failed to add project" }) + } finally { + setIsLoading(false) + } + }, + validation: { + name: FormValidation.Required, + }, + }) + return ( +
+ + + } + > + + + ) } diff --git a/apps/raycast-extension/src/withSupermemory.tsx b/apps/raycast-extension/src/withSupermemory.tsx index 13c1d7b8..9c789751 100644 --- a/apps/raycast-extension/src/withSupermemory.tsx +++ b/apps/raycast-extension/src/withSupermemory.tsx @@ -1,48 +1,48 @@ -import { usePromise } from "@raycast/utils"; -import { fetchSettings } from "./api"; +import { usePromise } from "@raycast/utils" +import { fetchSettings } from "./api" import { - Action, - ActionPanel, - Detail, - Icon, - List, - openExtensionPreferences, -} from "@raycast/api"; -import { ComponentType } from "react"; + Action, + ActionPanel, + Detail, + Icon, + List, + openExtensionPreferences, +} from "@raycast/api" +import type { ComponentType } from "react" export function withSupermemory

(Component: ComponentType

) { - return function SupermemoryWrappedComponent(props: P) { - const { isLoading, data } = usePromise(fetchSettings, [], { - failureToastOptions: { - title: "Invalid API Key", - message: - "Invalid API key. Please check your API key in preferences. Get a new one from https://supermemory.link/raycast", - }, - }); + return function SupermemoryWrappedComponent(props: P) { + const { isLoading, data } = usePromise(fetchSettings, [], { + failureToastOptions: { + title: "Invalid API Key", + message: + "Invalid API key. Please check your API key in preferences. Get a new one from https://supermemory.link/raycast", + }, + }) - if (!data) { - return isLoading ? ( - - ) : ( - - - - - } - /> - - ); - } + if (!data) { + return isLoading ? ( + + ) : ( + + + + + } + /> + + ) + } - return ; - }; + return + } } diff --git a/apps/raycast-extension/tsconfig.json b/apps/raycast-extension/tsconfig.json index d33dd46c..cbf072b5 100644 --- a/apps/raycast-extension/tsconfig.json +++ b/apps/raycast-extension/tsconfig.json @@ -1,16 +1,16 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "include": ["src/**/*", "raycast-env.d.ts"], - "compilerOptions": { - "lib": ["ES2023"], - "module": "commonjs", - "target": "ES2023", - "strict": true, - "isolatedModules": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "jsx": "react-jsx", - "resolveJsonModule": true - } + "$schema": "https://json.schemastore.org/tsconfig", + "include": ["src/**/*", "raycast-env.d.ts"], + "compilerOptions": { + "lib": ["ES2023"], + "module": "commonjs", + "target": "ES2023", + "strict": true, + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "resolveJsonModule": true + } } diff --git a/apps/web/.env.example b/apps/web/.env.example index 969d7377..537186ae 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1,2 +1,2 @@ NEXT_PUBLIC_BACKEND_URL=https://api.supermemory.ai -NEXT_PUBLIC_POSTHOG_KEY= \ No newline at end of file +NEXT_PUBLIC_POSTHOG_KEY= diff --git a/apps/web/app/(navigation)/graph/page.tsx b/apps/web/app/(navigation)/graph/page.tsx new file mode 100644 index 00000000..a1159c53 --- /dev/null +++ b/apps/web/app/(navigation)/graph/page.tsx @@ -0,0 +1,56 @@ +"use client" + +import { useAuth } from "@lib/auth-context" +import { LoaderIcon } from "lucide-react" +import { Graph } from "@/components/graph" +import { useProject } from "@/stores" +import { AddMemoryView } from "@/components/views/add-memory" +import { useState } from "react" + +export default function GraphPage() { + const { user } = useAuth() + const { selectedProject } = useProject() + const [showAddMemory, setShowAddMemory] = useState(false) + + if (!user) { + return ( +

+
+ +

Loading...

+
+
+ ) + } + + const containerTags = + selectedProject && selectedProject !== "sm_project_default" + ? [selectedProject] + : undefined + + return ( +
+ +
+
+

No memories found

+ +
+
+
+ + {showAddMemory && ( + setShowAddMemory(false)} + /> + )} +
+ ) +} diff --git a/apps/web/app/(navigation)/layout.tsx b/apps/web/app/(navigation)/layout.tsx index 7b7628bb..18348e46 100644 --- a/apps/web/app/(navigation)/layout.tsx +++ b/apps/web/app/(navigation)/layout.tsx @@ -46,7 +46,7 @@ export default function NavigationLayout({
setShowAddMemoryView(true)} />
-
{children}
+
{children}
{showAddMemoryView && ( ) -} \ No newline at end of file +} diff --git a/apps/web/app/(navigation)/settings/integrations/page.tsx b/apps/web/app/(navigation)/settings/integrations/page.tsx index 7fedd143..d2ad2900 100644 --- a/apps/web/app/(navigation)/settings/integrations/page.tsx +++ b/apps/web/app/(navigation)/settings/integrations/page.tsx @@ -7,4 +7,4 @@ export default function IntegrationsPage() { ) -} \ No newline at end of file +} diff --git a/apps/web/app/(navigation)/settings/page.tsx b/apps/web/app/(navigation)/settings/page.tsx index c9046fba..1f806e71 100644 --- a/apps/web/app/(navigation)/settings/page.tsx +++ b/apps/web/app/(navigation)/settings/page.tsx @@ -9,4 +9,4 @@ export default function ProfilePage() { ) -} \ No newline at end of file +} diff --git a/apps/web/app/api/emails/welcome/route.tsx b/apps/web/app/api/emails/welcome/route.tsx index 48883d6b..d8f6c59f 100644 --- a/apps/web/app/api/emails/welcome/route.tsx +++ b/apps/web/app/api/emails/welcome/route.tsx @@ -1,5 +1,5 @@ /** biome-ignore-all lint/performance/noImgElement: Not Next.js environment */ -import { ImageResponse } from "next/og"; +import { ImageResponse } from "next/og" export async function GET() { return new ImageResponse( @@ -15,5 +15,5 @@ export async function GET() { width: 1200, height: 630, }, - ); + ) } diff --git a/apps/web/app/manifest.ts b/apps/web/app/manifest.ts index 9077d287..01381381 100644 --- a/apps/web/app/manifest.ts +++ b/apps/web/app/manifest.ts @@ -1,4 +1,4 @@ -import type { MetadataRoute } from "next"; +import type { MetadataRoute } from "next" export default function manifest(): MetadataRoute.Manifest { return { @@ -16,5 +16,5 @@ export default function manifest(): MetadataRoute.Manifest { type: "image/png", }, ], - }; + } } diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx index d37d1e7c..98cf6b58 100644 --- a/apps/web/app/not-found.tsx +++ b/apps/web/app/not-found.tsx @@ -1,20 +1,20 @@ -"use client"; // Error boundaries must be Client Components +"use client" // Error boundaries must be Client Components -import { Button } from "@ui/components/button"; -import { Title1Bold } from "@ui/text/title/title-1-bold"; -import { useRouter } from "next/navigation"; -import { useEffect } from "react"; +import { Button } from "@ui/components/button" +import { Title1Bold } from "@ui/text/title/title-1-bold" +import { useRouter } from "next/navigation" +import { useEffect } from "react" export default function NotFound({ error, }: { - error: Error & { digest?: string }; + error: Error & { digest?: string } }) { - const router = useRouter(); + const router = useRouter() useEffect(() => { // Log the error to an error reporting service - console.error(error); - }, [error]); + console.error(error) + }, [error]) return ( @@ -23,5 +23,5 @@ export default function NotFound({ - ); + ) } diff --git a/apps/web/app/onboarding-old/bio-form.tsx b/apps/web/app/onboarding-old/bio-form.tsx index 97be3d9e..b9082535 100644 --- a/apps/web/app/onboarding-old/bio-form.tsx +++ b/apps/web/app/onboarding-old/bio-form.tsx @@ -81,7 +81,8 @@ export function BioForm() { Tell Supermemory about yourself

- share with Supermemory what you do, who you are, and what you're interested in + share with Supermemory what you do, who you are, and what you're + interested in