Remember Neko chasing your cursor? Or eSheep roaming your taskbar? NekoAI brings that magic back β but now your pet can actually talk, think, and help you.
π nekoai.dev Β· π Download Β· π¬ Showcase Β· π Docs Β· π¨ Create a pet Β· π¬ Community
NekoAI is an open-source, AI-powered desktop pet that lives on your screen. It wanders around your windows, reacts to what you do, and when you need it β it thinks, answers, and helps, right there on your desktop.
It's a love letter to the 90s/00s desktop companions (Neko, eSheep, Shimeji) rebuilt with a modern stack and a real AI brain inside.
You: "Hey Neko, explain this regex real quick"
Neko: *walks over, pops a bubble*
"That matches one or more digits at start of line. *purrs*"
| Windows | MacOS | Linux |
|---|---|---|
![]() |
![]() |
![]() |
ποΈ Full gallery β onboarding, chat, pet selection, sizes and settings across Windows, macOS, Ubuntu and Fedora: see docs/showcase.md.
| Feature | Status |
|---|---|
| π± Animated sprite pets that roam your desktop | β |
| π±οΈ 8-direction cursor following & movement | β |
| π¬ AI chat via animated speech bubble | β |
| π§ Persistent memory β remembers your name, projects, preferences | β |
| π Multi-provider AI (Claude, OpenAI, Gemini, NVIDIA NIM, Ollama local) | β |
| π΄ Dynamic mood β energy changes with time of day & idle time | β |
| π Multiple pets β Classic Neko, Pingu, Pac-Man, BSD Daemon, Tabby, TIE Fighter | β |
| π Pet house β spawn point at bottom-right corner, click to bring pet home | β |
| π Proactive nudges ("coding 90 min β take a break!") | β |
| π₯οΈ System tray β hide/show, switch pets, settings | β |
| π Adjustable pet size (S/M/L/XL) with pixel-perfect scaling | β |
| π±οΈ Right-click context menu β quick settings & pet size adjustment | β |
| π¬ Tunable AI response length β S / M / L / Custom (32β4096 tokens) | β |
| πͺ Zero-config onboarding β auto-detects Ollama; walks pet out from house corner | β |
| π NekoMetrics β anonymous keystroke / mouse / pet-step counters in a tooltip | π v0.4 |
| π₯ BongoCat-style reactive paw animations driven by keystrokes | π v0.4 |
| π Daily/weekly/monthly activity history & GitHub-style heatmap | π v0.4 |
| π· NekoCapture β screenshots with username/date/app/comment footer | π v0.6 |
| πΌοΈ Customizable screenshot borders (color, thickness, rounded corners, shadow) | π v0.6 |
| βοΈ NekoAnnotate β full-screen drawing overlay (pen, shapes, arrows, text) | π v0.7 |
| π Cross-platform (Windows, macOS, Linux) | π Planned |
| π§© Plugin system for custom behaviors | π Planned |
| π£οΈ Voice interaction (TTS/STT) | π Planned |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Your Desktop β
β β
β ββββββββββββ ββββββββββββββββββββββββββββ β
β β VSCode β β "You've been coding 90 β β
β β β β min. Stretch break? πΎ" β β
β ββββββββββββ π±β ββββββββββββββββββββββββββββ β
β β roams, reacts to what you open β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Click pet or type to chat
β
βΌ
βββββββββββββββββββββββ
β AI Provider β
β Claude / OpenAI / β
β Gemini / NVIDIA / β
β Ollama (local) β
βββββββββββββββββββββββ
β
Response in animated speech bubble
Facts extracted β saved to SQLite
Go to Releases and grab the latest installer for your OS.
| Platform | File |
|---|---|
| Windows | NekoAI_x.x.x_x64.msi |
| macOS | NekoAI_x.x.x_aarch64.dmg |
| Linux | NekoAI_x.x.x_amd64.AppImage |
Linux note: The
.AppImageneeds no installation βchmod +xit and run it directly. If you prefer the.deb, install it from a terminal withsudo apt install ./nekoai_x.x.x_amd64.debβ GNOME Software / the Ubuntu Software Center cannot reliably install local.debfiles and may fail with a generic error.Wayland & cursor following: On a Wayland session (the default on Fedora, recent Ubuntu and others) NekoAI runs through XWayland and cannot read the global cursor position directly. To let the pet follow your mouse it reads raw motion from
/dev/input, which requires your user to be in theinputgroup:sudo usermod -aG input $USER # then log out and back inWithout this NekoAI still runs β it switches to wanderer mode and roams on its own, and tells you so once. Xorg sessions need no setup. See Cursor Tracking on Wayland for the details.
# Prerequisites: Node.js 22+, pnpm 11+, Rust 1.75+, Tauri CLI
git clone https://github.com/nucket/nekoai.git
cd nekoai/NekoAI
pnpm install
pnpm tauri dev # Development with hot reload
pnpm tauri build # Production buildRight-click the pet to open the context menu where you can:
- β Settings β configure AI provider, API key, model, response length, and your name
- πΎ Select Pet β switch between available pets
- π Size β adjust pet size (S=32px, M=64px, L=96px, XL=128px) for pixel-perfect rendering
- π¬ Response length β pick S / M / L (256 / 512 / 1024 tokens) or set a Custom value (32β4096). Medium is the default and covers most replies; pick Short for snappy answers on local Ollama, Long for detailed technical explanations, Custom when you want exact control.
Configuration is auto-created on first run:
# ~/.config/nekoai/config.toml (auto-created on first run)
provider = "gemini" # "anthropic" | "openai" | "gemini" | "nvidia" | "ollama"
api_key = "AIza..." # Stored locally, never sent anywhere
model = "gemini-2.5-flash"
pet_size = 64 # pixels (32, 64, 96, or 128)
max_tokens = 512 # 256 (Short) | 512 (Medium, default) | 1024 (Long) | 32β4096 (Custom)πͺ New user? NekoAI auto-detects a running Ollama instance and configures itself on first launch β no settings required. Otherwise it guides you to set up your preferred provider.
π Privacy first: NekoAI has no backend server. All data stays on your machine. The only outbound calls are the AI API calls you configure.
NekoAI builds a persistent context for every conversation:
- Pet personality β defined per-pet in
pet.jsonviasystem_prompt - User facts β extracted automatically from conversations and stored in SQLite (
~/.local/share/nekoai/memory.db). Includes name, current projects, preferred language, etc. - Conversation history β last 20 messages sent as context on every turn; the speech bubble also shows your recent turns when reopened, so the pet never looks like it forgot
- Dynamic mood β pet's current energy/happiness/curiosity subtly influences its tone
System prompt = pet personality
+ known facts about user
+ current mood description
Facts are extracted with pattern matching after each exchange and saved to the user_facts SQLite table. You can inspect them directly:
sqlite3 ~/.local/share/nekoai/memory.db "SELECT * FROM user_facts;"| Provider | Models | Requires |
|---|---|---|
| Anthropic | Claude Haiku, Sonnet | API Key |
| OpenAI | GPT-4o mini, GPT-4o | API Key |
| Gemini 2.5 Flash (default), 2.0 Flash... | Free API Key (Google AI Studio) β no credit card | |
| NVIDIA NIM | Llama 3.1, Mistral, Nemotron, MiniMax... | API Key (build.nvidia.com) β free tier available |
| Ollama | Llama 3, Mistral, Phi-3... | Ollama running locally |
π‘ For full privacy: Use Ollama β 100% local, no API costs, no data leaves your machine. π’ Free models: NVIDIA NIM offers a generous free tier with 40+ open-source models at build.nvidia.com.
The pet's mood updates every 60 seconds based on:
| Signal | Effect |
|---|---|
| Time of day (6amβ8pm) | Energy peaks at midday, drops at night |
| OS idle time | Energy drains gradually while inactive |
| Active app category | Curiosity rises when coding; relaxes otherwise |
Mood affects:
- Animations β yawns after 3 min idle, falls asleep after 5 min
- AI tone β sleepy pet gives shorter, quieter answers; curious pet asks follow-ups
| Pet | ID | Personality |
|---|---|---|
| π± Classic Neko | classic-neko |
Playful, curious β short bursts, occasional nya~ |
| π§ Pingu | penguin-pixel |
Cheerful and clumsy, bounces back from every stumble |
| π‘ Pac-Man | pac-man |
Always hungry, obsessed with dots β very short waka-waka replies |
| π BSD Daemon | bsd-daemon |
Wry Unix sysadmin β terse, accurate, mildly smug about BSD |
| π Tabby | tabby |
Dignified and old-school β the original X11 cat, calm and unhurried |
| π TIE Fighter | tie-fighter |
Imperial officer β formal, brief, always scanning for Rebel scum |
Switch pets via right-click β Select Pet, or from the system tray menu.
Want to create your own? See Creating a Pet.
NekoAI/
βββ src-tauri/ # Rust backend (Tauri v2)
β βββ capabilities/
β β βββ default.json # Window permissions (main, panel, house)
β βββ src/
β βββ lib.rs # App setup, tray, Tauri commands, resize_window
β βββ desktop_monitor.rs # Active window & idle time (Windows + Linux/X11)
β βββ cursor_tracker.rs # Wayland cursor fallback β reads /dev/input via evdev
β βββ storage.rs # SQLite: conversation history, user facts, config
β
βββ src/ # TypeScript / React frontend
β βββ App.tsx # Main pet window β movement, events, AI, rendering
β βββ HouseWindow.tsx # Pet house widget (separate Tauri window "house")
β βββ PanelWindow.tsx # Context menu / settings panel (window "panel")
β βββ main.tsx # Entry point β routes to App / HouseWindow / PanelWindow
β βββ ai/
β β βββ index.ts # Provider factory, system prompt builder
β β βββ memory.ts # Fact extraction & persistence (SQLite IPC)
β β βββ types.ts # AIProvider interface, Message type
β β βββ providers/ # anthropic.ts Β· openai.ts Β· gemini.ts Β· ollama.ts Β· nvidia.ts
β βββ components/
β β βββ SpeechBubble.tsx # Animated chat bubble β scramble text, sprite-anchored, preloads recent history
β β βββ SettingsPanel.tsx # Settings panel (API key, model, pet size)
β β βββ ContextMenu.tsx # Right-click context menu (settings, pet, size)
β β βββ PetSelector.tsx # Pet picker with dynamic window resizing
β βββ hooks/
β β βββ usePetMovement.ts # 8-direction movement, overridePosition, EdgePhase state machine
β β βββ useIdleSequencer.ts # Classic Neko stopβwashβscratchβyawnβsleep idle sequence
β β βββ useMoodEngine.ts # Energy/happiness/curiosity + animation overrides
β β βββ useDesktopContext.ts # Active window detection & app categorization
β β βββ useOnboarding.ts # First-launch state machine (Ollama auto-detect β done)
β βββ store/
β βββ index.ts # Zustand store (mood, active pet, animation)
β βββ configStore.ts # AI config & pet size persisted via Tauri commands
β
βββ pets/ # Pet definitions (bundled with app)
βββ manifest.json # Registry of all available pets
βββ classic-neko/ # π± pet.json + sprites/
βββ penguin-pixel/ # π§ pet.json + sprites/ (Pingu)
βββ pac-man/ # π‘ pet.json + sprites/
βββ bsd-daemon/ # π pet.json + sprites/
βββ tabby/ # π pet.json + sprites/
βββ tie-fighter/ # π pet.json + sprites/
NekoAI uses a Tauri command (resize_window) to bypass OS-level restrictions when the window has resizable: false in its configuration. This is necessary because:
- Why
resizable: false? β Creates a truly frameless window (no title bar, borders, or resize handles) - The problem: The Windows API removes the
WS_THICKFRAMEwindow style when a window is created as non-resizable, and JavaScript APIs cannot restore it at runtime - The solution: A Rust-side command calls
window.set_size()directly, completely bypassing the JS API limitation
This allows the speech bubble, settings panel, pet selector, and context menu to dynamically expand/collapse without the user seeing the resize handles.
NVIDIA's integrate.api.nvidia.com endpoint is designed for server-to-server usage and does not send CORS headers. Unlike the other providers (Anthropic, OpenAI, Gemini) which explicitly support browser CORS, a direct fetch() from Tauri's WebView would be silently blocked.
NekoAI works around this with a dedicated nvidia_chat Tauri command (lib.rs) that makes the HTTP request from native Rust via reqwest, completely bypassing the WebView's CORS enforcement. The TypeScript provider uses invoke('nvidia_chat', ...) instead of fetch. This keeps the same AIProvider interface for all providers while letting NVIDIA NIM work correctly.
NekoAI reads the global cursor position to make the pet follow your mouse. On
Windows, macOS and Linux/Xorg this is a direct OS query. On a Wayland session
it isn't: NekoAI runs as an XWayland client, and X11's XQueryPointer only
reports a live position while the pointer is over one of NekoAI's own windows β
everywhere else it returns a frozen value, so the pet appears to stop following
the cursor.
The workaround lives in cursor_tracker.rs. On a Wayland session it reads raw
relative mouse motion straight from /dev/input via the evdev crate,
integrates an absolute position, and reconciles it against XQueryPointer
whenever that reading updates. Reading /dev/input requires the user to be in
the input group (sudo usermod -aG input $USER); when no device is readable
the cursor_tracking_status command reports unavailable and the pet
automatically falls back to wanderer mode so it still feels alive.
All pet sizes are integer multiples of the native 32px sprite:
- S = 32px (1Γ)
- M = 64px (2Γ)
- L = 96px (3Γ)
- XL = 128px (4Γ)
This ensures crisp, pixelated rendering without anti-aliasing artifacts. Non-integer scales (like 48px = 1.5Γ) cause uneven pixel mapping and visible borders. CSS sizes are injected dynamically via inline styles in App.tsx, not hardcoded in App.css.
NekoAI is community-first. Ways to contribute:
- πΎ Create a new pet β see Creating a Pet
- π Report bugs β open a detailed Issue
- π‘ Suggest features β Discussions tab
- π§βπ» Code β check good first issues
Read CONTRIBUTING.md before submitting.
Join our Discord server to chat, share your pets, get help, and follow development:
Channels available in: English π¬π§ | EspaΓ±ol πͺπΈ | PortuguΓͺs π§π·
| Version | Focus |
|---|---|
| v0.1 β | Core: transparent window, Neko sprite, cursor tracking, AI chat |
| v0.2 β | Persistent memory, dynamic mood engine, pet house window, new pets (Pingu, Pac-Man, BSD Daemon, Tabby, TIE Fighter), 8-direction movement |
| v0.3 β | Zero-config onboarding (Ollama auto-detect), Gemini as default provider, NVIDIA NIM provider, classic Neko idle/edge sequencer, restrictive CSP, multi-OS CI matrix, passive install metrics pipeline, Wayland cursor tracking via evdev, tunable response length (S/M/L) |
| v0.4 π | NekoMetrics β anonymous keystroke / mouse / pet-step counters with house right-click menu, animated tooltip above the house, daily/weekly/monthly history, GitHub-style heatmap, BongoCat-style reactive paw animations |
| v0.5 π | Accessories/skins system, sound effects, sprite scale slider, community pet gallery in-app, mini-games |
| v0.6 π | NekoCapture β native screenshots with metadata footer (username, timestamp, app name, comments), customizable borders & shadows, clipboard/file export, hotkeys |
| v0.7 π | NekoAnnotate β full-screen drawing overlay (pen, shapes, arrows, text, highlighter) with undo/redo, inspired by ZoomIt Draw; annotate before saving screenshots |
| v1.0 π | Cross-platform stable release, plugin API, voice support |
NekoAI is the latest chapter in a 38-year chain started by a tiny Japanese program in 1988.
The original creators β their work made this possible:
| Name | Contribution | Year |
|---|---|---|
| Naoshi Watanabe (θ₯η°ι¨ η΄) | Created NEKO.COM β the original cursor-chasing cat |
~1988 |
| Kenji Gotoh (εΎθ€ε―ΏεΊ΅) | Designed the iconic 32Γ32 sprites; released them to the public domain | 1989 |
| Masayuki Koba (ε€ε ΄ζ£θ‘) | xneko β X11 port that spawned all Unix lineage |
1990 |
| Tatsuya Kato (ε θ€ιδΉ) | oneko β Linux/BSD port; still installable today (apt install oneko) |
1990 |
| David Harvey | Neko95/Neko98 β Win32 port with footprints and installer |
1997β2000 |
Standing on the shoulders of:
- eSheep β the Windows XP sheep that proved desktop pets still had an audience
- Shimeji β Japanese desktop mascot framework with physics and interactions
- Eliot Akira's WebNeko β the browser revival that brought Neko to a new generation
- Tauri β for making sub-10MB native desktop apps actually possible in 2026
π The full story β from a 1988 NEC PC-9801 to AI-powered conversations β is in STORY-Neko.md.
MIT Β© 2026 Naudy Castellanos
Free to use, modify, and distribute. Attribution appreciated.
If NekoAI made you smile, give it a β β it helps a lot!
π nekoai.dev Β· β hi@nekoai.dev Β· π€ naudycastellanos.com
Made with β and deep nostalgia for Windows XP β by Naudy Castellanos



