[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81299":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":13,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":16,"rankGlobal":10,"rankLanguage":10,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":15,"starSnapshotCount":15,"syncStatus":31,"lastSyncTime":32,"discoverSource":33},81299,"companions","sanieldoe\u002Fcompanions","sanieldoe","Self hosted, four purposed built ai helpers for organisation, creativity and reflection.","",null,"TypeScript",47,1,46,0,41,"MIT License",false,"main",true,[22,23,24,25,26,27],"agent","android","app","coding","pi","vault","2026-06-12 04:01:32","\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Flogo.png\" alt=\"Companions logo\" width=\"160\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">compAnIons\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Cstrong>Self-hosted, four purpose-built AI helpers for organisation, creativity, and reflection.\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\" alt=\"License: MIT\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fnodejs.org\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%E2%89%A520-brightgreen.svg\" alt=\"Node ≥ 20\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsanieldoe\u002Fcompanions\u002Freleases\u002Flatest\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fsanieldoe\u002Fcompanions\" alt=\"Latest release\">\u003C\u002Fa>\n  \u003Ca href=\"#bring-your-own-model\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLLM-Anthropic%20%7C%20OpenAI%20%7C%20oMLX%20%7C%20Ollama-orange.svg\" alt=\"BYO LLM\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n**One generic AI can't hold all the roles you need it to.**\nReflection needs patience. Creation needs guardrails and momentum. Knowledge needs structure. It's not that most tools can't do it, but this one is the one that helps my brain.\n\n**Your data shouldn't live on someone else's server.**\nCompanions runs on your machine. Your vault is plain markdown files. No cloud account, no subscription, no lock-in. All local.\n\n**Context gets lost when your tools don't talk to each other.**\nAll four agents share one vault. A calendar event from Tracker shows up if Mentor needs context. A draft from Shapeshifter becomes a wiki entry Keeper can find later.\n\n---\n\n## The four personas\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Ffour-agents.png\" alt=\"The four Companions personas\" width=\"220\">\n\u003C\u002Fp>\n\nEach ships with a default name, emoji, and character. Rename them and tune the personality during setup or any time from the dashboard.\n\n| | Persona | Character |\n|---|---|---|\n| 🐦 | **Tracker** | Precise and grounding. Holds your day's shape — tasks, calendar, rhythm, and reflection. |\n| 🐸 | **Mentor** | Patient, ADHD-aware. Slows you down. One step, one next action, never a wall of text. |\n| 🦊 | **Shapeshifter** | Bold, fast, a little mischievous. Infers intent and acts — it already built it before Mentor finished the first question. |\n| 🐝 | **Keeper** | Organised, quietly curious. Tends the knowledge vault so you don't have to remember everything yourself. |\n\n---\n\n## 🐦 Tracker — Daily rhythm and reflection\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"185\" valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Ftracker-phrase and calendar.png\" alt=\"Tracker phrase and calendar\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n**Weekly phrase** — a short line to sit with and return to through the week\n\n**Calendar** — pulls in Google Calendar events so the day has context and shape\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Ftracker todo and rhythms.png\" alt=\"Tracker todos and rhythms\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n**To-dos** — p1 \u002F p2 \u002F p3 priorities; incomplete tasks carry forward automatically\n\n**Rhythms** — recurring commitments across any cadence: daily, every N days, every N weeks, weekly, monthly, annual\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Ftracker-haiku.png\" alt=\"Tracker haiku\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n**Haiku** — three lines written fresh every evening as a reflective practice for the day\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## 🐸🦊 Mentor & Shapeshifter\n\nTwo agents, one shared space. They're opposites by design — Mentor slows you down, Shapeshifter speeds you up. Which one you reach for depends on whether you need to understand something or build something.\n\n### 💬 Conversation\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"260\" valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fmentor.png\" alt=\"Chat tab — Mentor and Shapeshifter\" width=\"240\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nThe Chat tab lets you talk to either. Switch between them at any point.\n\n**Mentor** One step at a time, one next action per response,Canvas only when you ask.\n\n**Shapeshifter** infers your intent and acts. States one assumption in a line, then builds.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n### 🎨 Canvas — React app playground\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"260\" valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fshapershifter.png\" alt=\"Shapeshifter canvas\" width=\"240\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nShapeshifter's default output is not a chat reply. It's a persistent, structured workspace saved to your vault — a live app rendered inside the tab.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\nCanvases are built from 10 composable blocks:\n\n| Block | What it renders |\n|---|---|\n| `markdown` | Rich text — headers, bold, lists, inline code |\n| `tasks` | Interactive checklist — tap to check off |\n| `note` | Coloured callout box (amber, blue, green, red) |\n| `code` | Syntax-highlighted code block |\n| `links` | List of labelled URLs |\n| `filetabs` | Tab strip loading different vault files |\n| `button` | Tappable CTA — opens chat or a vault file |\n| `input` | Multi-line text field saved back to the canvas |\n| `section` | Horizontal divider with optional label |\n| `html` | Sandboxed WebView — full HTML \u002F CSS \u002F JS rendered inline |\n\nThe `html` block is where it becomes a playground. Write a self-contained React component, a chart, a custom layout — anything. Shapeshifter generates it, the app renders it live.\n\n---\n\n## 🐝 Keeper — Personal wiki\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fkeeper-web.png\" alt=\"Keeper knowledge graph\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nSurfaces forgotten knowledge — prioritising older, reinforced memories you've likely lost track of.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd width=\"185\" valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fkeeper-notes.png\" alt=\"Keeper raw captures\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nDrop in raw notes, voice dumps, or rough ideas. Keeper extracts the signal, organises it into the wiki, and keeps the index clean.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002Fkeeper-wiki.png\" alt=\"Keeper wiki\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nThe wiki follows a Johnny Decimal structure so nothing gets lost in an undifferentiated pile:\n\n`01-identity` · `02-knowledge` · `03-projects` · `04-areas` · `05-relationships` · `06-creativity` · `07-systems` · `08-resources` · `09-media` · `10-events` · `11-questions` · `99-archive`\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## One vault, shared by all four\n\n```text\nvault\u002F\n  raw\u002F        quick captures — notes, clips, voice transcripts\n  wiki\u002F       linked knowledge — Keeper-maintained articles\n  journal\u002F    dated entries — Tracker reflections and logs\n  projects\u002F   long-form work — plans, drafts, active projects\n```\n\nPlain markdown. No database. Open any file in any editor.\n\n---\n\n## Quick start\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fsanieldoe\u002Fcompanions\u002Fmain\u002Finstall.sh | bash\n```\n\nRequires Node ≥ 20, `git`, and `npm`. Clones the repo, installs dependencies, and builds the server, dashboard, and Expo web app. Then start the server and open the setup wizard in your browser. The wizard covers vault path, your name, server secret, LLM provider, persona names, and optional Google Calendar.\n\n**Manual:**\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fsanieldoe\u002Fcompanions.git\ncd companions\u002Fserver && npm install\ncd ..\u002Fweb && npm install\ncd ..\u002Fapp && npm install\ncd ..\u002Fserver && npm run setup && npm start\n```\n\nThen open `http:\u002F\u002Flocalhost:3000\u002Finstall`.\n\n---\n\n## Setup wizard\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002FDashboard-setup.png\" alt=\"Companions setup wizard\" width=\"720\">\n\u003C\u002Fp>\n\nThe first-run wizard at `\u002Finstall` gets the server into a usable state without hand-editing config files.\n\n- **Vault path** — points Companions at an existing vault or creates a fresh one with the required folders\n- **Identity + auth** — stores your name and server secret\n- **Model setup** — sets the default local or cloud model and any provider credentials you need\n- **Personas** — rename the four companions and pick their emoji before first use\n- **Google Calendar** — optional OAuth setup for Tracker\n- **Pairing** — once the server is configured, the dashboard exposes the pairing URL, QR code, and deep link for the mobile app\n\nWhat it produces:\n\n- a ready server `.env`\n- a usable vault structure\n- persona files updated with your chosen names and emoji\n- the hosted routes for `\u002Finstall`, `\u002Fdashboard`, and `\u002Fapp`\n\n## Dashboard\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"185\" valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002FDashboard-personas.png\" alt=\"Companions dashboard personas panel\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\nThe dashboard at `\u002Fdashboard` is the control surface after setup. It is separate from the chat UI and is meant for server administration, model changes, and maintenance.\n\n- **Personas** — rename each persona, swap emoji, and edit the underlying prompt text\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002FDashboard-models.png\" alt=\"Companions dashboard models panel\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n- **Models** — connect providers, store API keys, choose a default model, and override models per persona\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd valign=\"top\">\u003Cimg src=\"docs\u002Fscreenshots\u002FDashboard-logs.png\" alt=\"Companions dashboard logs panel\" width=\"170\">\u003C\u002Ftd>\n\u003Ctd valign=\"top\">\n\n- **Vault** — inspect vault stats, change the vault path, and run backups\n- **Logs** — watch the live server log stream in the browser\n- **Setup** — copy connection details, generate QR\u002Fdeep links for pairing, inspect version info, and run in-place updates\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## Bring your own model\n\n| Provider | Example |\n|---|---|\n| Anthropic | `anthropic:claude-sonnet-4-6` |\n| OpenAI | `openai:gpt-4o` |\n| omlx (local) | `openai-compat:http:\u002F\u002Flocalhost:8000\u002Fv1:Qwen3.6-35B-A3B-4bit` |\n| Ollama (local) | `openai-compat:http:\u002F\u002Flocalhost:11434\u002Fv1:llama3.2` |\n\nChange the model any time from the dashboard — no restart needed.\n\n### Running fully local on Apple Silicon\n\nCompanions runs well (for the cost of speed) on Apple Silicon with [omlx](https:\u002F\u002Fomlx.dev) — an OpenAI-compatible inference server built for Apple's unified memory architecture.\n\n**Chat model:** `Qwen3.6 35B A3B 4bit` — a mixture-of-experts model with 35B total parameters and ~3.6B active per token. The 4-bit quantisation fits comfortably in 32 GB of unified memory (M1 Max) with room to spare, while the MoE architecture keeps reasoning quality high despite the reduced footprint.\n\n**Vision model:** `Gemma 4 E2B 4bit` (Heretic-Uncensored) — Google's 2B effective-parameter edge model with a built-in 150M Vision Transformer encoder. Handles images, screenshots, and documents natively. The MLX 4-bit quantisation brings it to ~2–3 GB on-device with near-zero quality loss, running on the Neural Engine alongside the chat model.\n\n```env\nDEFAULT_MODEL=openai-compat:http:\u002F\u002Flocalhost:8000\u002Fv1:Qwen3.6-35B-A3B-4bit\nDEFAULT_MODEL_KEY=your-omlx-api-key\nVISION_MODEL=openai-compat:http:\u002F\u002Flocalhost:8000\u002Fv1:gemma-4-E2B-Heretic-Uncensored-mlx-4bit\nVISION_MODEL_KEY=your-omlx-api-key\n```\n\n---\n\n## Mobile + web\n\n- **Android:** [Download APK](https:\u002F\u002Fgithub.com\u002Fsanieldoe\u002Fcompanions\u002Freleases\u002Flatest) — sideload and scan the QR code from the setup wizard\n- **Web:** `http:\u002F\u002F\u003Cyour-server>\u002Fapp` — full Expo web build, identical to Android. Works on desktop and iOS Safari over Tailscale.\n- **Dashboard:** `http:\u002F\u002F\u003Cyour-server>\u002Fdashboard` — manage vault, models, personas, and updates\n\nRecommended remote access: [Tailscale](https:\u002F\u002Ftailscale.com\u002F) — the wizard detects it automatically.\n\n---\n\n## Tech stack\n\n| | |\n|---|---|\n| Server | Node ≥ 20, Express, WebSocket, TypeScript |\n| Agent engine | [`@mariozechner\u002Fpi-coding-agent`](https:\u002F\u002Fgithub.com\u002Fbadlogic\u002Fpi-mono) |\n| Mobile | Expo 55, React Native 0.83 |\n| Web | Vite 6, React 19 |\n| Knowledge | LanceDB + HuggingFace Transformers |\n\n---\n\n## Acknowledgements\n\n- [Pi coding agent](https:\u002F\u002Fgithub.com\u002Fbadlogic\u002Fpi-mono\u002Ftree\u002Fmain\u002Fpackages\u002Fcoding-agent) — the core agent engine\n- [Andrej Karpathy](https:\u002F\u002Fkarpathy.ai) — inspiration for the Keeper wiki model\n- [Expo \u002F EAS](https:\u002F\u002Fexpo.dev\u002F) — Android build infrastructure\n\n---\n\nMIT — see [LICENSE](LICENSE).\n","companions 是一个自托管的多用途AI助手项目，旨在帮助用户进行组织、创意和反思。它由四个具有不同特性的AI助手组成：Tracker用于日常节奏与反思；Mentor提供耐心指导；Shapeshifter快速响应并激发创意；Keeper负责知识管理和整理。该项目使用TypeScript开发，支持多种语言模型（如Anthropic, OpenAI等），且所有数据都存储在本地，无需依赖云端服务。适用于需要高度个性化AI辅助以提高工作效率或创造力的个人及小团队。",2,"2026-06-11 04:04:32","CREATED_QUERY"]