Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ntrp

**ntrp** is entropy – the measure of disorder in a system. Your calendar, emails, notes, browser tabs, half-remembered conversations – it all accumulates. This project exists to reduce it.
**ntrp** is entropy – the measure of disorder in a system. Your calendar, emails, notes, half-remembered conversations – it all accumulates. This project exists to reduce it.

I built this for myself. ADHD and scattered attention meant I kept losing track of things (e.g. what I said, what I planned, what I was supposed to follow up on). So I made an assistant that hooks into my stuff and actually remembers.

Expand All @@ -11,7 +11,7 @@ I built this for myself. ADHD and scattered attention meant I kept losing track

- **Persistent memory**: learns facts and patterns across conversations, consolidates them over time
- **Scheduled tasks**: morning briefings, daily reviews, health tracking – runs autonomously on a schedule
- **Connected sources**: Obsidian vault, Gmail, Google Calendar, browser history, web search (so far)
- **Connected sources**: Obsidian vault, Gmail, Google Calendar, web search (so far)
- **Shell access**: runs commands, manages files, sends emails
- **Any LLM**: Claude, GPT, Gemini built-in; OpenRouter, Ollama, vLLM, or any OpenAI-compatible endpoint via custom models

Expand Down
3 changes: 1 addition & 2 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@
"integrations/models",
"integrations/gmail",
"integrations/calendar",
"integrations/obsidian",
"integrations/browser"
"integrations/obsidian"
]
},
{
Expand Down
3 changes: 1 addition & 2 deletions docs/guides/tools.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,12 @@ Requires Google Calendar to be connected.

## Web

Web search uses `WEB_SEARCH` mode (`auto`, `exa`, `ddgs`, `none`). `EXA_API_KEY` is only required when mode resolves to Exa. Browser requires `NTRP_BROWSER` to be set.
Web search uses `WEB_SEARCH` mode (`auto`, `exa`, `ddgs`, `none`). `EXA_API_KEY` is only required when mode resolves to Exa.

| Tool | Description | Approval |
|------|-------------|----------|
| `web_search` | Search the web | — |
| `web_fetch` | Fetch content from a URL | — |
| `browser` | Search browser history | — |

## Automations

Expand Down
2 changes: 1 addition & 1 deletion docs/guides/tui.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ Settings are organized into these sections:
|---------|-------------|
| **Connection** | Server address, token streaming toggle |
| **API Keys** | Model provider credentials (Claude, OpenAI, Gemini) |
| **Sources** | Data source toggles (vault, Google, browser, web search) |
| **Sources** | Data source toggles (vault, Google, web search) |
| **Memory** | Consolidation interval, dream generation |
| **Instructions** | System prompt and directives |
| **Context** | Compression thresholds, message limits, summary tokens |
Expand Down
36 changes: 0 additions & 36 deletions docs/integrations/browser.mdx

This file was deleted.

13 changes: 0 additions & 13 deletions ntrp-ui/src/api/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export interface SourceInfo {
error?: string;
accounts?: string[];
path?: string;
type?: string;
mode?: "auto" | "exa" | "ddgs" | "none";
provider?: "exa" | "ddgs" | "none" | "unknown";
dreams?: boolean;
Expand All @@ -21,9 +20,7 @@ export interface ServerConfig {
web_search: "auto" | "exa" | "ddgs" | "none";
web_search_provider: "exa" | "ddgs" | "none" | "unknown";
vault_path: string;
browser: string | null;
google_enabled: boolean;
has_browser: boolean;
has_notes: boolean;
max_depth: number;
compression_threshold: number;
Expand Down Expand Up @@ -95,16 +92,6 @@ export async function updateVaultPath(
return api.patch(`${config.serverUrl}/config`, { vault_path: vaultPath });
}

export async function updateBrowser(
config: Config,
browser: string | null,
browserDays?: number
): Promise<{ browser: string | null; browser_days?: number }> {
const body: { browser: string | null; browser_days?: number } = { browser };
if (browserDays !== undefined) body.browser_days = browserDays;
return api.patch(`${config.serverUrl}/config`, body);
}

export async function getDirectives(config: Config): Promise<{ content: string }> {
return api.get<{ content: string }>(`${config.serverUrl}/directives`);
}
Expand Down
20 changes: 0 additions & 20 deletions ntrp-ui/src/components/dialogs/settings/SettingsDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { Dialog, colors, Hints } from "../../ui/index.js";
import { useAccentColor } from "../../../hooks/index.js";
import type { ServerConfig } from "../../../api/client.js";
import { SectionId, SECTION_IDS, SECTION_LABELS } from "./config.js";
import { DialogSelect, type SelectOption } from "../../ui/index.js";
import {
ConnectionSection, ApiKeysSection, SourcesSection, MemorySection,
DirectivesSection, ContextSection, AgentSection,
Expand Down Expand Up @@ -59,25 +58,6 @@ export function SettingsDialog({
onClose,
});

const browserOptions: SelectOption<string | null>[] = [
{ value: "chrome", title: "Chrome", indicator: serverConfig?.browser === "chrome" ? "●" : undefined },
{ value: "safari", title: "Safari", indicator: serverConfig?.browser === "safari" ? "●" : undefined },
{ value: "arc", title: "Arc", indicator: serverConfig?.browser === "arc" ? "●" : undefined },
{ value: null, title: "None (disable)", indicator: serverConfig?.browser == null ? "●" : undefined },
];

if (state.sources.showingBrowserDropdown) {
return (
<DialogSelect<string | null>
title="Browser"
options={browserOptions}
initialIndex={Math.max(0, browserOptions.findIndex(o => o.value === (serverConfig?.browser || null)))}
onSelect={(opt) => state.sources.handleSelectBrowser(opt.value)}
onClose={() => state.sources.setShowingBrowserDropdown(false)}
/>
);
}

const footerHints = !drilled
? [["↑↓", "section"], ["enter", "open"], ["esc", "close"]] as [string, string][]
: getSectionHints(activeSection, state, serverConfig);
Expand Down
3 changes: 1 addition & 2 deletions ntrp-ui/src/components/dialogs/settings/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,12 @@ export const MEMORY_NUMBER_ITEMS: NumberItem[] = [
{ key: "consolidationInterval", label: "Interval", description: "Minutes between consolidation runs", min: 5, max: 120, step: 5 },
];

export const SOURCE_ITEMS = ["vault", "google", "browser", "web"] as const;
export const SOURCE_ITEMS = ["vault", "google", "web"] as const;
export type SourceItem = (typeof SOURCE_ITEMS)[number];

export const SOURCE_LABELS = {
vault: "Notes",
google: "Google",
browser: "Browser",
web: "Web Search",
} satisfies Record<SourceItem, string>;

Expand Down
3 changes: 0 additions & 3 deletions ntrp-ui/src/components/dialogs/settings/sectionHints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,6 @@ function getSourcesHints(state: UseSettingsStateResult, serverConfig: ServerConf
}
return [["↑↓", "navigate"], ["enter", "enable"], ["esc", "back"]];
}
if (item === "browser") {
return [["↑↓", "navigate"], ["enter", "change browser"], ["esc", "back"]];
}
if (item === "web") {
return [["↑↓", "navigate"], ["←→", "change mode"], ["esc", "back"]];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,6 @@ export function SourcesSection({ sources: c, serverConfig, accent, width }: Sour
<AccountList accounts={c.googleAccounts} selectedIndex={c.selectedGoogleIndex} accent={accent} valueWidth={valueWidth} />
)}

<Row item="browser" selected={c.sourceItem === "browser"} accent={accent}>
{c.updatingBrowser ? (
<text><span fg={colors.status.warning}>Updating...</span></text>
) : serverConfig?.has_browser ? (
<text><span fg={colors.text.primary}>{serverConfig.browser}</span></text>
) : (
<text><span fg={colors.text.muted}>Not configured</span></text>
)}
</Row>
{c.browserError && (
<box marginLeft={4}>
<text><span fg={colors.status.error}>{c.browserError}</span></text>
</box>
)}

<Row item="web" selected={c.sourceItem === "web"} accent={accent}>
<text>
{c.sourceItem === "web" && <span fg={colors.text.muted}>◂ </span>}
Expand Down
1 change: 0 additions & 1 deletion ntrp-ui/src/components/sidebar/SourcesSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ function getSourceEntries(cfg: ServerConfig): SourceEntry[] {
return [
{ key: "vault", label: "notes", on: !!cfg.has_notes },
{ key: "google", label: "google", on: !!sources?.google?.enabled && !!sources?.google?.connected, error: !!sources?.google?.error },
{ key: "browser", label: "browser", on: !!cfg.has_browser },
{ key: "memory", label: "memory", on: !!sources?.memory?.enabled },
{ key: "web", label: "web", on: !!sources?.web?.connected },
];
Expand Down
34 changes: 0 additions & 34 deletions ntrp-ui/src/hooks/settings/useConnections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
addGoogleAccount,
removeGoogleAccount,
updateConfig,
updateBrowser,
getServerConfig,
} from "../../api/client.js";
import type { SourceItem } from "../../components/dialogs/settings/config.js";
Expand All @@ -22,12 +21,6 @@ export interface UseConnectionsResult {

vault: UseVaultPathResult;

showingBrowserDropdown: boolean;
setShowingBrowserDropdown: React.Dispatch<React.SetStateAction<boolean>>;
updatingBrowser: boolean;
browserError: string | null;
handleSelectBrowser: (browser: string | null) => Promise<void>;

handleKeypress: (key: Key) => void;
isEditing: boolean;
cancelEdit: () => void;
Expand All @@ -45,10 +38,6 @@ export function useConnections(
const [selectedGoogleIndex, setSelectedGoogleIndex] = useState(0);
const [actionInProgress, setActionInProgress] = useState<string | null>(null);

const [showingBrowserDropdown, setShowingBrowserDropdown] = useState(false);
const [updatingBrowser, setUpdatingBrowser] = useState(false);
const [browserError, setBrowserError] = useState<string | null>(null);

useEffect(() => {
getGoogleAccounts(config)
.then((result) => setGoogleAccounts(result.accounts))
Expand Down Expand Up @@ -123,22 +112,6 @@ export function useConnections(
}
}, [config, serverConfig, onServerConfigChange]);

const handleSelectBrowser = useCallback(async (browser: string | null) => {
setShowingBrowserDropdown(false);
if (browser === serverConfig?.browser) return;
setBrowserError(null);
setUpdatingBrowser(true);
try {
await updateBrowser(config, browser);
const updatedConfig = await getServerConfig(config);
onServerConfigChange(updatedConfig);
} catch (err) {
setBrowserError(err instanceof Error ? err.message : "Failed to update browser");
} finally {
setUpdatingBrowser(false);
}
}, [config, serverConfig?.browser, onServerConfigChange]);

const isEditing = vault.editingVault;
const cancelEdit = vault.handleCancelVaultEdit;

Expand Down Expand Up @@ -176,8 +149,6 @@ export function useConnections(
} else if (key.name === "return" || key.name === "space") {
if (sourceItem === "vault") {
vault.handleStartVaultEdit();
} else if (sourceItem === "browser") {
setShowingBrowserDropdown(true);
} else if (TOGGLEABLE_SOURCES.includes(sourceItem)) {
handleToggleSource(sourceItem);
}
Expand All @@ -202,11 +173,6 @@ export function useConnections(
selectedGoogleIndex,
actionInProgress,
vault,
showingBrowserDropdown,
setShowingBrowserDropdown,
updatingBrowser,
browserError,
handleSelectBrowser,
handleKeypress,
isEditing,
cancelEdit,
Expand Down
20 changes: 0 additions & 20 deletions ntrp/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@
"research_model",
"memory_model",
"embedding_model",
"browser",
"browser_days",
"vault_path",
"memory",
"dreams",
Expand Down Expand Up @@ -111,10 +109,6 @@ class Config(BaseSettings):
# Obsidian vault
vault_path: Path | None = None

# Browser history
browser: str | None = None
browser_days: int = 30

# MCP servers
mcp_servers: dict[str, dict] | None = None

Expand Down Expand Up @@ -193,13 +187,6 @@ def _validate_embedding_model(cls, v: str | None) -> str | None:
return None
return v

@field_validator("browser", mode="before")
@classmethod
def _normalize_browser(cls, v: str | None) -> str | None:
if v in ("", "none"):
return None
return v

@field_validator("web_search", mode="before")
@classmethod
def _normalize_web_search(cls, v: str | None) -> str:
Expand All @@ -212,13 +199,6 @@ def _normalize_web_search(cls, v: str | None) -> str:
return normalized
raise ValueError("web_search must be one of: auto, exa, ddgs, none")

@field_validator("browser_days")
@classmethod
def _validate_browser_days(cls, v: int) -> int:
if not 1 <= v <= 365:
raise ValueError(f"browser_days must be 1-365, got {v}")
return v

# --- Derived properties ---

@property
Expand Down
2 changes: 0 additions & 2 deletions ntrp/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,9 @@

# --- Display Truncation ---

BROWSER_TITLE_TRUNCATE = 50
EMAIL_SUBJECT_TRUNCATE = 40
EMAIL_FROM_TRUNCATE = 30
SNIPPET_TRUNCATE = 120
URL_TRUNCATE = 60


# --- Chat Extraction ---
Expand Down
Loading
Loading