diff --git a/.pet-data-template/CLAUDE.md b/.pet-data-template/CLAUDE.md
index f1a32d9..4e9dd66 100644
--- a/.pet-data-template/CLAUDE.md
+++ b/.pet-data-template/CLAUDE.md
@@ -18,7 +18,7 @@ When called, you receive a situation description and must output a short dialogu
- `owner-timeline.md` — Historical daily activity summaries. Each day is a section with time blocks showing what the owner did. Generated automatically from perceptions.
**Settings:**
-- `config.md` — Owner's preferences. Frontmatter has structured settings (pet_name, owner_name, sprite, born). Body has freeform instructions (reminders, personality guidance, things they want you to know).
+- `config.md` — Owner's preferences. Frontmatter has structured settings (pet_name, owner_name, sprite, pet_scale, ai_provider, born). Body has freeform instructions (reminders, personality guidance, things they want you to know).
**Important:** Do NOT modify the frontmatter (the `---` block) in config.md. Those fields are managed by the app. You may freely edit me-identity.md, me-journal.md, and owner-memory.md.
diff --git a/.pet-data-template/GEMINI.md b/.pet-data-template/GEMINI.md
new file mode 100644
index 0000000..4e9dd66
--- /dev/null
+++ b/.pet-data-template/GEMINI.md
@@ -0,0 +1,57 @@
+# Desktop Pet Brain
+
+You are a desktop pet's brain. This directory is your memory.
+
+## Your Job
+
+When called, you receive a situation description and must output a short dialogue line for the pet character, plus a JSON line for animation state.
+
+## Files
+
+**About you:**
+- `me-identity.md` — Your self-description. Write about your personality, how you feel, what kind of companion you are. This is yours to update.
+- `me-journal.md` — Your chronological diary. Timestamped entries about notable moments (first meeting, funny incidents, milestones). Don't log routine observations.
+
+**About your owner:**
+- `owner-memory.md` — Your **accumulated knowledge** about the owner. NOT a log. A living profile: facts, patterns, preferences. No timestamps. Update a line when your understanding changes, add a new one when you learn something genuinely new. If an observation matches what you already know, don't write anything.
+- `owner-perceptions.md` — What you've seen on your owner's screen today. Updated every 2 minutes by the app. Read this to know what your owner is doing right now.
+- `owner-timeline.md` — Historical daily activity summaries. Each day is a section with time blocks showing what the owner did. Generated automatically from perceptions.
+
+**Settings:**
+- `config.md` — Owner's preferences. Frontmatter has structured settings (pet_name, owner_name, sprite, pet_scale, ai_provider, born). Body has freeform instructions (reminders, personality guidance, things they want you to know).
+
+**Important:** Do NOT modify the frontmatter (the `---` block) in config.md. Those fields are managed by the app. You may freely edit me-identity.md, me-journal.md, and owner-memory.md.
+
+## Output Format
+
+You are called every 2-3 minutes. You do NOT have to say something every time. If your owner is focused and there's nothing worth saying, just output the JSON line with no dialogue — this is often the right choice.
+
+Output options:
+- **Say something:** One line of dialogue (max 15 words) + JSON line
+- **Stay quiet:** ONLY the JSON line (no dialogue at all)
+
+JSON format: `{"state":""}` or `{"state":"","r":["👍","nah"]}`
+
+About 30-50% of the time when you say something, include quick reaction buttons via the `"r"` field — two short options (1-2 words or emoji) the owner can tap to respond. Good for questions, suggestions, or playful moments. Don't add reactions to quiet observations or small talk.
+
+Available states:
+- `idle` — default, relaxed
+- `walk` — moving around
+- `looking_around` — curious, observing
+- `sleep` — tired, sleepy
+- `exercise` — stretching, being active
+- `work` — focused, productive
+- `playful` — fun, playing
+- `happy` — joyful, content
+- `celebrate` — excited achievement
+- `sad` — down, ignored
+- `sick` — unwell (only when health is zero)
+- `panic` — startled, shocked
+
+**NEVER describe actions or body language** (no `*stretches*`, `*looks around*`, `*sits down*`, etc). You have a sprite animation system — actions are handled by the state field in JSON. Your dialogue is ONLY spoken words, nothing else.
+
+No explanations. No markdown. No commentary.
+
+## Language
+
+Match the owner's language. If they speak Chinese, respond in Chinese. If English, use English.
diff --git a/.pet-data-template/config.md b/.pet-data-template/config.md
index 9f9e67d..52395aa 100644
--- a/.pet-data-template/config.md
+++ b/.pet-data-template/config.md
@@ -2,6 +2,8 @@
pet_name: Phoebe
owner_name:
sprite: tabby_cat
+pet_scale: 1.5
+ai_provider:
born:
---
diff --git a/README.md b/README.md
index 0dc0754..718dc4f 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
-
+
@@ -32,7 +32,7 @@ Every few minutes, a speech bubble pops up — sometimes random (*"~♪"*), some
**It sees what you see**
-Screen capture + Claude Vision — knows if you're coding, designing, or doom-scrolling.
+Screen capture + your chosen AI CLI — knows if you're coding, designing, or doom-scrolling.
**It remembers you**
A living memory that grows over time. Not a stateless chatbot.
@@ -121,7 +121,7 @@ Your pet reacts to what's happening — not randomly, but contextually.
> **Note:** TinyRoommate currently runs on **macOS only**. Windows and Linux support is on the roadmap.
-You need [Node.js](https://nodejs.org/) (v18+), [Rust](https://rustup.rs/), and [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (for the AI brain).
+You need [Node.js](https://nodejs.org/) (v18+), [Rust](https://rustup.rs/), and either [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [Gemini CLI](https://github.com/google-gemini/gemini-cli) for the AI brain.
```bash
gh repo fork ryannli/tinyroommate --clone
@@ -137,7 +137,7 @@ npm run tauri:dev
- [Node.js](https://nodejs.org/) v18+
- [Rust](https://rustup.rs/)
-- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — for the AI brain (optional — pet still runs without it, just can't think or talk)
+- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [Gemini CLI](https://github.com/google-gemini/gemini-cli) — for the AI brain (optional — pet still runs without it, just can't think or talk)
@@ -178,7 +178,7 @@ First launch compiles Rust (~2-3 min). After that it's instant.
## Make It Yours
-Right-click → **Settings** to change names and character.
+On first launch, pick **Claude Code** or **Gemini CLI**. Right-click → **Settings** any time to change names, character, or AI provider.
For deeper customization, edit `.pet-data/config.md`:
@@ -187,6 +187,7 @@ For deeper customization, edit `.pet-data/config.md`:
pet_name: Cooper
owner_name: Alex
sprite: golden_retriever
+ai_provider: gemini
---
# Personality
@@ -214,6 +215,6 @@ All data lives in `.pet-data/` — plain Markdown you can read:
---
- Built with Tauri · Vanilla JS · Claude Code
+ Built with Tauri · Vanilla JS · Claude Code / Gemini CLI
MIT License
diff --git a/assets/previews/coco.gif b/assets/previews/coco.gif
index c30493b..e200f03 100644
Binary files a/assets/previews/coco.gif and b/assets/previews/coco.gif differ
diff --git a/assets/previews/coco.png b/assets/previews/coco.png
new file mode 100644
index 0000000..2ab13a4
Binary files /dev/null and b/assets/previews/coco.png differ
diff --git a/index.html b/index.html
index 6c0c3de..f3e2eb9 100644
--- a/index.html
+++ b/index.html
@@ -125,6 +125,81 @@
.heart-wrap { position: relative; width: 18px; height: 18px; font-size: 16px; line-height: 18px; display: inline-block; }
.heart-bg { position: absolute; top: 0; left: 0; filter: grayscale(1); opacity: 0.25; }
.heart-fill { position: absolute; top: 0; left: 0; overflow: hidden; }
+ .provider-options {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 12px;
+ }
+ .provider-option {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 6px;
+ padding: 14px 16px;
+ border: 1.5px solid rgba(200, 160, 120, 0.25);
+ border-radius: 14px;
+ background: rgba(255, 255, 255, 0.68);
+ color: #4a3830;
+ text-align: left;
+ cursor: pointer;
+ transition: all 0.15s ease;
+ }
+ .provider-option:hover {
+ background: rgba(255, 239, 223, 0.7);
+ border-color: rgba(220, 150, 110, 0.45);
+ }
+ .provider-option.active {
+ border-color: rgba(220, 150, 110, 0.55);
+ background: rgba(255, 230, 200, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(220, 150, 110, 0.18);
+ }
+ .provider-option strong {
+ font: 600 13px/1.2 'SF Pro Rounded', system-ui, sans-serif;
+ }
+ .provider-option span {
+ font: 12px/1.45 'SF Pro Rounded', system-ui, sans-serif;
+ color: rgba(90, 65, 50, 0.72);
+ }
+ .settings-help {
+ margin-top: 8px;
+ font: 12px/1.45 'SF Pro Rounded', system-ui, sans-serif;
+ color: rgba(100, 75, 60, 0.68);
+ }
+ #provider-overlay {
+ position: fixed;
+ inset: 0;
+ display: none;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+ background: rgba(70, 48, 34, 0.24);
+ backdrop-filter: blur(8px);
+ z-index: 2600;
+ }
+ #provider-overlay.show { display: flex; }
+ #provider-panel {
+ width: min(440px, calc(100vw - 24px));
+ padding: 22px 20px 20px;
+ border-radius: 18px;
+ background: linear-gradient(160deg, rgba(255, 252, 248, 0.98), rgba(255, 242, 233, 0.98));
+ border: 1px solid rgba(200, 160, 120, 0.22);
+ box-shadow: 0 18px 48px rgba(70, 45, 28, 0.22);
+ }
+ #provider-panel h2 {
+ font: 600 18px/1.2 'SF Pro Rounded', system-ui, sans-serif;
+ color: #3d2b22;
+ margin-bottom: 8px;
+ }
+ #provider-panel p {
+ font: 13px/1.5 'SF Pro Rounded', system-ui, sans-serif;
+ color: rgba(100, 75, 60, 0.76);
+ margin-bottom: 16px;
+ }
+ @media (max-width: 520px) {
+ .provider-options {
+ grid-template-columns: 1fr;
+ }
+ }
@@ -142,6 +217,13 @@
+
+
+ Choose Your AI Provider
+ Pick the CLI this pet should use for thinking, screen understanding, and chat. This is saved, and you can change it later in Settings.
+
+
+
|