A cute AI-powered desktop pet duck for macOS. Lives on your desktop, chats with you via LLM, keeps a mindfulness journal, and can even generate custom character art.
Built with Swift + AppKit, powered by the MiniMax API (or any OpenAI-compatible endpoint).
- Desktop Pet β Borderless animated duck that lives on your desktop
- AI Chat β Double-click to chat with the duck via LLM (MiniMax, OpenAI, or any compatible API)
- Journal System β 5 mindfulness templates (Odyssey Plan, Wheel of Life, 12 Month Celebration, Fear Setting, Solomon's Paradox) + custom prompts
- AI Journal Summary β After each journal entry, the LLM generates a reflective summary
- AI Character Generation β Describe a character and the app generates a custom pet image via MiniMax image-01
- Configurable β Everything adjustable via Preferences: size, bubbles, timeout, context window, window level
- Bubble Stack β Messages appear as floating bubbles above the duck, with scrollable, auto-expiring options
- Window Levels β Always on Top / Normal / Always at Bottom
- Status Bar Menu β Quick access to Preferences, Journal, and quit
- macOS 13+ (Ventura or later)
- Python 3.7+ with
Pillow(for character generation) - MiniMax API key (or any OpenAI-compatible API)
Install Pillow:
pip3 install Pillow- Download
DesktopDuck.zipfrom the latest release - Unzip and move
DesktopDuck.appto your Applications folder - On first launch, right-click β Open (to bypass Gatekeeper)
- Open Preferences (right-click duck β Preferences, or β,) and enter your API key
- Double-click the duck to start chatting!
# Clone the repo
git clone https://github.com/ShiyangZheng/DesktopDuck.git
cd DesktopDuck
# Build the app
swiftc -o duck-pet duck-pet.swift
# Set up the app bundle
mkdir -p DesktopDuck.app/Contents/{MacOS,Resources}
cp duck-pet DesktopDuck.app/Contents/MacOS/
cp duck-idle.gif pet-auto-reply.py pet-generate-character.py \
pet-journal-summary.py pet-random-content.py pet-think.py \
DesktopDuck.app/Contents/Resources/
# Create Info.plist (or use the included one)
# Set up config
mkdir -p ~/.workbuddy
cp duck-config.json.template ~/.workbuddy/duck-config.json
# Edit ~/.workbuddy/duck-config.json to add your API key
# Launch
./DesktopDuck.app/Contents/MacOS/duck-pet &All settings live in ~/.workbuddy/duck-config.json. The Preferences panel (right-click β Preferences) provides a GUI for everything.
| Setting | Description | Default |
|---|---|---|
minimax_api_key |
Your MiniMax API key (required) | β |
llmModel |
Model name | MiniMax-M2.7 |
llmUrl |
API endpoint | https://api.minimax.io/v1/chat/completions |
user_name |
What the duck calls you | (empty) |
ai_name |
What the duck calls itself | Duck |
scale |
Duck size multiplier (1β8) | 2.0 |
windowLevel |
0=bottom, 1=normal, 2=top | 2 |
bubbleTimeout |
Seconds before bubbles auto-dismiss (0=never) | 0 |
Set in duck-config.json:
{
"minimax_api_key": "sk-your-openai-key",
"llmUrl": "https://api.openai.com/v1/chat/completions",
"llmModel": "gpt-4o-mini"
}Any OpenAI-compatible endpoint works (Ollama, Groq, etc.).
| Action | How |
|---|---|
| Chat | Double-click the duck |
| Quick reply | Click the duck (random fun fact) |
| Close bubble | Click the β on a bubble |
| Move duck | Drag the duck anywhere |
| Preferences | Right-click β Preferences or β, |
| Journal Entry | Right-click β Journal Entry |
| View Journal | Right-click β View Journal |
| Window Level | Right-click β Always on Top / Normal / Always at Bottom |
| Clear History | Right-click β Clear Chat History |
- Odyssey Plan β Design 3 radically different 5-year futures
- Wheel of Life β Rate satisfaction across 8 life dimensions
- 12 Month Celebration β Write toasts celebrating your future achievements
- Fear Setting β Define, prevent, and repair worst-case scenarios
- Solomon's Paradox β Get perspective by talking about yourself in third person
After each journal session, view your entries and click Refresh to generate AI-powered summaries.
- Open Preferences β scroll to "Generate Character Image"
- Describe your character (e.g., "cute pixel art cat, chibi style")
- Click Generate β MiniMax image-01 creates the character
- Preview appears β click Apply to use it as your pet
- Click Restore Default Duck to go back
DesktopDuck/
βββ duck-pet.swift # Main Swift application
βββ duck-idle.gif # Default duck sprite
βββ pet-auto-reply.py # AI chat engine
βββ pet-generate-character.py # AI image generation + GIF creation
βββ pet-journal-summary.py # AI journal summary generator
βββ pet-random-content.py # Fun fact generator
βββ pet-think.py # External communication helper
βββ kill.sh # Stop the duck
βββ duck-config.json.template # Config template
βββ DesktopDuck.app/ # Built app bundle (not in git)
βββ README.md
When you use the openclaw-/hermes- based agent application workbuddy, you can tell it to deliver key thinking-processes to our duck, so that you can see the results of running tasks with a simple, lazy glance on the corner of your desktop.
duck-config.jsonβ Your configuration (API key, preferences)chat-history.jsonβ Chat conversation historyjournal.jsonβ Journal entries and AI summariespet-thoughts.jsonβ Real-time communication between processesduck-custom/β Generated character images
MIT License β see LICENSE file.
Built with β€οΈ using Swift, AppKit, and the MiniMax API. Original duck GIF from keyfarm (MIT licensed).



