{"id":23521205,"url":"https://github.com/lekt9/albert-launcher","last_synced_at":"2026-05-08T05:37:32.212Z","repository":{"id":269690325,"uuid":"884709168","full_name":"lekt9/alBERT-launcher","owner":"lekt9","description":"AI-powered file launcher and semantic search assistant. Like Spotlight/Alfred but with advanced AI capabilities for understanding context and meaning. Features local processing, privacy-first design, and seamless integration with your workflow.","archived":false,"fork":false,"pushed_at":"2024-12-25T10:56:06.000Z","size":8384,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"release","last_synced_at":"2025-02-16T23:42:58.258Z","etag":null,"topics":["ai","alfred","desktop","document-search","electron","llm","local","local-ai","macos","ollama","privacy","productivity-tool","search-engine","semantic-search","spotlight","typescript","vector-search"],"latest_commit_sha":null,"homepage":"https://www.producthunt.com/posts/albert-launcher","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lekt9.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"lekt8","thanks_dev":null,"custom":null}},"created_at":"2024-11-07T08:49:07.000Z","updated_at":"2025-02-13T16:24:57.000Z","dependencies_parsed_at":"2024-12-25T11:32:02.271Z","dependency_job_id":null,"html_url":"https://github.com/lekt9/alBERT-launcher","commit_stats":null,"previous_names":["lekt9/albert-launcher"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lekt9%2FalBERT-launcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lekt9%2FalBERT-launcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lekt9%2FalBERT-launcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lekt9%2FalBERT-launcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lekt9","download_url":"https://codeload.github.com/lekt9/alBERT-launcher/tar.gz/refs/heads/release","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239212556,"owners_count":19600830,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","alfred","desktop","document-search","electron","llm","local","local-ai","macos","ollama","privacy","productivity-tool","search-engine","semantic-search","spotlight","typescript","vector-search"],"created_at":"2024-12-25T17:11:05.503Z","updated_at":"2026-05-08T05:37:32.205Z","avatar_url":"https://github.com/lekt9.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/lekt8"],"categories":[],"sub_categories":[],"readme":"# alBERT-launcher\n\nYour AI-powered file launcher and search assistant. Think Spotlight or Alfred, but with the intelligence to understand what you're looking for. Press `Option (⌥) + Space` anywhere to start searching!\n\n![alBERT-launcher Demo](demo.gif)\n\n## Installation\n\n### macOS\n\n1. Download the latest release for your architecture:\n   - For Apple Silicon (M1/M2): `albert-launcher-{version}-mac-arm64.dmg`\n   - For Intel: `albert-launcher-{version}-mac-x64.dmg`\n2. Open the DMG file and drag alBERT to your Applications folder\n3. Since the app is not signed with an Apple Developer certificate, you'll need to:\n   - Right-click (or Control-click) on alBERT in Applications\n   - Select \"Open\" from the context menu\n   - Click \"Open\" in the security dialog\n   - This is only required for the first launch\n4. Press `Option (⌥) + Space` anywhere to open alBERT!\n\n### Quick Tips\n\n- 🚀 **Launch**: Press `Option (⌥) + Space` anywhere to open alBERT\n- 🔍 **Search**: Just start typing - alBERT understands natural language\n- 💡 **Smart Results**: Results are ranked by relevance to your query\n- ⌨️ **Navigate**: Use arrow keys to move, Enter to open\n- ⚡️ **Quick Exit**: Press Esc to close\n\n## What Makes alBERT Different?\n\nUnlike traditional file search tools that rely on filename matching or basic content indexing, alBERT-launcher uses advanced semantic search and AI capabilities to understand the meaning behind your queries. It maintains a dedicated folder (`~/alBERT`) where it indexes and searches through your important documents, providing:\n\n- **Semantic Search**: Find documents based on meaning, not just keywords\n- **AI-Powered Answers**: Get direct answers to questions about your documents\n- **Context-Aware Results**: Results are ranked based on relevance to your query context\n- **Instant Access**: Global shortcut (`Option (⌥) + Space`) to access from anywhere\n\n## How It Works\n\n```mermaid\ngraph TD\n    A[User Query] --\u003e B[Query Processor]\n    B --\u003e C{Query Type}\n    C --\u003e|File Search| D[Local Search Engine]\n    C --\u003e|Web Search| E[Brave Search API]\n    C --\u003e|AI Question| F[Perplexity AI]\n    \n    D --\u003e G[Document Embeddings]\n    D --\u003e H[File Index]\n    \n    G --\u003e I[Search Results]\n    H --\u003e I\n    E --\u003e I\n    F --\u003e I\n    \n    I --\u003e J[Result Ranker]\n    J --\u003e K[UI Display]\n\n    subgraph \"Local Index\"\n        H\n        G\n    end\n\n    subgraph \"External Services\"\n        E\n        F\n    end\n```\n\n### Architecture Overview\n\n```mermaid\ngraph LR\n    A[Electron Main Process] --\u003e B[IPC Bridge]\n    B --\u003e C[Renderer Process]\n    \n    subgraph \"Main Process\"\n        A --\u003e D[File Watcher]\n        A --\u003e E[Search DB]\n        A --\u003e F[Embeddings Service]\n    end\n    \n    subgraph \"Renderer Process\"\n        C --\u003e G[React UI]\n        G --\u003e H[Search Bar]\n        G --\u003e I[Results View]\n        G --\u003e J[Settings Panel]\n    end\n```\n\n#### Main process lifecycle\n\nThe Electron main process is now organised into small lifecycle utilities so contributors can refactor or extend behaviour without digging through a monolithic `index.ts` file:\n\n| Concern | Module | Responsibilities |\n| --- | --- | --- |\n| Window orchestration | `src/main/lifecycle/window-manager.ts` | Builds the translucent shell window, wires blur/close hooks, and loads the correct renderer URL depending on environment. |\n| IPC routing | `src/main/lifecycle/ipc.ts` | Registers the tRPC bridge against the active window so renderer modules can call into the main process. |\n| Tray \u0026 shortcuts | `src/main/lifecycle/tray.ts`, `src/main/lifecycle/shortcuts.ts` | Sets up the status bar tray menu and keyboard toggle with graceful teardown on quit. |\n| Search database lifecycle | `src/main/lifecycle/search-service.ts` | Lazily initialises the embedded vector index, streams progress updates to the renderer, and persists/shuts down cleanly. |\n\nThese modules keep the bootstrap logic declarative inside `src/main/index.ts` while still exposing focused hooks for new background services or observability.\n\n#### Renderer state toolkit\n\nTo keep the liquid-glass UI responsive, the renderer has been decomposed into focused utilities instead of one monolithic `App.tsx`:\n\n| Concern | Module | Responsibilities |\n| --- | --- | --- |\n| Smithery connectors | `src/renderer/src/hooks/useSmitheryContext.ts` | Debounced MCP fetching with cancellation, error surfacing, and manual refresh support. |\n| Context scoring | `src/renderer/src/hooks/useContextScoring.ts` | Reranks merged local/MCP documents and tracks cosine similarity maps without blocking the UI thread. |\n| Prompt assembly | `src/renderer/src/lib/context-builder.ts` | Normalises sticky notes, Smithery snippets, and search results into a bounded context string for the LLM middleware. |\n| Shared search types | `src/renderer/src/types/search.ts` | Source of truth for search result, cache, and sticky note shapes reused across components. |\n\nThese modules let feature components subscribe to just the slices of data they need, improving readability while reducing redundant network requests and state churn.\n\n\u003e **Secrets stay local.** Configuration lives in `.env` (ignored by git) with safe defaults documented in `.env.example`; never commit API keys to the repo.\n\n### Search Flow\n\n```mermaid\nsequenceDiagram\n    participant U as User\n    participant UI as UI Layer\n    participant S as Search Engine\n    participant DB as Search DB\n    participant AI as AI Services\n    \n    U-\u003e\u003eUI: Enter Query\n    UI-\u003e\u003eS: Process Query\n    S-\u003e\u003eDB: Search Local Index\n    S-\u003e\u003eAI: Get AI Answer\n    par Local Results\n        DB--\u003e\u003eS: Document Matches\n    and AI Response\n        AI--\u003e\u003eS: Generated Answer\n    end\n    S-\u003e\u003eS: Rank \u0026 Merge Results\n    S-\u003e\u003eUI: Display Results\n    UI-\u003e\u003eU: Show Results\n```\n\n## Features\n\n- 🚀 Lightning-fast local file search\n- 🤖 AI-powered answers using Perplexity\n- 🔍 Semantic search capabilities\n- 🌐 Web search integration with Brave Search\n- ⌨️ Global keyboard shortcuts (`Option (⌥) + Space`)\n- 💾 Smart caching system\n- 🎯 Context-aware search results\n- 🫧 Liquid glass interface inspired by macOS Sonoma\n- 📱 Modern, responsive UI\n\n### Liquid Glass Interface\n\nThe renderer has been refreshed to echo Apple's latest \"liquid glass\" design language:\n\n- Layered frosted panels with animated gradient orbs and a soft grid backdrop keep the workspace calm yet dynamic.\n- A sculpted header surfaces key stats (pinned notes, surfaced results, conversations) so you can gauge context at a glance.\n- Search, chat, and notes live inside glass panels with softened borders, luminous highlights, and adaptive blur so focus stays on your content.\n- Sticky notes inherit the same frosted aesthetic and can be spawned instantly from the header or via \u003ckbd\u003e⌘/Ctrl\u003c/kbd\u003e + \u003ckbd\u003eN\u003c/kbd\u003e.\n\nTo tweak the visuals, inspect `src/renderer/src/assets/index.css` for theme tokens and glass utilities, and adjust the panel layout inside `src/renderer/src/App.tsx`.\n\n### Smithery MCP connectors\n\nalBERT now speaks the [Model Context Protocol (MCP)](https://smithery.ai/mcp) so you can stream structured knowledge packs straight from [Smithery](https://smithery.ai) into every search and chat turn.\n\n1. **Open Settings → Smithery MCP** and (optionally) drop in your Smithery API key if you need private connectors.\n2. Paste a Smithery slug (for example `notion-notes`) or a manifest URL to link a connector. You can also pick from the built-in directory and click **Link connector**.\n3. Toggle connectors on/off, refresh their metadata, or remove them entirely without editing config files.\n\nOnce linked, context cards from each connector show up beneath search results. The retrieved snippets are automatically blended into the conversation context so the assistant can cite them alongside your local documents. Everything is stored in local preferences—no Smithery secrets are shipped with the repo.\n\nFor deeper integrations—hosting your own MCP servers, enabling OAuth, or wiring Smithery connectors into other runtimes—see [`docs/smithery-mcp.md`](docs/smithery-mcp.md) for a protocol primer and official SDK references.\n\n## Core Concepts\n\n### The alBERT Folder\nThe `~/alBERT` folder is your personal knowledge base. Any files placed here are:\n- Automatically indexed for semantic search\n- Processed for quick retrieval\n- Analyzed for contextual understanding\n- Accessible through natural language queries\n\n### Semantic Search\nalBERT uses advanced embedding techniques to understand the meaning of your documents:\n1. Documents are split into meaningful chunks\n2. Each chunk is converted into a high-dimensional vector\n3. Queries are matched against these vectors for semantic similarity\n4. Results are ranked based on relevance and context\n\n### AI Integration\n- **Query Understanding**: Natural language processing to understand user intent\n- **Context Awareness**: Maintains conversation context for follow-up queries\n- **Smart Answers**: Generates answers by combining local knowledge with AI capabilities\n\n### OpenRouter Integration\n\nalBERT-launcher uses OpenRouter to access powerful language models for enhanced search capabilities:\n\n\u003e **Note:** The app does not include an OpenRouter API key. Provide your own key via the in-app **Settings → Public AI** section or by setting `OPENROUTER_API_KEY` in `.env` before enabling cloud responses.\n\n```mermaid\ngraph TD\n    A[User Query] --\u003e B[Query Analyzer]\n    B --\u003e C{Query Type}\n    C --\u003e|Direct Question| D[OpenRouter API]\n    C --\u003e|Document Analysis| E[Local Processing]\n    \n    D --\u003e F[Perplexity/LLaMA Model]\n    F --\u003e G[AI Response]\n    \n    E --\u003e H[Document Vectors]\n    H --\u003e I[Semantic Search]\n    \n    G --\u003e J[Result Merger]\n    I --\u003e J\n    J --\u003e K[Final Response]\n\n    subgraph \"OpenRouter Service\"\n        D\n        F\n    end\n\n    subgraph \"Local Processing\"\n        E\n        H\n        I\n    end\n```\n\n#### OpenRouter Features\n- **Model Selection**: Uses Perplexity's LLaMA-3.1-Sonar-Small-128k model for optimal performance\n- **Context Integration**: Combines AI responses with local document context\n- **Source Attribution**: AI responses include relevant source URLs\n- **Streaming Responses**: Real-time response streaming for better UX\n- **Fallback Handling**: Graceful degradation when API is unavailable\n\nExample OpenRouter configuration:\n```typescript\nconst openRouterConfig = {\n  model: \"perplexity/llama-3.1-sonar-small-128k-online\",\n  temperature: 0.7,\n  maxTokens: 500,\n  systemPrompt: \"You are a search engine api that provides answers to questions with as many links to sources as possible.\"\n}\n```\n\n### Privacy-First: Local AI with Ollama\n\nalBERT-launcher puts your privacy first by supporting local AI processing through Ollama integration. Switch between cloud and local AI with a single click:\n\n```mermaid\ngraph TD\n    A[Your Query] --\u003e B{Privacy Mode}\n    B --\u003e|Private| C[Local AI]\n    B --\u003e|Public| D[Cloud AI]\n    C --\u003e E[Private Results]\n    D --\u003e F[Cloud Results]\n```\n\n#### Features\n\n- 🔒 **Privacy Mode**: Switch between local and cloud AI instantly\n- 💻 **Local Processing**: Keep your data on your machine\n- 🌐 **Flexible Choice**: Use cloud AI when you need more power\n- ⚡ **Fast Response**: No internet latency in local mode\n- 💰 **Cost-Free**: No API costs when using local models\n- 🔌 **Offline Support**: Work without internet connection\n\n#### Quick Setup\n\n1. Install Ollama from [ollama.ai](https://ollama.ai)\n2. Enable \"Private Mode\" in alBERT settings\n3. Start searching with complete privacy!\n\n#### Available Models\n\nChoose from various powerful local models:\n- Llama 2\n- CodeLlama\n- Mistral\n- And more from Ollama's model library\n\n#### Why Local AI?\n\n- **Complete Privacy**: Your queries never leave your computer\n- **No API Costs**: Use AI features without subscription fees\n- **Always Available**: Work offline without interruption\n- **Full Control**: Choose and customize your AI models\n\n### File System Integration\n\nalBERT-launcher implements a sophisticated file system monitoring and indexing system:\n\n```mermaid\ngraph TD\n    A[File System Events] --\u003e B[Event Watcher]\n    B --\u003e C{Event Type}\n    C --\u003e|Create| D[Index New File]\n    C --\u003e|Modify| E[Update Index]\n    C --\u003e|Delete| F[Remove from Index]\n    \n    D --\u003e G[File Processor]\n    E --\u003e G\n    \n    G --\u003e H[Content Extractor]\n    H --\u003e I[Text Chunker]\n    I --\u003e J[Vector Database]\n    \n    subgraph \"File Processing Pipeline\"\n        G\n        H\n        I\n    end\n\n    subgraph \"Search Index\"\n        J\n    end\n```\n\n#### File System Features\n\n1. **Automatic Monitoring**\n   - Real-time file change detection\n   - Efficient delta updates\n   - Handles file moves and renames\n   - Supports symbolic links\n\n2. **Content Processing**\n   ```typescript\n   // Example content processing pipeline\n   async function processFile(filePath: string) {\n     const content = await readContent(filePath)\n     const chunks = splitIntoChunks(content)\n     const vectors = await vectorizeChunks(chunks)\n     await updateSearchIndex(filePath, vectors)\n   }\n   ```\n\n3. **Supported File Types**\n   - Text files (.txt, .md, .json)\n   - Documents (.pdf, .doc, .docx)\n   - Code files (.js, .py, .ts, etc.)\n   - Configuration files (.yaml, .toml)\n   - And more...\n\n4. **Smart Indexing**\n   - Incremental updates\n   - Content deduplication\n   - Metadata extraction\n   - File type detection\n\n5. **Search Capabilities**\n   - Full-text search\n   - Fuzzy matching\n   - Regular expressions\n   - Metadata filters\n\n#### File Organization\n\nThe `~/alBERT` directory structure:\n```\n~/alBERT/\n├── documents/           # General documents\n├── notes/              # Quick notes and thoughts\n├── code/               # Code snippets and examples\n├── configuration/      # Config files and settings\n└── .alBERT/           # Internal index and metadata\n    ├── index/         # Search indices\n    ├── vectors/       # Document vectors\n    ├── cache/         # Query cache\n    └── metadata/      # File metadata\n```\n\n#### Performance Optimizations\n\n1. **Indexing**\n   - Batch processing for multiple files\n   - Parallel processing when possible\n   - Priority queue for important files\n   - Delayed processing for large files\n\n2. **Search**\n   ```mermaid\n   graph LR\n       A[Query] --\u003e B[Vector]\n       B --\u003e C{Search Type}\n       C --\u003e|ANN| D[Approximate Search]\n       C --\u003e|KNN| E[Exact Search]\n       D --\u003e F[Results]\n       E --\u003e F\n   ```\n\n3. **File Monitoring**\n   - Debounced file system events\n   - Coalescence of multiple events\n   - Selective monitoring based on file size\n   - Resource-aware processing\n\n## Vector Database Implementation\n\nalBERT-launcher uses Weaviate Embedded as its vector database engine, providing efficient storage and retrieval of document embeddings:\n\n```mermaid\ngraph TD\n    A[Document] --\u003e B[Content Extractor]\n    B --\u003e C[Text Chunks]\n    C --\u003e D[Embedding Model]\n    D --\u003e E[Vector Embeddings]\n    E --\u003e F[Weaviate DB]\n    \n    G[Search Query] --\u003e H[Query Vectorizer]\n    H --\u003e I[Query Vector]\n    I --\u003e J[Vector Search]\n    F --\u003e J\n    J --\u003e K[Ranked Results]\n\n    subgraph \"Embedding Pipeline\"\n        B\n        C\n        D\n        E\n    end\n\n    subgraph \"Vector Store\"\n        F\n    end\n\n    subgraph \"Search Pipeline\"\n        H\n        I\n        J\n    end\n```\n\n#### Vector Database Architecture\n\n1. **Document Processing**\n   ```typescript\n   interface WeaviateDocument {\n     content: string\n     path: string\n     lastModified: number\n     extension: string\n   }\n   ```\n\n2. **Schema Definition**\n   ```typescript\n   const schema = {\n     class: 'File',\n     properties: [\n       { name: 'path', dataType: ['string'] },\n       { name: 'content', dataType: ['text'] },\n       { name: 'filename', dataType: ['string'] },\n       { name: 'extension', dataType: ['string'] },\n       { name: 'lastModified', dataType: ['number'] },\n       { name: 'hash', dataType: ['string'] }\n     ],\n     vectorizer: 'none'  // Custom vectorization\n   }\n   ```\n\n#### Embedding System\n\n1. **Worker-based Processing**\n   - Dedicated worker threads for vectorization\n   - Parallel processing of document batches\n   - Automatic resource management\n   - Error handling and recovery\n\n2. **Batch Processing**\n   ```typescript\n   // Example batch processing\n   export const embed = async (\n     text: string | string[],\n     batch_size: number = 15\n   ): Promise\u003cnumber[] | number[][]\u003e =\u003e {\n     // Process in batches for optimal performance\n   }\n   ```\n\n3. **Reranking System**\n   - Cross-encoder for accurate result ranking\n   - Contextual similarity scoring\n   - Optional document return with scores\n\n#### Performance Features\n\n1. **Efficient Storage**\n   - Incremental updates\n   - Document hashing for change detection\n   - Optimized vector storage\n   - Automatic garbage collection\n\n2. **Fast Retrieval**\n   ```mermaid\n   graph LR\n       A[Query] --\u003e B[Vector]\n       B --\u003e C{Search Type}\n       C --\u003e|ANN| D[Approximate Search]\n       C --\u003e|KNN| E[Exact Search]\n       D --\u003e F[Results]\n       E --\u003e F\n   ```\n\n3. **Optimization Techniques**\n   - Approximate Nearest Neighbor (ANN) search\n   - Vector quantization\n   - Dimension reduction\n   - Caching strategies\n\n#### Advanced Features\n\n1. **Hybrid Search**\n   - Combined keyword and semantic search\n   - Weighted scoring system\n   - Metadata filtering\n   - Context-aware ranking\n\n2. **Vector Operations**\n   ```typescript\n   interface RankResult {\n     corpus_id: number\n     score: number\n     text?: string\n   }\n   ```\n\n## Open Source Readiness\n\nThis repository is set up for collaborative development:\n\n- Environment variables are documented in `.env.example`. Provide your own API keys during local development; none are committed to source control.\n- The renderer and main process read configuration through the validated helpers in `src/main/config.ts`, ensuring secrets never live in the UI bundle.\n- Prefer `npm` for dependency management (`package-lock.json` is authoritative). After cloning, run:\n\n  ```bash\n  npm install\n  npm run dev\n  npm run lint\n  npm run typecheck\n  ```\n\n- Secret scanning is encouraged for contributors (e.g., `git secrets --scan`) before submitting pull requests.\n- UI components follow the frosted-glass design tokens declared in `src/renderer/src/assets/index.css`—please align new work with these utilities for consistency.\n\n3. **Quality Assurance**\n   - Automated consistency checks\n   - Vector space analysis\n   - Performance monitoring\n   - Error detection\n\n#### System Integration\n\n```mermaid\nsequenceDiagram\n    participant App as Application\n    participant VDB as Vector DB\n    participant Worker as Worker Thread\n    participant Storage as File Storage\n    \n    App-\u003e\u003eVDB: Index Request\n    VDB-\u003e\u003eWorker: Vectorize Content\n    Worker-\u003e\u003eWorker: Process Batch\n    Worker--\u003e\u003eVDB: Return Vectors\n    VDB-\u003e\u003eStorage: Store Vectors\n    Storage--\u003e\u003eVDB: Confirm Storage\n    VDB--\u003e\u003eApp: Index Complete\n    \n    App-\u003e\u003eVDB: Search Request\n    VDB-\u003e\u003eWorker: Vectorize Query\n    Worker--\u003e\u003eVDB: Query Vector\n    VDB-\u003e\u003eStorage: Vector Search\n    Storage--\u003e\u003eVDB: Search Results\n    VDB--\u003e\u003eApp: Ranked Results\n```\n\n## Prerequisites\n\n- Node.js (v18 or higher recommended)\n- npm 9+ (ships with Node.js and matches the repository lockfile)\n- Brave Search API key (optional)\n- OpenRouter API key (optional)\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Start the development server\nnpm run dev\n```\n\n## Building for Production\n\n```bash\n# For macOS\nnpm run build:mac\n\n# For Windows\nnpm run build:win\n\n# For Linux\nnpm run build:linux\n```\n\n## Configuration\n\nCopy `.env.example` to `.env` in the project root and populate any API keys you intend to use:\n\n```bash\ncp .env.example .env\n```\n\nThe application validates its environment variables at startup and will surface an error if required\nvalues are malformed. Both `BRAVE_API_KEY` and `OPENROUTER_API_KEY` are optional—features that depend on\nthem will simply be skipped when the keys are not provided.\n\n## Project Structure\n\n```\nalBERT-launcher/\n├── src/\n│   ├── main/                 # Electron main process\n│   │   ├── api.ts           # tRPC API endpoints\n│   │   ├── db.ts            # Search database management\n│   │   ├── embeddings.ts    # Text embedding functionality\n│   │   └── utils/           # Utility functions\n│   ├── renderer/            # React frontend\n│   │   ├── components/      # UI components\n│   │   ├── lib/            # Utility functions\n│   │   └── App.tsx         # Main application component\n│   └── preload/            # Electron preload scripts\n├── public/                 # Static assets\n└── electron-builder.json5  # Build configuration\n```\n\n## API Documentation\n\n### Search API\nThe search API supports various query types:\n- Basic text search\n- Semantic search\n- Natural language questions\n- File metadata queries\n\nExample queries:\n```\n\"find documents about react hooks\"\n\"what are the key points from my meeting notes?\"\n\"show me python files modified last week\"\n```\n\n### File Monitoring\nalBERT automatically monitors the `~/alBERT` folder for:\n- New files\n- File modifications\n- File deletions\n- File moves\n\nChanges are automatically indexed and available for search immediately.\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- [Electron](https://www.electronjs.org/)\n- [React](https://reactjs.org/)\n- [tRPC](https://trpc.io/)\n- [Brave Search](https://brave.com/search/)\n- [OpenRouter](https://openrouter.ai/)\n\n## Support\n\nIf you encounter any issues or have questions, please file an issue on our [GitHub Issues](https://github.com/lekt9/alBERT-launcher/issues) page.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flekt9%2Falbert-launcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flekt9%2Falbert-launcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flekt9%2Falbert-launcher/lists"}