{"id":50912186,"url":"https://github.com/unbug/monday","last_synced_at":"2026-06-16T11:01:37.355Z","repository":{"id":352180255,"uuid":"1214136531","full_name":"unbug/monday","owner":"unbug","description":"Run models in broswers without install anything.","archived":false,"fork":false,"pushed_at":"2026-05-30T03:59:57.000Z","size":1751,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T05:20:19.568Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://unbug.github.io/monday/","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/unbug.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T06:56:45.000Z","updated_at":"2026-05-30T04:00:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/unbug/monday","commit_stats":null,"previous_names":["unbug/monday"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/unbug/monday","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbug%2Fmonday","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbug%2Fmonday/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbug%2Fmonday/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbug%2Fmonday/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unbug","download_url":"https://codeload.github.com/unbug/monday/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unbug%2Fmonday/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34402663,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-06-16T11:01:36.253Z","updated_at":"2026-06-16T11:01:37.347Z","avatar_url":"https://github.com/unbug.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monday - Browser AI Chat\n\n\u003e Run open-source AI models **directly in your browser**. No server, no install, 100% private.\n\n[![Deploy](https://github.com/unbug/monday/actions/workflows/deploy.yml/badge.svg)](https://github.com/unbug/monday/actions/workflows/deploy.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n**[Live Demo](https://unbug.github.io/monday/)** · **[Changelog](https://unbug.github.io/monday/)**\n\n---\n\n## Features\n\n- **Zero Install** — Pure browser experience, no downloads needed\n- **Browser-Native Inference** — Models run locally via WebGPU + WASM using [Web-LLM](https://github.com/mlc-ai/web-llm)\n- **23 Pre-configured Models** — Qwen 2.5/3/3.5, SmolLM2, Gemma 2/3, Phi 3.5/4, Llama 3.2, DeepSeek R1, and more\n- **Streaming Output** — Token-by-token real-time response\n- **Chat History** — Persistent multi-session conversations via IndexedDB\n- **Changelog** — In-app version history with expandable release details\n- **Usage Statistics** — Dashboard with daily charts, per-model breakdown, and provider analytics\n- **Model Comparison** — Side-by-side generation from two models with real-time token stats\n- **Model Benchmark** — Built-in benchmark tool to measure tokens/sec and latency\n- **Custom Model Import** — Load custom MLC-compiled models from any HuggingFace URL\n- **Download Resume** — Resume interrupted model downloads from where you left off\n- **Session Search** — Search conversations by title with date filtering\n- **Command Palette** — Quick navigation with ⌘K\n- **Prompt Templates \u0026 Personas** — 8 built-in personas + custom persona creation\n- **Message Actions** — Edit and regenerate user messages inline\n- **Generation Parameters** — Per-session temperature, top-p, max tokens sliders\n- **System Prompts** — Customizable per-session system prompts\n- **Token Counter** — Real-time tokens/sec and total token usage\n- **Model Cache Manager** — View and delete cached models\n- **Recent Models** — Quick access to recently used models\n- **Recommended Models** — Top models based on your usage history\n- **Storage Quota** — Monitor browser storage usage\n- **Markdown Rendering** — Code highlighting, LaTeX math, GFM tables\n- **Chat Export** — Export conversations as Markdown\n- **BorderBeam UI** — Animated border effects with ocean/colorful/mono variants\n- **Theme Toggle** — Light / Dark / System with auto-detection\n- **Mobile Responsive** — Sidebar overlay, auto-close, safe-area support\n- **PWA Ready** — Web app manifest, apple-touch-icon\n- **100% Private** — Nothing leaves your browser\n\n---\n\n## Architecture\n\n### High-Level System Architecture\n\n```mermaid\ngraph TB\n    subgraph Browser[\"🌐 Browser (Client-Side Only)\"]\n        UI[\"React UI\u003cbr/\u003eVite + TypeScript\"]\n        Engine[\"Web-LLM Engine\u003cbr/\u003eWebGPU / WASM\"]\n        IDB[\"IndexedDB\u003cbr/\u003eChat Persistence\"]\n        Cache[\"Browser Cache\u003cbr/\u003eModel Weights\"]\n    end\n\n    subgraph External[\"☁️ External (Read-Only)\"]\n        HF[\"HuggingFace CDN\u003cbr/\u003eMLC Model Registry\"]\n        GHP[\"GitHub Pages\u003cbr/\u003eStatic Hosting\"]\n    end\n\n    User((\"👤 User\")) --\u003e UI\n    UI --\u003e|\"streamChat()\"| Engine\n    Engine --\u003e|\"Token Stream\"| UI\n    UI --\u003e|\"saveSessions()\"| IDB\n    IDB --\u003e|\"loadSessions()\"| UI\n    Engine \u003c--\u003e|\"Download Once\"| HF\n    Engine --\u003e|\"Cache Weights\"| Cache\n    GHP --\u003e|\"Serve SPA\"| Browser\n\n    style Browser fill:#1a1a2e,stroke:#a78bfa,color:#e5e5e5\n    style External fill:#0d1117,stroke:#444,color:#999\n    style Engine fill:#7c3aed,stroke:#a78bfa,color:#fff\n```\n\n### Routing Architecture\n\nMonday uses a **zero-dependency URL routing** system built on the HTML5 History API — no React Router, no hash fragments.\n\n**All 14 named views and their paths** (defined in `src/App.tsx`):\n\n| View key | URL path |\n|---|---|\n| `chat` | `/monday/` |\n| `models` | `/monday/models` |\n| `changelog` | `/monday/changelog` |\n| `cache` | `/monday/cache` |\n| `stats` | `/monday/stats` |\n| `comparison` | `/monday/comparison` |\n| `benchmark` | `/monday/benchmark` |\n| `custom-models` | `/monday/custom-models` |\n| `persona-marketplace` | `/monday/persona-marketplace` |\n| `knowledge` | `/monday/knowledge` |\n| `plugins` | `/monday/plugins` |\n| `mcp-servers` | `/monday/mcp-servers` |\n| `webdav` | `/monday/webdav` |\n| `memory` | `/monday/memory` |\n\n**How it works:**\n\n```mermaid\nflowchart LR\n    URL[\"URL\\n/monday/…\"] --\u003e|popstate| VFP[\"viewFromPath()\\nURL → View enum\"]\n    VFP --\u003e State[\"view state\\nReact useState\"]\n    State --\u003e|useEffect| PS[\"history.pushState\"]\n    PS --\u003e URL\n\n    subgraph GH[\"GitHub Pages compat\"]\n        F[\"public/404.html\\nsaves path → sessionStorage\"]\n        R[\"Redirect → /monday/\"]\n        A[\"App init reads sessionStorage\\nhistory.replaceState\"]\n        F --\u003e R --\u003e A\n    end\n\n    style State fill:#7c3aed,stroke:#a78bfa,color:#fff\n    style GH fill:#0d1117,stroke:#444,color:#999\n```\n\n**Key behaviours:**\n\n- Calling `setView(v)` triggers a `useEffect` that does `history.pushState` to the mapped URL — the URL bar updates instantly without a page reload.\n- `popstate` events (browser back / forward) call `viewFromPath(pathname)` to resolve the URL back into a `View` and update React state.\n- **GitHub Pages 404 compatibility**: `public/404.html` captures the requested path in `sessionStorage` and redirects to `/monday/`. On first render `App.tsx` reads it back and calls `history.replaceState` to restore the original URL before the SPA mounts.\n\n\u003e **Rule for adding a new view:**\n\u003e 1. Add the key + path to `VIEW_PATH` in `App.tsx`.\n\u003e 2. Add a `view === 'new-view'` render branch in the JSX return.\n\u003e 3. Add a navigation callback to `useKeyboardShortcuts` and a menu item in `Sidebar`.\n\n---\n\n### Component Architecture\n\n```mermaid\ngraph TD\n    App[\"App.tsx\u003cbr/\u003eURL Router + Global State\"]\n    App --\u003e Sidebar[\"Sidebar\u003cbr/\u003eSession List + Nav\"]\n    App --\u003e Header[\"Header\u003cbr/\u003eModel Badge + Theme\"]\n\n    subgraph Views[\"Routed Views (view state)\"]\n        V_chat[\"chat\\n ChatLayout\"]\n        V_models[\"models\\n ModelSelector\"]\n        V_knowledge[\"knowledge\\n KnowledgePanel\"]\n        V_plugins[\"plugins\\n PluginManager\"]\n        V_mcp[\"mcp-servers\\n McpServerManager\"]\n        V_memory[\"memory\\n MemoryPanel\"]\n        V_webdav[\"webdav\\n WebDAVSettings\"]\n        V_stats[\"stats\\n ModelStats\"]\n        V_cmp[\"comparison\\n ModelComparison\"]\n        V_bench[\"benchmark\\n ModelBenchmark\"]\n        V_persona[\"persona-marketplace\\n PersonaMarketplace\"]\n        V_custom[\"custom-models\\n CustomModelImport\"]\n        V_cache[\"cache\\n (cache manager)\"]\n        V_cl[\"changelog\\n Changelog\"]\n    end\n\n    App --\u003e Views\n\n    Header --\u003e TT[\"ThemeToggle\u003cbr/\u003eLight/Dark/System\"]\n    Header --\u003e WG[\"WebGPUCheck\"]\n    V_chat --\u003e ML[\"MessageList\"]\n    V_chat --\u003e CI[\"ChatInput\u003cbr/\u003eBorderBeam textarea\"]\n\n    subgraph Hooks[\"Custom Hooks\"]\n        useModel[\"useModel\u003cbr/\u003eLoad/Unload/Progress\"]\n        useChat[\"useChat\u003cbr/\u003eSessions/Messages/Stream\"]\n        useTheme[\"useTheme\u003cbr/\u003eLight/Dark/System\"]\n        useKnowledge[\"useKnowledge / useKnowledgeBases\"]\n        useVectorStore[\"useVectorStore\u003cbr/\u003eIndexedDB vectors\"]\n        useEmbedding[\"useEmbeddingModel\u003cbr/\u003eGTE-small MLC\"]\n        useMcp[\"useMcpServers\"]\n    end\n\n    subgraph Lib[\"Core Library\"]\n        engine[\"engine.ts\u003cbr/\u003eWeb-LLM Singleton\"]\n        models[\"models.ts\u003cbr/\u003eModel Registry\"]\n        storage[\"storage.ts\u003cbr/\u003eIndexedDB Ops\"]\n        changelog[\"changelog.ts\u003cbr/\u003eVersion Data\"]\n    end\n\n    App --\u003e Hooks\n    Hooks --\u003e Lib\n    engine --\u003e|\"CreateMLCEngine\"| WEBLLM[\"@mlc-ai/web-llm\"]\n\n    style App fill:#7c3aed,stroke:#a78bfa,color:#fff\n    style Views fill:#1a1a2e,stroke:#a78bfa,color:#e5e5e5\n    style Hooks fill:#1e3a5f,stroke:#3b82f6,color:#e5e5e5\n    style Lib fill:#1a3328,stroke:#22c55e,color:#e5e5e5\n```\n\n### Data Flow: Chat Message Lifecycle\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant ChatInput\n    participant useChat\n    participant engine.ts\n    participant WebLLM\n    participant IndexedDB\n\n    User-\u003e\u003eChatInput: Type message + Enter\n    ChatInput-\u003e\u003euseChat: sendMessage(content)\n    useChat-\u003e\u003euseChat: Create user msg + empty assistant msg\n    useChat-\u003e\u003eengine.ts: streamChat(history)\n    engine.ts-\u003e\u003eWebLLM: chat.completions.create(stream:true)\n\n    loop Token Streaming\n        WebLLM--\u003e\u003eengine.ts: yield delta token\n        engine.ts--\u003e\u003euseChat: yield token\n        useChat--\u003e\u003euseChat: Append to assistant msg\n        useChat--\u003e\u003eChatInput: Re-render (streaming)\n    end\n\n    useChat-\u003e\u003euseChat: Finalize msg, generate title\n    useChat-\u003e\u003eIndexedDB: saveSessions(updated)\n    useChat--\u003e\u003eUser: Complete response displayed\n```\n\n### Model Loading Flow\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant ModelSelector\n    participant useModel\n    participant engine.ts\n    participant WebLLM\n    participant HuggingFace as HF CDN\n\n    User-\u003e\u003eModelSelector: Click model card\n    ModelSelector-\u003e\u003euseModel: load(modelId)\n    useModel-\u003e\u003euseModel: setState(downloading, 0%)\n\n    useModel-\u003e\u003eengine.ts: loadModel(modelId, onProgress)\n    engine.ts-\u003e\u003eWebLLM: CreateMLCEngine(modelId)\n    WebLLM-\u003e\u003eHuggingFace: Fetch model weights (WASM/WebGPU)\n\n    loop Download Progress\n        HuggingFace--\u003e\u003eWebLLM: Chunk data\n        WebLLM--\u003e\u003eengine.ts: InitProgressReport\n        engine.ts--\u003e\u003euseModel: progress callback\n        useModel--\u003e\u003eModelSelector: Update progress bar\n    end\n\n    WebLLM--\u003e\u003eengine.ts: Engine ready\n    engine.ts--\u003e\u003euseModel: resolve\n    useModel-\u003e\u003euseModel: setState(ready, 100%)\n    useModel--\u003e\u003eUser: Model badge shown ✓\n```\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| **Framework** | Vite 8 + React 19 + TypeScript 6 |\n| **AI Runtime** | [@mlc-ai/web-llm](https://github.com/mlc-ai/web-llm) (WebGPU + WASM) |\n| **UI Effects** | [border-beam](https://www.npmjs.com/package/border-beam) |\n| **Persistence** | IndexedDB (sessions, messages) |\n| **Deployment** | GitHub Pages via GitHub Actions |\n| **Build** | Vite, ESNext target |\n\n---\n\n## Supported Models\n\n| Model | Parameters | Size | Provider |\n|-------|-----------|------|----------|\n| **Qwen 3 0.6B** ⭐ | 0.6B | ~400 MB | Alibaba |\n| Qwen 3 1.7B | 1.7B | ~1 GB | Alibaba |\n| Qwen 3 4B | 4B | ~2.5 GB | Alibaba |\n| **Qwen 3.5 0.8B** ⭐ | 0.8B | ~500 MB | Alibaba |\n| Qwen 3.5 2B | 2B | ~1.2 GB | Alibaba |\n| **Qwen 2.5 0.5B** ⭐ | 0.5B | ~350 MB | Alibaba |\n| Qwen 2.5 1.5B | 1.5B | ~900 MB | Alibaba |\n| Qwen 2.5 3B | 3B | ~1.8 GB | Alibaba |\n| Qwen 2.5 Coder 1.5B | 1.5B | ~900 MB | Alibaba |\n| **SmolLM2 360M** | 360M | ~200 MB | HuggingFace |\n| SmolLM2 1.7B | 1.7B | ~1 GB | HuggingFace |\n| **Gemma 2 2B** | 2B | ~1.3 GB | Google |\n| **Gemma 3 4B** | 4B | ~2.5 GB | Google |\n| Gemma 3 1B | 1B | ~700 MB | Google |\n| **Phi 3.5 Mini** | 3.8B | ~2 GB | Microsoft |\n| **Phi 4 Mini** ⭐ | 3.8B | ~2.2 GB | Microsoft |\n| **DeepSeek R1 Distill Qwen 1.5B** ⭐ | 1.5B | ~1 GB | DeepSeek |\n| **Llama 3.2 1B** | 1B | ~700 MB | Meta |\n| **Llama 3.2 3B** | 3B | ~1.8 GB | Meta |\n| TinyLlama 1.1B | 1.1B | ~600 MB | Community |\n| StableLM 2 Zephyr 1.6B | 1.6B | ~950 MB | Stability AI |\n| InternLM 2.5 1.8B | 1.8B | ~1.1 GB | Shanghai AI Lab |\n| OLMo 1B | 1B | ~600 MB | Allen Institute |\n\n⭐ = Recommended for most users\n\n---\n\n## Competitive Analysis\n\nRoadmap informed by deep analysis of these leading AI chat platforms:\n\n| Product | Stars | Key Differentiator | Monday Relevance |\n|---------|-------|-------------------|-----------------|\n| [OpenClaw](https://github.com/openclaw/openclaw) | 364k | Personal always-on AI assistant: multi-channel (WhatsApp/Telegram/Slack/Discord/…), SOUL.md identity, **AgentSkills/SKILL.md ecosystem**, ClawHub registry (52.7k skills, 12M installs), Skill Workshop AI, per-agent allowlists | **Skills system** (SKILL.md spec), skill marketplace, SOUL.md persona persistence, self-improving agent memory |\n| [Open WebUI](https://github.com/open-webui/open-webui) | 132k | Full-featured self-hosted AI platform: RAG, pipelines, MCP, RBAC, voice/video, image gen | Feature-complete reference for chat UX, RAG, tools |\n| [NextChat](https://github.com/ChatGPTNextWeb/NextChat) | 88k | Lightweight cross-platform AI client: Vercel deploy, MCP, masks, artifacts, Tauri desktop | Lightweight UX, prompt templates, artifacts rendering |\n| [LobeHub](https://github.com/lobehub/lobe-chat) | 75k | Agent-as-unit-of-work platform: 10k+ plugins, agent groups, personal memory, TTS/STT | Agent system, plugin ecosystem, memory architecture |\n| [Jan](https://github.com/janhq/jan) | 42k | Offline desktop ChatGPT: local LLMs via llama.cpp, custom assistants, OpenAI-compatible API | Offline-first philosophy, model management, MCP integration |\n| [GPT-Runner](https://github.com/nicepkg/gpt-runner) | 379 | AI presets for code: conversations with code files, IDE integration, version-controlled prompts | Preset system, project-scoped AI configuration |\n| [Claude Code](https://github.com/anthropics/claude-code) | 118k | Terminal coding agent: deep codebase understanding, multi-step agentic task execution, bash/git/test tools, CLAUDE.md project config, plugins directory, `@claude` GitHub tagging, `computer_use` tool (screenshot→observe→action loop in sandboxed VM) | **Agent mode** (v0.30), **plugin system** (v0.27), **task brief** (CLAUDE.md equivalent), **computer-use loop** (v1.3) |\n| [browser-use](https://github.com/browser-use/browser-use) | 90.4k | LLM-controlled browser automation: Playwright-backed agent, click/type/scroll/navigate/screenshot/extract-text primitives, skills directory, AGENTS.md + CLAUDE.md conventions, CLI, cloud hosting, 100-task real-world benchmark | **Browser-use agent** (v1.3): action primitives, sandboxed iframe execution loop, DOM-state context, screenshot observation |\n| [Playwright MCP](https://github.com/microsoft/playwright-mcp) | 31.4k | MCP server for browser automation: navigate/click/fill/screenshot/DOM tools via accessibility tree (no vision model needed); vision + coordinate-based modes opt-in; used by VS Code, Cursor, Claude Desktop, Codex, Copilot | **Playwright MCP bridge** (v1.3): connect Monday's v0.27 MCP client to `@playwright/mcp` for full external-browser control |\n\n---\n\n## Roadmap\n\n\u003e **North Star (immutable)**: _A local-first, browser-native AI workstation._\n\u003e WebGPU inference + optional remote providers, with first-class memory,\n\u003e tools and offline capability — all running entirely in the user's browser.\n\u003e\n\u003e **Three non-negotiable axes** every release must satisfy:\n\u003e\n\u003e 1. **Local-first** — every feature works with WebGPU + IndexedDB only;\n\u003e    cloud providers are an option, never a requirement.\n\u003e 2. **Phase progression** — releases ship the **earliest unreleased\n\u003e    version** in `### Versioned task breakdown` end-to-end. No skipping\n\u003e    versions, no scope outside the listed checkboxes.\n\u003e 3. **Release gate** — a version is \"done\" only when its release gate is\n\u003e    green. Trivial built-ins or polish do **not** unlock the next version.\n\n### Versioned task breakdown\n\nThe autonomous Cron picks the **first unchecked, unblocked** item in the\n**earliest unreleased version** and ships it end-to-end (code + build green\n+ visible in UI + entry in CHANGELOG). It never invents scope outside this\nlist, and never skips a version. Past versions remain documented as a\nhistorical record below.\n\n#### v0.25 — Knowledge \u0026 RAG (storage layer) _(current target)_\n\nPhase 5 of the legacy plan, split for scope safety. RAG is the highest-value\nunmet feature in the product.\n\n- [x] **Document upload** — Upload PDFs / TXT / MD files into a \"Knowledge\"\n      panel (PDF parsing via `pdfjs-dist`)\n- [x] **Client-side chunking** — Split documents into ~500-token chunks\n      in-browser (no server)\n- [x] **Browser vector store** — IndexedDB-backed vector store with\n      cosine similarity, schema migration registered in `storage.ts`\n- [x] **Knowledge bases** — Organize documents into named collections;\n      attach a collection to a session\n\n**Release gate**: a user uploads a 5-page PDF, sees chunks indexed, and a\nsearch box returns the top-K matching chunks (no LLM yet — that's v0.26).\n\nReleased: 2026-04-25\n\n#### v0.26 — RAG (retrieval + citation)\n\n- [x] **Embedding model** — Run a small embedding model via Web-LLM\n      (e.g. `gte-small` MLC build) and persist embeddings\n- [x] **Semantic search** — On send, query the active knowledge base and\n      inject top-K chunks into the system prompt\n- [x] **Citation display** — Show which chunks were used per assistant\n      message, with click-to-open\n- [x] **Citation persistence** — Citations survive page reload (stored\n      alongside message in IndexedDB)\n\n**Release gate**: a question answered using a chunk shows a citation that\nopens to the exact span of the source document; reload preserves it.\n\nReleased: 2026-04-26\n\n#### v0.27 — Tools, Function calling, MCP\n\nPhase 6 advanced — the **only** sanctioned tools work. Net-new built-in\nmini-tools (calculator / clock / unit converter / JSON formatter / one-shot\nweb-search button / standalone formatter) are **out of scope**: they\ndistract from the function-calling / plugin / MCP work that actually\nlets users plug in *any* tool. Mini-tools, if at all, ship later **as\nplugins** through the system below.\n\n- [x] **Function calling** — Parse model tool-call outputs (OpenAI-style\n      `tool_calls` JSON) and dispatch to in-browser functions\n- [x] **Plugin system** — Load third-party tool plugins from URL\n      (JSON manifest declaring `name / description / inputSchema /\n      handlerUrl`)\n- [x] **MCP client** — Connect to an MCP server (WebSocket transport) and\n      expose its tools to the model\n- [x] **Tool call inspector** — A panel that shows the request / response\n      / latency of every tool call in a session\n\n**Release gate**: a user installs one external plugin from URL or connects\nto one MCP server, the model invokes a tool from it, and the inspector\nshows the full request / response.\n\nReleased: 2026-04-26\n\n#### v0.28 — Collaboration \u0026 Sharing\n\n- [x] **Share conversations** — Generate a shareable static HTML export\n      (no server)\n- [x] **Import/export** — Full data import / export (sessions, personas,\n      settings, knowledge bases) as a single `.monday` zip\n- [x] **WebDAV sync** — Cross-device sync via user-supplied WebDAV server\n- [x] **Shared personas** — Publish a persona to a static community\n      registry (curated JSON file in the repo)\n- [x] **Conversation forking** — Branch a session at any message;\n      branches are siblings, navigable in the sidebar\n\n**Release gate**: round-trip import → export → re-import preserves every\nsession, persona and knowledge base byte-for-byte.\n\nReleased: 2026-04-26\n\n#### v0.29 — Desktop, PWA polish \u0026 shortcuts\n\n- [x] **Update prompt** — Banner when a new service worker is installed\n- [x] **Offline indicator** — Header chip when offline; gracefully\n      disable cloud-only features\n- [x] **Background notifications** — Notify when a long generation\n      completes while the tab is hidden (uses existing\n      `useNotifications`)\n- [x] **Desktop app** — Tauri wrapper that targets macOS / Windows / Linux\n- [x] **Keyboard shortcuts overlay** — `?` opens a list of every shortcut\n      (Cmd+K / Cmd+N / Cmd+⇧S / Cmd+E …); shortcuts also documented in\n      the README\n- [x] **Multi-window** — Open a conversation in a separate browser\n      window / Tauri window with shared IndexedDB\n\n**Release gate**: a Tauri build runs on macOS with full chat + RAG +\ntools functionality; offline mode degrades gracefully.\n\nReleased: 2026-05-31\n\n#### v0.30 — Agent mode \u0026 analytics\n\n- [x] **Multi-turn memory** — Auto-summarize early turns when the context\n      window is exceeded; summaries are visible and editable\n- [x] **Agent mode** — Multi-step task execution with tool use (an outer\n      planner loop on top of v0.27 function calling)\n- [x] **Model chaining** — Pipeline: fast model drafts → large model\n      refines, configurable per persona\n- [x] **Batch generation** — Generate N responses in parallel and pick\n      the best\n- [x] **Usage analytics** — Local-only dashboard: model usage, tokens\n      consumed, average tps, sessions per day\n- [x] **i18n** — Multi-language interface (English, 中文, 日本語) with\n      language picker in settings\n- [x] **Accessibility** — Screen-reader landmarks, keyboard-only\n      navigation, high-contrast theme\n\n**Release gate**: a documented agent-mode demo solves a 3-step task\n(search → summarize → save) end-to-end with zero manual intervention.\n\nReleased: 2026-04-27\n\n#### v0.31 — Code Arena / Showdown Mode\n\nA richer evolution of the existing **Model Comparison** view, inspired by\n[WebDev Arena](https://web.lmarena.ai), [Design Arena](https://designarena.ai)\nand the indie \"Grass Field challenge\" rigs that show up in Twitter dual-pane\nscreenshots: same prompt → two models → live HTML/canvas preview → shareable\nrecording. Net-new vs. v0.2's plain text-only comparison.\n\n- [x] **Dual artifact panes** — Side-by-side terminal-style cards with\n      provider badge, model name, status (`pending / streaming / done`)\n      and generation duration in seconds\n- [x] **Sandboxed iframe preview** — Each pane mounts the streamed\n      HTML/CSS/JS into a `sandbox=\"allow-scripts\"` iframe, refreshed on\n      every chunk (debounced) and on a manual **↻ Run** button\n- [x] **Code ↔ Preview tabs** — Per-pane toggle between rendered preview\n      and source view, with a **Copy** button on each\n- [x] **Synchronized scroll** — Code view in both panes scrolls in\n      lockstep (line-aligned) to make diffs obvious\n- [x] **Challenge prompt library** — Curated presets (Grass Field, Solar\n      System, Pelican on a Bicycle, Tetris, Snake, Bouncing Balls,\n      Particle System, CSS Loader Gallery), one-click load into the arena\n- [x] **Recording \u0026 video export** — `MediaRecorder` captures both\n      iframes as a synchronized timelapse `.webm` (default 30 fps,\n      configurable), with a small \"@username\" watermark from settings\n- [x] **PNG share card** — Export a single PNG with both final previews,\n      model names, durations and watermark — sized for Twitter (16:9)\n- [x] **Verdict \u0026 local leaderboard** — `Team A / Tie / Team B` voting UI;\n      results persisted in IndexedDB and aggregated into a per-model\n      win/tie/loss table (purely local, no upload)\n\n**Release gate**: a user picks two models, loads the \"Grass Field\"\npreset, hits Send, sees both iframes animate side-by-side, exports a\n`.webm` with watermark, votes a winner, and the leaderboard updates.\n\nReleased: 2026-04-29\n\n#### v1.0 — External LLM Providers \u0026 Web Search _(stable)_\n\nThe \"1.0\" promise: anything saved in v1.0 keeps working until v2.0.\n\n- [x] **OpenAI-compatible API** — Configure any OpenAI-compatible endpoint\n      (custom base URL + API key, stored encrypted in IndexedDB)\n- [x] **Ollama integration** — Connect to a local Ollama server\n      (`http://localhost:11434`) with model auto-discovery\n- [x] **LM Studio** — Connect to LM Studio's local OpenAI-compatible\n      server\n- [x] **llama.cpp server** — Connect to `llama.cpp --server` HTTP mode\n- [x] **vLLM** — Connect to a vLLM inference endpoint\n- [x] **DeepSeek API** — First-class DeepSeek cloud provider (chat +\n      reasoner models)\n- [x] **Provider switcher** — Per-session toggle between WebGPU local\n      inference and external API providers\n- [x] **SearXNG integration** — Web search via a user-supplied SearXNG URL\n- [x] **Stable storage schema v1** — Migration registry frozen; future\n      migrations must add, not break, fields\n\n**Release gate**: a 24-hour soak test (1 hour with each provider) passes;\nthe storage migration test from v0.25 → v1.0 round-trips without loss.\n\nReleased: 2026-04-30\n\n#### v1.1 — Skills System\n\nInspired by [OpenClaw's AgentSkills/SKILL.md ecosystem](https://docs.openclaw.ai/tools/skills) and\n[ClawHub](https://clawhub.ai/) (52.7k tools, 12M downloads). Skills sit between personas\n(identity) and plugins (tools): a skill is a **structured capability pack** that teaches\nthe model *how* to behave in a specialized domain — e.g. \"Python Debugger\",\n\"Technical Writer\", \"SQL Analyst\". Multiple skills can be stacked in one session.\n\nPersona = who the AI *is*. Plugin = what tools the AI has. Skill = what the AI *knows\nhow to do* (domain instructions, workflow steps, required-plugin declarations).\n\n- [x] **Skill format** — Skill spec stored in IndexedDB: `name`, `description`,\n      `instructions` (markdown injected into system prompt), `requiredPlugins` (list\n      of plugin URLs/IDs), `version`, `tags`, `icon`\n- [x] **Skill composer** — Per-session skill panel: attach 1–N skills alongside a\n      persona; active skills shown as chips in the session header; skill instructions\n      appended to the system prompt before each turn\n- [x] **Skill registry** — Community skill registry (curated JSON file in the repo,\n      like persona registry) with 20+ launch skills across categories: Coding,\n      Writing, Research, Data, Language, Creative\n- [x] **Skill builder UI** — In-app skill editor: name, description, tag picker,\n      markdown instructions with live token-count estimate, required-plugin picker,\n      export as `.monday-skill` JSON\n- [x] **Skill + plugin binding** — A skill can declare required plugins by URL/ID;\n      installing a skill from the registry auto-prompts to install any missing\n      plugins (same flow as v0.27 plugin install)\n- [x] **SOUL.md equivalent** — \"Soul\" tab in the persona editor: a persistent\n      cross-session identity prompt that survives `/new` and session resets; stored\n      in IndexedDB alongside the persona; separate from the per-session system prompt\n- [x] **Skill marketplace UI** — Browse/search/install from the community registry;\n      show tags, install count (local-only counter), author; one-click install\n- [x] **Skill hot-reload** — Changes to an active skill take effect on the next\n      message send (no session restart required)\n\n**Release gate**: a user installs a \"Python Debugger\" skill from the registry, attaches\nit to a new session alongside a persona, sends a debugging question, and the model\nfollows the skill's specialized workflow; the skill persists on page reload; the session\nheader shows the active skill chip.\n\nReleased: 2026-05-03\n\n#### v1.2 — Self-Improving Agent \u0026 Persistent Memory\n\nInspired by the top-trending ClawHub skills: `self-improving-agent` (411k downloads),\n`ontology` typed memory graph (171k downloads), and `self-improving + proactive agent`\n(174k downloads). All state is local-only — nothing leaves IndexedDB.\n\n- [x] **Persistent memory store** — Cross-session key-value memory backed by IndexedDB;\n      the model can read memories at session start and write new ones during the\n      conversation; memories panel shows all entries with edit/delete\n- [x] **Memory namespaces** — Memories scoped to three levels: global (all sessions),\n      per-persona, per-skill; the active session inherits the union of applicable\n      namespaces\n- [x] **Correction capture** — When a user edits or regenerates a message, optionally\n      record the correction as a named memory entry (\"Prefer concise answers\",\n      \"Always use TypeScript strict mode\"); visible in the memories panel\n- [x] **Ontology store** — Typed entity graph: Person, Project, Task, Event, Document;\n      entities have properties + relationships; browsable/editable in a side panel;\n      injected as a compact context block when relevant entities are mentioned\n- [x] **Session compaction with learning** — When compacting long sessions (v0.30\n      multi-turn memory), extract preference signals and entity mentions into the\n      memory store, not just a plain summary; user reviews before committing\n- [x] **Skill Workshop (browser edition)** — After a session ends, the model proposes\n      skill refinements based on corrections, regenerations, and user edits;\n      proposals shown in a diff view; user approves → saved to the relevant skill\n      in IndexedDB\n- [x] **Memory-aware personas** — A persona can declare which memory namespaces it\n      reads on activation (e.g. \"global\" + \"per:this-persona\"); persona editor shows\n      a memory preview panel\n\n**Release gate**: after 3 sessions with a persona, the memory panel shows ≥5\nautomatically captured preferences; a Skill Workshop proposal is generated, approved,\nand the next session reflects the updated skill instructions.\n\nReleased: 2026-05-03\n\n#### v1.3 — Browser-Use \u0026 Computer-Use (In-Browser Agent Loop)\n\nInspired by [Claude Code's `computer_use` tool](https://github.com/anthropics/claude-code)\n(screenshot → observe → action loop in a sandboxed VM), [browser-use](https://github.com/browser-use/browser-use)\n(90.4k ⭐ — LLM-controlled Playwright agent with skills directory and action primitives),\n[Playwright MCP](https://github.com/microsoft/playwright-mcp) (31.4k ⭐ — accessibility-tree\nMCP server used by VS Code / Cursor / Codex), and\n[Codex CLI's](https://github.com/openai/codex) sandboxed bash/file/edit execution model.\nExtends the v0.30 agent loop and v0.27 MCP client into a full browser-use and\nin-browser computer-use system.\n\n**Three execution tiers** of increasing capability:\n\n- **Tier 1 — Sandboxed iframe agent**: model generates HTML/CSS/JS → renders in a\n  `sandbox=\"allow-scripts\"` iframe → `html2canvas` screenshot → model observes →\n  next action. 100% in-browser, zero external dependencies.\n- **Tier 2 — DOM-state computer-use**: serialize the active iframe's accessibility\n  tree to compact JSON and inject as a context block; model issues action commands\n  (click, type, scroll, navigate); dispatcher translates to DOM events. Inspired by\n  Playwright MCP's accessibility-tree approach — no vision model required.\n- **Tier 3 — Playwright MCP bridge**: connect Monday's v0.27 MCP client to a\n  locally-running `@playwright/mcp` server; full external-browser control\n  (navigate real URLs, fill forms, run tests) with model in the loop; every\n  action logged in the existing tool-call inspector.\n\n- [x] **Agent action primitives** — `navigate`, `click`, `type`, `scroll`,\n      `extract-text`, `take-screenshot`, `read-dom`; each is a named MCP-style\n      tool callable by the model via the v0.27 function-calling layer\n- [x] **Sandboxed iframe execution loop (Tier 1)** — generate → render in\n      `sandbox=\"allow-scripts\"` iframe → `html2canvas` screenshot → attach as\n      image to next LLM call → iterate; debounced auto-refresh + manual ↻ Run;\n      reuses the iframe infra planned for v0.31 Code Arena\n- [x] **DOM-state capture (Tier 2)** — serialize active iframe's accessibility\n      tree (ARIA roles, labels, input states) to compact JSON injected into context\n      before each model turn; depth + node-count budget to stay token-safe\n- [x] **Vision mode (Tier 1/2)** — `OffscreenCanvas` / `html2canvas` screenshot\n      attached as base64 image in the next LLM call; requires a multimodal model\n      (e.g. Qwen-VL); falls back to DOM-state mode for non-vision models automatically\n- [x] **Playwright MCP bridge (Tier 3)** — one-click connect in the MCP panel;\n      Monday auto-discovers `@playwright/mcp` if already configured;\n      domain allowlist + blocked-origins enforced per task brief\n- [x] **Task brief (AGENTS.md / CLAUDE.md equivalent)** — per-task markdown config\n      declaring goal, allowed domains, step budget, and stop criteria;\n      stored in IndexedDB; shown as a collapsible header above the agent thread\n- [x] **Agent audit trail** — chronological log of every action + observation +\n      screenshot thumbnail; collapsible per step inside the chat thread; inspired by\n      Codex CLI's terminal-log citation model and Codex Web's task-delegation audit view\n- [x] **Async task queue** — \"delegate and come back\" UI inspired by Codex Web:\n      submit a browser task, minimize the panel, get notified via the v0.29\n      background notification system when the agent finishes or needs human input\n- [x] **Sandbox security model** — Tier 1: `sandbox=\"allow-scripts\"` only (no\n      `allow-same-origin`); Tier 3: domain allowlist + `--blocked-origins` forwarded\n      to Playwright MCP; credentials redacted in audit trail logs (mirrors\n      browser-use's `fill()` debug-log redaction practice)\n\n**Release gate**: a user opens the agent panel, gives the task \"fill in the sandboxed\nform and click Submit\", the agent executes ≥5 actions (screenshot → click → type →\nsubmit → screenshot), the audit trail shows every step with thumbnails, the async\ntask queue marks it done and triggers a notification, and the final iframe state\nis visible in the panel.\n\nReleased: 2026-05-12\n\n#### v1.4 — Persona Marketplace \u0026 Image Input\n\nExtending the persona system (v1.1) with community discovery and multimodal input.\n\n- [x] **Persona marketplace browsing** — Browse community personas from the curated\n      registry (already exists as `PERSONA_REGISTRY`); add search/filter by category,\n      sort by install count; one-click install to the local persona store; shows\n      persona preview (system prompt snippet, params, soul) before installing\n- [x] **Image input** — Paste or drop an image into the chat input; for vision-capable\n      models, the image is attached as a base64 data URL in the next LLM call;\n      non-vision models show a graceful \"vision not available\" message ✅\n- [x] **Full PWA** — Service worker with cache-first strategy for app shell + model\n      weights; offline fallback page; install banner on repeat visits from desktop ✅\n\n**Release gate**: a user browses the persona marketplace, installs a new persona,\nswitches to it in a session, and the persona's soul and system prompt are active;\na user pastes an image into chat and the vision model processes it.\n\nReleased: 2026-05-13\n\n#### v1.5 — Voice \u0026 TTS — Multimodal I/O\n\nVoice input and text-to-speech output for hands-free interaction,\ninspired by [Open WebUI's voice features](https://github.com/open-webui/open-webui) and\n[NextChat's voice support](https://github.com/ChatGPTNextWeb/NextChat).\n\n- [x] **Voice input** — Browser Speech Recognition API for voice-to-text in the chat input;\n      real-time transcription with interim results shown as placeholder text;\n      stop button to end recording; automatic send on silence detection (configurable timeout) ✅\n- [x] **TTS output** — Web Speech API text-to-speech for assistant responses; per-message play/pause/stop controls;\n      voice selector (if available); auto-play toggle in settings;\n      graceful fallback message when TTS is not supported ✅\n\n**Release gate**: a user speaks into the microphone, sees real-time transcription,\nand the text is sent as a message; a user plays TTS on an assistant message\nand the browser speaks the response.\n\nReleased: 2026-05-13\n\n\n#### v1.6 — Context Injection\n\nAllow users to attach reusable text and code snippets to any session.\nSnippets are injected into the system prompt before each turn, giving\nthe model persistent context without requiring full RAG.\n\n- [x] **Context library** — Create, name, and organize text/code snippets;\n      each snippet has a title, content (markdown), and optional category tag\n- [x] **Session context attachment** — Attach one or more snippets to a session;\n      attached snippets appear as a collapsible context block in the chat header ✅\n- [x] **Context injection** — Attached snippets are prepended to the system\n      prompt before each turn; context is visible in a \"Context\" panel alongside\n      the message thread\n- [x] **Quick context** — One-click context templates (e.g. \"Project README\",\n      \"API Reference\", \"Coding Standards\") loaded from a built-in catalog ✅\n- [x] **Context search** — Search the snippet library by title and content;\n      filter by category ✅\n\n**Release gate**: a user creates a snippet, attaches it to a session, and the\nmodel's response reflects knowledge of the snippet content.\n\nReleased: 2026-05-30\n\n#### Cross-cutting standing rules\n\nThese apply to **every** version and are enforced by the cron:\n\n1. **No \"miscellaneous mini-tool\" releases.** A built-in tool that takes\n   \u003c1 day to implement (calculator, clock, formatter, converter,\n   one-shot web-search button) does **not** count as a version and\n   **must not** be added directly. Such utilities ship later as\n   first-class plugins via the v0.27 plugin / MCP system, not as\n   bespoke React components.\n2. **HEARTBEAT.md cites the current target version + the exact\n   checkbox(es) in flight.** The Next Steps list is taken verbatim from\n   this file, not invented.\n3. **Local-first invariant** — every new feature must work with the\n   default WebGPU + IndexedDB stack; remote providers are additive.\n4. **Storage schema is versioned** — any IndexedDB schema change ships\n   with a forward migration in `src/lib/storage.ts`.\n5. **No skipping versions** — if v0.25 is unfinished, work on v0.25 only.\n   If every checkbox in the current version is blocked, the cron must\n   spend the slot on tests, docs, refactors or accessibility for that\n   version, **not** on a later version or on net-new mini-tools.\n\n### Historical phases (for reference)\n\nPhases 1–3, Phase 0.8 and parts of Phases 4 / 6 shipped in v0.2 → v0.21.\nThey remain documented below as a record but are **not authoritative**\nfor future work — the `### Versioned task breakdown` above is.\n\n\u003e Note: v0.22–v0.24 (Calculator / Web Search / Unit Converter / JSON\n\u003e Formatter / Current Time) were rolled back on 2026-04-25 because they\n\u003e bypassed this Roadmap. Those features will return only as plugins via\n\u003e v0.27.\n\n#### Phase 1 — Core Chat Enhancement (v0.2.x)\n\u003e Bring chat to feature parity with basic ChatGPT UX\n\n- [x] **Markdown rendering** — Render assistant responses with proper Markdown, code blocks, syntax highlighting\n- [x] **Code copy button** — One-click copy for code blocks\n- [x] **LaTeX support** — Math equation rendering with KaTeX\n- [x] **System prompt** — Customizable system prompt per session\n- [x] **Generation params** — Temperature, top_p, max_tokens sliders\n- [x] **Auto-scroll control** — Pause auto-scroll when user scrolls up\n- [x] **Chat export** — Export conversations as Markdown/JSON\n- [x] **Token counter** — Display tokens/sec and total token usage\n- [x] **Message actions** — Copy, regenerate, edit user messages\n\n### Phase 2 — Model Management (v0.3.x)\n\u003e Rich model lifecycle and expanded model support\n\n- [x] **Model cache manager** — View/delete cached models, show disk usage\n- [x] **More models** — Add Llama 3.2 1B/3B, DeepSeek-R1-Distill, Mistral 7B, Stable Code 3B\n- [x] **Model benchmarks** — Auto-run speed benchmark on load, show tokens/sec\n- [x] **Custom model import** — Load custom MLC-compiled models from URL\n- [x] **Model comparison** — Side-by-side generation from two models\n- [x] **Download resume** — Resume interrupted model downloads with progress persistence\n- [x] **Storage quota** — Show browser storage used vs available\n\n### Phase 3 — Prompt Templates \u0026 Personas (v0.7.x)\n\u003e Inspired by NextChat masks, GPT-Runner presets, LobeHub agents\n\n- [x] **Prompt templates** — Pre-built conversation starters (coding assistant, translator, tutor, etc.)\n- [x] **Custom personas** — Create/save/share AI personas with system prompts + params\n- [ ] **Persona marketplace** — Browse community-shared personas (static JSON registry)\n- [x] **Quick prompts** — Slash commands (`/translate`, `/code`, `/explain`) in chat input\n- [ ] **Context injection** — Attach text/code snippets as context before sending\n\n### Phase 4 — Multimodal \u0026 Rich Input (v0.5.x)\n\u003e Add vision and file capabilities as models support them\n\n- [ ] **Image input** — Paste/upload images for vision models (when WebGPU vision models available)\n- [ ] **File upload** — Attach text files as conversation context\n- [ ] **Drag \u0026 drop** — Drag files directly into chat\n- [ ] **Clipboard paste** — Intelligent paste handling (images, code, rich text)\n- [ ] **Voice input** — Browser Speech Recognition API for voice-to-text\n- [ ] **TTS output** — Read assistant responses aloud via Web Speech API\n\n### Phase 5 — Knowledge \u0026 RAG (v0.6.x)\n\u003e Local-first retrieval augmented generation, inspired by Open WebUI RAG\n\n- [ ] **Document upload** — Upload PDFs, TXT, MD files\n- [ ] **Client-side chunking** — Split documents into chunks in-browser\n- [ ] **Browser vector store** — IndexedDB-based vector storage\n- [ ] **Embedding model** — Run small embedding model via Web-LLM\n- [ ] **Semantic search** — Query uploaded documents before sending to LLM\n- [ ] **Citation display** — Show which document chunks were used in response\n- [ ] **Knowledge bases** — Organize documents into named collections\n\n### Phase 6 — Tools \u0026 Plugins (v0.7.x)\n\u003e Function calling and tool use, inspired by LobeHub plugins and Open WebUI tools\n\n- [ ] **Function calling** — Parse model tool-call outputs and execute browser-side functions\n- [ ] **Built-in tools** — Calculator, current time, unit converter, JSON formatter\n- [ ] **Web search** — Browser-side web search integration (via public APIs)\n- [ ] **Code execution** — Sandboxed JavaScript execution in iframe\n- [ ] **Artifacts** — Render generated HTML/SVG/Mermaid in preview panel (like NextChat artifacts)\n- [ ] **Plugin system** — Load third-party tool plugins from URL (JSON manifest)\n- [ ] **MCP client** — Model Context Protocol support for external tool servers\n\n### Phase 0.8 — Personalization \u0026 Discovery (v0.8.x)\n\u003e Personalized experience and easier conversation discovery\n\n- [x] **Model usage tracking** — Automatically track which models you use most\n- [x] **Recommended models** — Top 3 most-used models displayed in Model Selector\n- [x] **Reset recommendations** — Clear usage history to reset model recommendations\n- [x] **Session search** — Search conversations by title in the sidebar\n- [x] **Date filtering** — Filter sessions by Today, Yesterday, This Week, This Month\n- [ ] **Model usage stats** — Visual chart of model usage frequency\n- [x] **Recent models** — Quick access to recently used models\n\n### Phase 7 — Collaboration \u0026 Sharing (v0.9.x)\n\u003e Social features inspired by LobeHub channels and Open WebUI community\n\n- [ ] **Share conversations** — Generate shareable link (static HTML export)\n- [ ] **Import/export** — Full data import/export (sessions, personas, settings)\n- [x] **WebDAV sync** — Sync data across devices via WebDAV (like NextChat)\n- [ ] **Shared personas** — Publish personas to community registry\n- [ ] **Conversation forking** — Branch a conversation at any message\n\n### Phase 8 — Desktop \u0026 PWA (v0.9.x)\n\u003e Expand beyond browser tab, inspired by Jan desktop and NextChat Tauri\n\n- [ ] **Full PWA** — Offline-capable progressive web app with service worker\n- [ ] **Install prompt** — Smart install banner for mobile and desktop\n- [ ] **Notifications** — Background generation completion notifications\n- [ ] **Desktop app** — Tauri wrapper for native macOS/Windows/Linux\n- [ ] **Keyboard shortcuts** — Full keyboard navigation (Cmd+K, Cmd+N, etc.)\n- [ ] **Multi-window** — Open conversations in separate windows/tabs\n\n### Phase 9 — Advanced AI Features (v1.0.x)\n\u003e Towards a complete local AI workstation\n\n- [ ] **Multi-turn memory** — Compress long conversations for extended context\n- [ ] **Agent mode** — Multi-step task execution with tool use\n- [ ] **Model chaining** — Pipeline: fast model drafts → large model refines\n- [ ] **Batch generation** — Generate multiple responses and pick best\n- [ ] **A/B testing** — Compare model outputs with user ratings\n- [ ] **Usage analytics** — Local analytics dashboard (model usage, tokens, sessions)\n- [ ] **i18n** — Multi-language interface (English, 中文, 日本語, etc.)\n- [ ] **Accessibility** — Screen reader support, keyboard navigation, high contrast\n\n### Phase 10 — External LLM Providers \u0026 Web Search (v1.1.x)\n\u003e Connect to cloud and local AI servers alongside native WebGPU inference\n\n- [ ] **OpenAI-compatible API** — Configure any OpenAI-compatible endpoint (custom base URL + API key)\n- [ ] **Ollama integration** — Connect to a local Ollama server (http://localhost:11434)\n- [x] **LM Studio** — Connect to LM Studio's built-in OpenAI-compatible local server\n- [x] **llama.cpp server** — Connect to llama.cpp's HTTP server (`--server` mode)\n- [x] **vLLM** — Connect to a vLLM inference server endpoint\n- [x] **DeepSeek API** — First-class DeepSeek cloud API provider (chat + reasoner models)\n- [x] **Provider switcher** — Toggle between WebGPU local inference and external API providers in-session\n- [x] **SearXNG integration** — Web search via a self-hosted SearXNG instance URL\n- [ ] **Web search tool** — Inject search results as context before sending to the model\n\n---\n\n## Keyboard Shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `⌘K` | Toggle Command Palette |\n| `⌘N` | New Chat |\n| `⌘⇧S` | Stop Generation |\n| `⌘1` | Models |\n| `⌘2` | Model Cache |\n| `⌘3` | Usage Statistics |\n| `⌘4` | Persona Marketplace |\n| `⌘5` | Knowledge |\n| `⌘6` | Model Comparison |\n| `⌘7` | Model Benchmark |\n| `⌘8` | Custom Model Import |\n| `⌘9` | Plugins |\n| `⌘0` | MCP Servers |\n| `⌘⇧E` | Export All Data |\n| `⌘⇧I` | Import Data |\n| `?` | Keyboard Shortcuts Overlay |\n\nOn Windows/Linux, replace `⌘` with `Ctrl`.\n\n---\n\n## Development\n\n```bash\nnpm install          # Install dependencies\nnpm run dev          # Start dev server (http://localhost:5173)\nnpm run build        # Production build to dist/\nnpm run preview      # Preview production build\n```\n\n## Requirements\n\n- Chrome 113+ or Edge 113+ (WebGPU support required)\n- GPU with 2GB+ VRAM recommended\n- ~200MB–2GB storage per model (cached in browser)\n\n## Project Structure\n\n```\nmonday/\n├── public/\n│   ├── favicon.svg            # App icon (purple gradient smiley)\n│   ├── apple-touch-icon.svg   # iOS home screen icon\n│   └── manifest.json          # PWA manifest\n├── src/\n│   ├── App.tsx                # Root: view router, state orchestration\n│   ├── App.css                # All component styles\n│   ├── components/\n│   │   ├── Sidebar.tsx        # Session list, brand, version link\n│   │   ├── ModelSelector.tsx  # Model cards with BorderBeam\n│   │   ├── MessageList.tsx    # Chat message rendering\n│   │   ├── ChatInput.tsx      # Input textarea with send/stop\n│   │   ├── Changelog.tsx      # Expandable release history\n│   │   ├── ThemeToggle.tsx    # Light/Dark/System switcher\n│   │   └── WebGPUCheck.tsx    # WebGPU compatibility warning\n│   ├── hooks/\n│   │   ├── useChat.ts         # Session/message/streaming state\n│   │   ├── useModel.ts        # Model load/unload/progress\n│   │   └── useTheme.ts        # Theme persistence + system detection\n│   ├── lib/\n│   │   ├── engine.ts          # Web-LLM singleton, streamChat()\n│   │   ├── models.ts          # Model registry (7 models)\n│   │   ├── storage.ts         # IndexedDB CRUD\n│   │   └── changelog.ts       # Version history data\n│   └── types/\n│       └── index.ts           # TypeScript interfaces\n├── index.html                 # Entry HTML with mobile meta tags\n├── vite.config.ts             # Vite config (base: '/monday/')\n└── package.json               # v0.1.0\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funbug%2Fmonday","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funbug%2Fmonday","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funbug%2Fmonday/lists"}