An AI-native, RAM-efficient browser built on Electron + React + TS.
Developed for absolutely no purpose.
kitsune/
βββ src/
β βββ main/ # Electron main process (Node.js)
β β βββ index.ts # App bootstrap, window creation
β β βββ preload.ts # Secure contextBridge (IPC surface)
β β βββ services/
β β β βββ TabManager.ts # BrowserView pool, tab lifecycle
β β β βββ HibernationScheduler.ts # Background RAM manager
β β β βββ PrivacyEngine.ts # Tracker/ad blocking, fingerprint guard
β β β βββ AIService.ts # Anthropic SDK: summaries, chat, clustering
β β β βββ WorkspaceManager.ts # Workspaces + tab groups
β β β βββ CleaveManager.ts # Split-pane layout tree
β β β βββ CommandEngine.ts # Macro/alias/program/scheduled command system
β β β βββ CommandExecutorImpl.ts # All executable command implementations
β β β βββ SettingsStore.ts # electron-store backed persistent settings
β β βββ ipc/
β β βββ tabIPC.ts # Tab lifecycle handlers
β β βββ aiIPC.ts # AI feature handlers
β β βββ privacyIPC.ts # Privacy report handlers
β β βββ workspaceIPC.ts # Workspace + group handlers
β β βββ cleaveIPC.ts # Layout handlers
β β βββ commandIPC.ts # Command engine handlers
β β βββ settingsIPC.ts # Settings read/write handlers
β β
β βββ renderer/ # React renderer process
β β βββ App.tsx # Root component, hotkey wiring
β β βββ main.tsx # ReactDOM entry
β β βββ lib/
β β β βββ ipc.ts # Typed IPC client (window.kitsune)
β β βββ stores/
β β β βββ browserStore.ts # Zustand store β all renderer state
β β βββ styles/
β β β βββ tokens.css # Design system CSS custom properties
β β β βββ global.css # Resets, animations, utilities
β β β βββ lenses.css # Per-lens CSS overrides
β β βββ components/
β β βββ Sidebar/ # Vertical tab list, workspaces, groups
β β β βββ Sidebar.tsx
β β β βββ TabItem.tsx # Single tab row with badges, close btn
β β β βββ TabGroupHeader.tsx
β β βββ Navbar/ # URL bar, nav buttons, security badge
β β β βββ Navbar.tsx
β β βββ LensBar/ # Lens profile switcher
β β β βββ LensBar.tsx
β β βββ ContentArea/ # WebView bounds + NewTabPage
β β β βββ ContentArea.tsx
β β β βββ NewTabPage.tsx
β β βββ AIPanel/ # AI sidebar: summary/research/notes/tasks/chat
β β β βββ AIPanel.tsx
β β βββ CommandPalette/ # βK fuzzy command & tab search
β β β βββ CommandPalette.tsx
β β βββ CommandREPL/ # β` programmable browser console
β β β βββ CommandREPL.tsx
β β βββ MacroEditor/ # Macro/alias/program/scheduler UI
β β β βββ MacroEditor.tsx
β β βββ Cleave/ # β\ split-pane layout manager
β β β βββ CleaveOverlay.tsx
β β βββ Settings/ # Full settings modal
β β β βββ SettingsModal.tsx
β β βββ StatusBar/ # Memory, tab count, AI, risk
β β β βββ StatusBar.tsx
β β βββ HotkeyBar/ # Always-visible hotkey reference
β β βββ HotkeyBar.tsx
β β
β βββ shared/ # Isomorphic β used by both processes
β βββ types.ts # All TypeScript types and interfaces
β βββ commandTypes.ts # Command catalog types
β βββ constants.ts # App-wide constants
β
βββ index.html # Vite HTML entry point
βββ vite.config.ts # Vite + Electron plugin config
βββ tsconfig.json
βββ package.json
| Layer | Technology | Why |
|---|---|---|
| Runtime | Electron 31 | Chromium engine, cross-platform, BrowserView API |
| UI Framework | React 18 + TypeScript | Component model, concurrent rendering |
| Build | Vite 5 + vite-plugin-electron | Fast HMR, ESM, tree-shaking |
| State | Zustand + Immer | Minimal, fast, no boilerplate |
| AI | HackClub AI proxy (OpenAI-compatible) | Free, no account, frontier models |
| Persistence | electron-store | Typed, schema-validated settings |
| Styling | CSS Modules + custom properties | Zero runtime, scoped, themeable |
- BrowserView pool β each tab is a real Chromium
BrowserView, not an iframe - Hibernation Scheduler β background timer checks idle time every 30s; discards webContents to free RAM while preserving tab state
- Memory pressure mode β if total tab memory exceeds threshold, hibernation threshold halves
- Wake on activate β tabs reload transparently when clicked
- Tab groups β color-coded, collapsible; AI-managed groups tagged with
β¦ - Resizable sidebar β drag the right edge to resize; snaps to icon-rail mode at minimum width, persisted across sessions
- Page Summarizer β auto-triggers on page load; returns key points, stats, and reference links as structured JSON
- Cross-page Research β synthesizes N open tabs into a single cited document
- Chat β full conversation with page context injected; streaming-ready API
- Task Extractor β parses highlighted text into structured to-dos
- Tab Clusterer β asks AI to group all open tabs into labelled categories
- Pre-load Risk Scorer β URL-only heuristic before navigation
See the full REPL documentation below.
- Request filter β
session.webRequest.onBeforeRequestintercepts all network requests - Domain blocklist β seeded with common trackers; designed to fetch EasyList/uBlock at startup
- AI heuristic patterns β regex matching for novel trackers not on any list
- Fingerprint guard β
Permissions-Policyheaders; canvas/WebGL injection points wired - Per-tab block reports β track what was blocked per tab for the UI shield badge
- Split modes: horizontal, vertical, AI-beside, triple, by-workspace, by-group
- PaneNode tree β recursive layout structure; serialize/deserialize for persistence
- Preview SVGs β every mode has a visual diagram before you apply it
- Hotkey-driven β full keyboard support, single key per split mode
- 5 built-in lenses: Default, Research, Coding, Reading, Creative
- Each lens sets: accent color, default AI tab, reader mode, font override
- CSS-based overrides β zero JS overhead at runtime
- Custom lens creation scaffolded (UI in Settings, creation flow TBD)
- Fuzzy search across: commands, open tabs, lens profiles, AI actions
- Keyboard navigation: ββ to move, β΅ to execute, esc to dismiss
- Grouped by category with hotkey hints
Open with **β** (or Ctrl+Shift+;`). Kitsune ships a full programmable console β think Neovim's command mode but for your browser. Every browser action is a typed command you can invoke, automate, and chain.
| Method | Shortcut |
|---|---|
| Keyboard | β\`` / Ctrl+`` |
| Keyboard (alt) | ββ§; / Ctrl+Shift+; |
| Settings β Macros | Click "open REPL" link |
Commands follow a simple command.subcommand key=value format:
tab.create url=https://github.com
tab.openMany urls=https://a.com,https://b.com delay=300
ai.chat message="Summarize this page"
lens.set research
memory.hibernate.threshold minutes=5
system.volume.set 50
js.eval code="document.title"
Positional arguments also work for simple commands:
workspace.switch research
tab.closeMatching pattern=stackoverflow
Aliases expand short strings into full commands before execution. Several are seeded by default:
| Alias | Expands to |
|---|---|
:nt |
tab.create url=kitsune://newtab |
:ct |
tab.close |
:hi |
tab.hibernateAll |
:ai |
ai.panel.toggle |
:rw |
workspace.program research-workspace |
:fs |
ui.fileSearch |
:cp |
ui.commandPalette |
Create your own:
alias :gh tab.create url=https://github.com
alias :morning macro run morning-session
Tabs β tab.create, tab.close, tab.restore, tab.navigate, tab.activate, tab.hibernate, tab.hibernateAll, tab.wake, tab.wakeAll, tab.list, tab.reload, tab.reloadAll, tab.pin, tab.unpin, tab.duplicate, tab.openMany, tab.closeMatching, tab.focusMatching, tab.memory, tab.goBack, tab.goForward
Workspaces β workspace.create, workspace.switch, workspace.list, workspace.program, workspace.closeAll, group.create, group.delete, group.aiCluster
AI β ai.summarize, ai.chat, ai.cluster, ai.riskScore, ai.extractTasks, ai.panel.toggle, ai.panel.open, ai.panel.close, ai.panel.tab
Lenses β lens.set, lens.restore, lens.list
Privacy β privacy.report, privacy.blocklist, privacy.enable, privacy.disable
Memory β memory.report, memory.save, memory.threshold.set, memory.hibernate.threshold
System (OS-level) β system.volume.set, system.volume.mute, system.volume.unmute, system.notify, system.app.focus, system.screenshot, system.exec, system.idle
UI β ui.commandPalette, ui.settings, ui.fileSearch, ui.cleave, ui.focusUrlBar, ui.zoom.in, ui.zoom.out, ui.zoom.reset, ui.fullscreen, ui.sidebar.toggle, ui.readingMode
Page / JS β js.eval, js.inject, page.scroll, page.scrollTop, page.scrollBottom, page.getText, page.getTitle, page.getUrl, page.click, page.find
Settings β settings.set, settings.get, settings.reset, settings.theme, settings.ai.toggle
Chain multiple commands together into a single execution:
chain
tab.create url=https://google.com
tab.create url=https://github.com
ai.panel.open
lens.set research
:run
Type :cancel to abort a chain in progress.
You can also run chains directly from the IPC layer:
CommandIPC.runChain([
'tab.create url=https://news.ycombinator.com',
'ai.summarize',
])Macros are named sequences of commands that can be saved, edited, and run by name or alias. They support per-step delays, conditions, and error handling.
Running a macro:
macro run morning-session
:morning β via alias
Built-in macros:
| Name | Alias | What it does |
|---|---|---|
morning-session |
:morning |
Opens email, calendar, HN, AI panel |
hibernate-and-save |
:save |
Hibernates background tabs, shows memory report |
ai-research-mode |
:research |
Switches to Research lens, opens AI panel on Research tab |
Creating a macro β open Settings β Macros & Automation, click "+ New Macro", and write steps one per line in command syntax. Or use the REPL sidebar's Macros tab to run, edit, and delete them.
Programs open a curated set of tabs in a new or existing workspace, optionally with pre-defined groups and AI clustering after load.
workspace.program research-workspace
workspace.program dev-workspace
Built-in programs:
research-workspace β creates a "Research" workspace with Scholar, Semantic Scholar, arXiv, Connected Papers, and a scratch tab. AI-clusters after load.
dev-workspace β creates a "Dev" workspace with GitHub, MDN, Stack Overflow, and a scratch tab.
Commands can run automatically on a timer. Create them in Settings β Macros & Automation β Scheduled, or via the IPC:
CommandIPC.createScheduled({
name: 'hourly-hibernation',
command: 'tab.hibernateAll',
schedule: { type: 'interval', intervalMs: 3600000 },
enabled: true,
})The REPL keeps a rolling history of the last 500 commands. Navigate with β/β in the input. The Undo system (cmd:undo) reverses the last undoable action by mapping commands to their anti-commands (e.g. tab.create β tab.close, lens.set β lens.restore).
Press Tab to cycle through suggestions. The autocomplete engine searches across all registered commands, user-defined aliases, and saved macros simultaneously, ranked by prefix match. Suggestions display category, argument signature, and description in a compact overlay above the input.
The left panel has four tabs:
- Commands β filterable, categorized list of every available command; click to insert into the input
- Macros β all saved macros with run/edit actions
- Aliases β all current aliases; click to insert the short form
- History β input history in reverse chronological order; click to re-run
- Node.js β₯ 20
- npm β₯ 10
cd kitsune
npm installnpm run devThis starts Vite dev server + Electron simultaneously with hot reload.
npm run electron:buildProduces a native installer in release/.
Open Settings (β,) β AI & Intelligence β paste a HackClub API key from ai.hackclub.com.
Or set it via environment variable before launching:
ANTHROPIC_API_KEY=sk-hc-v1-... npm run dev| Hotkey | Action |
|---|---|
βK |
Command palette |
| `β`` | Command REPL |
βT |
New tab |
βW |
Close active tab |
β\ |
Cleave (split layout) |
ββ§A |
Toggle AI panel |
ββ§F |
File search |
ββ§R |
Reading mode |
β, |
Settings |
β1 |
Default lens |
β2 |
Research lens |
β3 |
Coding lens |
β4 |
Reading lens |
-
kitsune://newtabinternal page renderer (protocol handler) - Horizontal tab bar mode (toggle in settings)
- ResizablePanels integration for live Cleave layouts
- Universal File Search (PDF/DOCX/email indexing with local embeddings)
- AI Humanizer extension (human-like typing automation)
- Meeting Prep: email + calendar + tab synthesis
- Developer Lens: integrated DevTools panel, console in sidebar
- AI Workflow Chains: multi-step automation with visible "trail"
- Sync (encrypted) across devices
- Extension support (Manifest V3 compatible)
- LibreWolf-equivalent: integrate uBlock Origin engine natively
- REPL hotkey remapping
- Macro import/export (JSON)
- Context isolation: renderer has zero Node.js access; all syscalls go through
contextBridge - Sandboxed webContents: every tab runs in a sandboxed BrowserView
- Private tabs: ephemeral
partitionsessions, never touch disk - No remote content in chrome UI: the browser shell itself loads only local assets
- Tracker blocking at network layer:
session.webRequestblocks before TCP connects - CSP on chrome window: strict Content-Security-Policy header on the renderer HTML
MIT β build on it, ship it, make it yours.