Doop
Doop is an open-source multiplayer design canvas and design MCP for Claude Code, Codex, and any AI agent. Design side by side with agents — free in beta.
翻譯準備中
A cozy AI wallpaper studio for Windows — prompt building, AI image generation, style filtering, and automatic wallpaper rotation.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗🎨 Meet Pip, the Chief Curator Pip is the official mascot of FROGPAPER. While he might look like he’s about to paint a masterpiece with his trusty brush and beret, his real job is making sure your phone and computer screen looks amazing without selling your data. Pip believes in open-source, privacy, and the perfect pixel. Say hi to him in the issues tab! 🐸
A cozy AI wallpaper studio for your desktop and your phone.
FrogPaper is a two-app wallpaper studio.
No browser. No account. Just the apps and your imagination.
| App | Current version | Platform | Stack |
|---|---|---|---|
| FrogPaper Desktop | 1.7.12 | Windows 10 / 11 | Python 3.11+, Tkinter |
| FrogPaper Mobile | 1.12.0 | Android 7.0+ | Expo / React Native |
1. Install & Launch
pip install -r requirements.txt
python app.py
2. Configure a Provider Open Settings (top of sidebar) and pick a provider under Generation:
# Optional: set HuggingFace token via environment variable
setx HUGGINGFACE_TOKEN hf_your_token_here
3. Generate Your First Wallpaper
Note: The prompt engine warms up in the background after launch. The status bar will show "Warming up prompt engine..." and then "Ready — prompt engine warm." — first prompt generation is instant once that message appears.
Customize defaults? See CONFIG_GUIDE.md — what every config.json key does, the safe ways to hand-edit, and how to change first-run defaults for a build.
FrogPaper-release-signed.apk from the latest FrogPaper Mobile release.CN=FrogPaper), so there is no need to uninstall first.Generating needs a reachable FrogPaper backend; the app ships pointing at the public one. Your own API keys stay on the phone.
FrogPaper is a complete wallpaper creation and management studio in a single window:
| Feature | Description |
|---|---|
| Three-Column Layout | Sidebar controls, center preview, right gallery panel — everything visible at once |
| Sidebar Controls | 6 structured dropdowns + negative prompt builder, all action buttons at the top |
| Pinned Favorites (★) | Every dropdown item has a star button — pinned choices rise to a "★ FAVORITES" section at the top of each list; manage them all under Settings > Advanced > Favorite Dropdown Items |
| Negative Prompt Builder | Preset checkboxes with term counts, custom terms, live preview, smart negatives |
| 6 AI Providers | Pollinations.ai (free), Cloudflare Workers AI (free tier), Hugging Face Inference, Prodia, Replicate, Fal.ai |
| 26 Model Presets | FLUX.1-schnell, FLUX.1-dev, FLUX.dev, FLUX.pro, SDXL 1.0, SDXL Lightning, Animagine XL 3.1, DreamShaper 8, Playground v2.5, plus custom model IDs |
| Gallery | 7 views (Gallery, Favorites, Styled, Manual, 16:9, Portrait, Square) with sorting and filtering |
| Portrait Export | Bulk export portrait (9:16) images to any destination including SD cards and USB drives |
| Style Transfer | 25 local artistic filters: Oil Painting, Cyberpunk Neon, Gouache, Vaporwave, and more |
| Text Overlay | Add text to any image with font selection, sizing, color, outline, shadow, 5 quick-position presets and click/drag placement |
| Tag System | Tag images, filter gallery by tag, manage tags across all views |
| Slideshow | Auto-rotate wallpapers on timer (1–60 min) with fullscreen auto-pause and duplicate skipping |
| Favorites | Bookmark wallpapers with dedicated slideshow source |
| Sessions | Save and restore complete working states with auto-naming |
| Recipe Library | Save, load, import, export reusable prompt configurations |
| 19 App Themes | Full theme system with dark, light, and specialty color schemes |
| Windows Integration |
FrogPaper Mobile is a separate Android app, not a port of the desktop UI.
Off / Every time I open / Once a day, with Surprise me, My favourites or Random from my gallery as the source. A failed run backs off for 2 hours and names the real retry time.Android requirements: Android 7.0+ (API 24), roughly 80 MB of storage.
All action buttons sit at the top for instant access, followed by a separator, then configuration controls below:
Action Buttons (top):
Configuration Dropdowns:
Every dropdown item carries a ☆ star button on its row. Click the star to pin that choice: pinned items move into a "★ FAVORITES" section at the top of the list and are shown with a ★ prefix when selected, so your go-to subjects and styles are always one click away. Click the star again to unpin. The full favorites manager lives in Settings > Advanced > Favorite Dropdown Items.
Negative Prompt Builder:
Opened via the Settings button, Ctrl+S, or tray menu. Opens in a resizable window with a sidebar navigation on the left and card-based sections on the right. Changes are staged with a sticky Save Settings bar at the bottom (an "Unsaved changes" indicator appears as you edit), and the whole window re-colors live if you switch themes while it is open:
| Category | Cards & Controls |
|---|---|
| General | App theme (19 themes), wallpaper resolution preset (16:9 / Portrait / Square) |
| Generation | AI provider (Pollinations/Cloudflare/HuggingFace), API tokens, Cloudflare Account ID, model selection + custom model |
| Appearance | Wallpaper output format (PNG/JPEG/WebP), JPEG quality |
| Startup | Run on Windows startup, auto-generate on launch + startup subject, system tray behavior |
| Slideshow | Slideshow enable + interval slider (1–60 min), fullscreen auto-pause, source & order, skip duplicates |
| Cloud & Backup | Google Drive / OneDrive / Dropbox connection cards — each with credential fields and a built-in "How to get your credentials" guide that is expanded by default with clickable website links (opens in your browser); auto-backup schedule; Restore from Cloud / Restore from Folder with a dry-run preview, conflict policies and tag import |
| Advanced | Generation behavior (Smart Negatives, Keep subject exact), keyword expansion mappings, Favorite Dropdown Items manager, morning auto-wallpaper scheduler |
| Help | Built-in tutorials (Quick Start, Feature Tour, Interactive Practice, Model Setup) and help resources |
All six providers are selectable under Settings > Generation, each with its own key field and setup guide.
| Model | Notes |
|---|---|
| FLUX (Default) | High quality, no account needed |
| FLUX Realism | Photorealistic output |
| FLUX Anime | Anime-optimized |
| FLUX 3D | 3D-render style |
| FLUX CablyAI | Enhanced quality |
| Turbo (Fast) | Fast generation |
| Model | Notes |
|---|---|
| FLUX.1-schnell (Fast - Free) | Fast generation, free tier |
Requires Account ID and API Token from the Cloudflare dashboard.
| Model | Notes |
|---|---|
| FLUX.1-schnell (Fast - Free) | Fast, free-credit model |
| FLUX.1-dev (Higher Quality - Free Credits) | High quality |
| Custom... | Any Hugging Face model ID |
Requires a token from huggingface.co. Some models require accepting terms on the model page before API access.
| Model | Notes |
|---|---|
| FLUX.schnell (Fast - Free) | Fast generation |
| FLUX.dev (Higher Quality) | Higher quality |
| FLUX.1-fill (Inpainting) | Inpainting |
| SDXL 1.0 | Stable Diffusion XL |
| SDXL Lightning (Fast) | Fast SDXL |
| Animagine XL 3.1 (Anime) | Anime-optimized |
| DreamShaper 8 | Stylized SD |
Pro account required; API key from app.prodia.com.
| Model | Notes |
|---|---|
| FLUX.schnell (Fast - $0.003/img) | Fast and cheap |
| FLUX.dev (Quality - $0.025/img) | Higher quality |
| FLUX.pro (Best - $0.04/img) | Best quality |
| SDXL 1.0 | Stable Diffusion XL |
| SDXL Lightning (Fast) | Fast SDXL |
API token from replicate.com.
| Model | Notes |
|---|---|
| FLUX.schnell (Fast) | Fastest inference |
| FLUX.dev (Quality) | Higher quality |
| FLUX.pro (Best) | Best quality |
| SDXL 1.0 | Stable Diffusion XL |
| Playground v2.5 | Playground model |
API key from fal.ai.
| Mode | Aesthetic |
|---|---|
| Stylized | Digital illustration — bold shapes, vivid colors |
| Realistic | Photorealistic — cinematic lighting, real-world textures |
| Cinematic | Cinematic composition — dramatic angles, film-like grading |
| Anime | Anime/manga style — cel-shaded, vibrant |
| Dark Fantasy | Dark, moody, atmospheric — gothic and ominous |
| Painterly | Oil painting aesthetic — visible brushwork, rich texture |
| Pixel Art | Retro pixel art — crisp edges, limited palette |
| Minimalist | Clean and simple — restrained composition, negative space |
| Product Photo | Studio shot — sharp detail, clean neutral background (auto-remapped for living subjects) |
| Surreal | Dreamlike — impossible scale and atmosphere |
Right-clicking the tray icon gives full app control without opening the window:
| Menu Item | Action |
|---|---|
| Open FrogPaper | Restore main window (double-click default) |
| Open Folder | Open the wallpapers folder in Explorer |
| Settings | Open Settings dialog |
| Tutorials | Open the built-in tutorials |
| Next Wallpaper | Advance to next wallpaper in history |
| Previous Wallpaper | Go back in wallpaper history |
| Random Wallpaper | Set a random image from your gallery instantly |
| Start / Pause / Resume Slideshow | Dynamic label — changes with slideshow state |
| Stop Slideshow | Visible only when slideshow is running |
| About FrogPaper | Version and info dialog |
| Quit FrogPaper | Fully exit the application |
| Shortcut | Action |
|---|---|
Ctrl+G | Switch focus to Gallery |
Ctrl+S | Open Settings |
Ctrl+N | Generate image |
Ctrl+Alt+N | Advance slideshow (global hotkey, requires keyboard package) |
Escape | Close Settings; otherwise show the shortcut hint toast |
FrogPaper/
├── app.py # Main window, layout, events (~2,700 lines)
├── main.py # Entry point
├── app_paths.py # Filesystem layout constants (BASE_DIR, logs, wallpaper dirs)
├── app_prompt_data.py # Dropdown option banks, modes, provider/model tables
├── app_themes.py # 19 theme palettes
├── app_theme_engine.py # apply_theme() and themed-widget generation
├── app_generation_mixin.py # Generate / regenerate pipeline
├── app_cloud_mixin.py # Cloud sync, backup and startup-registry methods
├── app_system_mixin.py # Tray, wallpaper and system integration
├── app_delegates_mixin.py # Delegate helpers for tabs and dialogs
├── app_runtime.py # Runtime bootstrap helpers
│
├── prompt_tab.py # Prompt Builder, Quick Build, Recipe Library, Templates
├── gallery_tab.py # Gallery views, style transfer, text overlay, tags
├── settings_tab.py # Settings window shell with sidebar navigation
├── settings_categories.py # Builders for the 8 settings categories
├── settings_components.py # Reusable settings UI primitives
├── settings_providers.py # Provider selection and API-key fields
├── settings_persistence.py # Save / load settings
├── settings_slideshow.py # Slideshow settings card
├── settings_ux_data.py # Provider and cloud setup guides
│
├── tray_manager.py # System tray icon and menu
├── slideshow.py # Auto-rotation timer and logic
├── session_manager.py # Session save/load (SQLite + JSON fallback)
├── database.py # SQLAlchemy ORM for sessions, favorites, tags
├── history_manager.py # Prompt and wallpaper history
│
├── wallpaper_generator.py # 6 AI provider backends
├── prompt_builder.py # Prompt assembly from components
├── prompt_refiner.py # Prompt optimization
├── prompt_validator.py # Prompt audit and variable validation
├── prompt_library.py # Saved prompt library
├── keyword_expander.py # Keyword expansion (NLTK + sentence-transformers)
├── negative_manager.py # Negative presets, smart negatives, style defaults
├── theme_mixer.py # Theme/prompt generation engine
├── style_transfer.py # 25 local artistic filters (OpenCV + Pillow)
│
├── gallery_manager.py # Gallery metadata, tags, folder management
├── template_system.py # Recipe/template data models
├── preset_manager.py # Preset bundle management
│
├── cloud_providers.py # Google Drive / OneDrive / Dropbox OAuth + API
├── cloud_catalog.py # Read-only view of the cloud backup tree
├── cloud_restore.py # Restore planner (de-duplication, conflicts)
├── restore_ui.py # Restore preview / confirmation dialog
├── backup_manifest.py # Portable backup metadata
├── sync_manager.py # Delta sync engine
├── file_watcher.py # watchdog file monitoring
├── update_checker.py # GitHub release check + installer download
│
├── icons.py # Toolbar icon rendering
├── rounded_widgets.py # Themed rounded-corner widget images
├── ui_effects.py # Gradients, rounded corners, visual polish
├── sv_ttk_fix.py # Recolors sv_ttk sprite images per theme
├── pinned_dropdowns.py # Dropdown widget with pinned favourites
├── tutorial_manager.py # Built-in tutorials
├── thread_manager.py # Background thread/queue management
├── theme.py # Shared visual constants
├── utils.py # Shared utilities; get_app_dir() for EXE-safe paths
├── set_wallpaper.py # Windows wallpaper API (Win32)
│
├── daily_runner.py # Headless daily generation
├── setup_scheduler.py # Task Scheduler integration
├── prebuild_check.py # Secret scan run before PyInstaller
│
├── requirements.txt
├── config.template.json # Clean first-run defaults
├── keywords.json # Thematic keyword bank
├── negative_presets.json # Negative prompt presets
├── presets.json # Saved preset bundles
├── recipes.json # Recipe library
├── templates.json # Prompt template definitions
├── prompt_library.json # Saved prompt library
├── custom_negatives.json # User-added negative terms
├── user_thesaurus.json # User keyword mappings
│
├── run_frogpaper.bat
├── build_frogpaper_exe.bat
├── build_installer.bat
├── FrogPaper.spec
├── rotate_wallpaper.bat
├── run_daily_runner.bat
│
├── .github/workflows/tests.yml # CI: full pytest suite on a Windows runner
├── tests/ # 28 pytest modules (incl. test_prompt_builder.py,
│ # test_keyword_expander.py, cloud / restore / UI tests)
└── sounds/ # App sound effects
User data lives beside the app, not in AppData. utils.get_app_dir() returns the folder containing app.py when running from source, or the folder containing FrogPaper.exe when frozen:
FrogPaper/ # or the folder holding FrogPaper.exe
├── wallpapers/
│ ├── generated/ # AI-generated wallpapers
│ ├── manual/ # Imported images
│ ├── styled/ # Style-filtered outputs
│ └── favorites/ # Bookmarked images
├── logs/
│ ├── prompts_history.json
│ ├── favorites.json
│ ├── presets.json
│ └── sessions.json # JSON fallback for sessions
├── recipes/ # Saved recipes
├── templates/ # Saved templates
├── negative_presets.json # Negative prompt presets
├── config.json # All user settings (auto-created) — see CONFIG_GUIDE.md
├── config.template.json # Clean first-run defaults seeded to config.json
├── FrogPaper.db # SQLite database (sessions, favorites, tags)
├── keywords.json # Thematic keyword bank
├── presets.json # Saved preset bundles
├── recipes.json # Recipe library
├── templates.json # Prompt template definitions
├── prompt_library.json # Saved prompt library
└── custom_negatives.json # User-added negative terms
npm run check:theme.Earlier Android releases: see the frogpaper-mobile releases.
New features:
24h 00m in the status bar.Security fixes:
Image.open().load().Build process:
build_frogpaper_exe.bat now creates a clean venv from requirements.txt before invoking PyInstaller. This makes the build reproducible from the manifest instead of relying on whatever Python environment happens to be on the developer's machine.requirements.txt (Pillow, opencv-python, huggingface-hub, keyring, sqlalchemy, pystray, keyboard). OpenCV stays pinned at 4.8.1.78 deliberately; do not bump it without testing style_transfer.py filters and gallery previews on Windows.Fixes:
Under the Hood:
style_transfer.py: separate CV2_AVAILABLE / PIL_AVAILABLE probes; STYLE_TRANSFER_AVAILABLE requires both for filters, while text overlay only needs PIL.comic_book and a text overlay to a test image before building.Fixes:
Under the Hood:
RELEASE_HIGHLIGHTS in app.py replaces the hardcoded paragraph, so future releases update one tuple instead of a sentence buried in the dialog.Cloud Restore:
Under the Hood:
cloud_restore.py gained _gallery_index() and _find_identical_image(): a size-based pre-filter, then a hash check using the backup's own algorithm (SHA-256, MD5, SHA-1 or Dropbox content hash).Cloud Backup:
Under the Hood:
sync_manager.py _reconcile_remote_ids() runs before hash comparison: it drops ids with no file behind them, repoints ids at the real copy, and leaves ids alone when a provider cannot be listed._detect_changes() counts a file as backed up only when it has a remote id for a provider connected in that run.tests/test_sync_remote_ids.py and tests/test_drive_upload_dedupe.py.Visual:
Under the Hood:
app.py build_ui() logo resize logic simplified from proportional-rectangle to fixed-square.APP_VERSION, build_installer.bat AppVersion and OutputBaseFilename to 1.7.1.New Features:
sounds/halloween-ghost-attack.mp3) instead of the frog ribbit. Every other theme keeps the ribbit, and a missing sound file falls back to it automatically.Under the Hood:
THEME_POPUP_SOUNDS in app_themes.py maps themes to their popup sound files; ThemedDialog._popup_sound_path() resolves the audio per popup, so switching themes takes effect immediately.update_checker.py gained download_installer() (streaming download with progress/cancel), UpdateProgressWindow, and spawn_installer_after_exit() — a detached helper waits for FrogPaper to exit before starting the installer, so it can replace the running EXE without a "file in use" prompt.ThemedDialog._show() accepts an optional primary button label (styled as the primary action and bound to Enter); default behaviour is unchanged.tests/test_theme_popup_sounds.py (theme registration, full token set, sound mapping and fallbacks) and tests/test_update_checker.py (version/URL parsing, release asset selection, streaming download, launch handoff and notification orchestration).Multi-Select Tagging:
Under the Hood:
Look & Feel:
Fixes:
Frog Sneak & Transparency:
off, rare (~5%), classic (~12%, default) or party (~50%). Choose off for never; daily runs vary within your setting.Under the Hood:
FrogPaper.spec and build_installer.bat file lists now match the post-cleanup file setSpeed:
Reliability:
expand_text preserves your capitalization on words it doesn't expand, and thesaurus mapping edits now invalidate the expansion cache immediately (no restart needed)Accessibility:
Technical:
.github/workflows/tests.yml) runs the full suite on a Windows runner on every pushCONFIG_GUIDE.md documenting every config.json key; README points to itbuild_installer.bat / APP_VERSION aligned at 1.5.0Fixes:
load_gallery() only reset the width — not the height — when rebuilding. Fixed by resetting height=0 (Tk uses the widget's natural height) and clearing stale placeholder references from _gallery_placeholders when a ratio view takes over the shared canvas.New Features:
Improvements:
Prefer: wait long-poll with aggressive 1-second polling — generation time dropped from ~65 seconds to ~7–12 secondsTechnical:
AI_PROVIDER_UX dictionary in settings_tab.py drives dynamic provider setup UI_rebuild_provider_setup() creates/destroys provider-specific fields on switchgenerate_image() dispatcher checks actual image dimensions and resizes if needed/v1/models/{owner}/{name}/predictions (no version hash required)save_scheduler_settings_to_config import that produced spurious warningsFixes:
Prefer: wait overheadNew Features:
Improvements:
config.template.json is bundled instead and seeded to config.json beside the EXE on first launch. Existing users' configs are never overwrittenprebuild_check.py before PyInstaller packs the EXE. If any non-empty secret is detected in config.json or config.template.json, the build aborts with exit code 2 — no EXE is producedTechnical:
settings_components.py module providing reusable UI primitives: StatusBadge, SettingRow, SettingCard, ExpandableSection, HelpResourceCard, SidebarNav, CloudProviderCardsettings_tab.py rewritten around the new component system with sidebar navigationconfig.json from FrogPaper.spec datas=[...]; replaced with config.template.jsonutils.seed_bundled_files() now seeds config.json from the bundled template on first launchbuild_installer.bat ships config.template.json renamed to config.json with onlyifdoesntexist flagprebuild_check.py as a pre-build gate (scans for hf_…, GOCSPX-…, AIza…, ya29., Dropbox sl., and other suspicious patterns)APP_VERSION to 1.4.1 to align with installer and GitHub release tagSECURITY_NOTES.md documenting the secure build flow and key-rotation procedureupdate_checker.py persists skipped_update_version in config.json so the skip choice survives across launchesFixes:
unknown color name — fixeddash.cloudflare.com) as clickable links that open in the default browser — the same clickable-link treatment applies to website mentions inside the Tutorials windowNew Features:
Improvements:
Technical:
cloud_providers.py for OAuth and API integrationsync_manager.py for cloud sync engine with delta syncfile_watcher.py for real-time file system monitoringupdate_checker.py with comprehensive markdown cleaningsettings_tab.py with cloud provider connection cardsNew Features:
New Features:
Improvements:
Technical:
get_portrait_images() to gallery_manager.py| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Windows 10 | Windows 11 |
| Python | 3.11 | 3.12+ |
| RAM | 4 GB | 8 GB |
| Storage | 500 MB | 2 GB+ |
| Internet | Required for generation | Stable connection |
| AI provider account | Pollinations (none), or a key for Cloudflare / Hugging Face / Prodia / Replicate / Fal.ai | — |
| Requirement | Minimum |
|---|---|
| OS | Android 7.0 (API 24) |
| Storage | ~80 MB |
| Internet | Required for generation |
| Account | None; optional own Gemini / Hugging Face / Replicate key |
If you have Python installed, just double-click:
run_frogpaper.bat
The batch file handles dependency checks and launches the app automatically.
Step 1 — Install dependencies
pip install -r requirements.txt
Step 2 — Launch the app
python app.py
Note: Python 3.11 or newer is required (the code uses
X | Nonetype unions, and Pillow 13 dropped Python 3.10 support). Make sure to check "Add Python to PATH" during installation.
python setup_scheduler.py
Run as Administrator — right-click Command Prompt, then Run as administrator. Only needs to be done once.
build_frogpaper_exe.bat
Produces dist\FrogPaper.exe. The wallpapers/ folder must sit beside the EXE, not inside it. The EXE resolves all paths relative to its own location.
Sidebar Method:
Gallery Navigation:
Favorites:
Style Transfer:
wallpapers/styled/ and appears in the Styled viewText Overlay:
The slideshow timer resets automatically whenever you manually change the wallpaper.
| Issue | Solution |
|---|---|
| Generation fails | Check your provider settings. Pollinations.ai needs no key; Cloudflare needs Account ID + Token; Hugging Face, Prodia, Replicate and Fal.ai each need their own key. |
| 403 error (HuggingFace) | Visit the model page on huggingface.co and accept terms. Some models require Pro. |
| First prompt feels slow | Wait for "Ready — prompt engine warm." in the status bar. |
| Slideshow not rotating | Ensure the source folder has images. For Favorites, add at least one image first. |
| Wallpaper not changing | Check the image exists in wallpapers/generated/. Verify Windows wallpaper permissions. |
| EXE shows empty gallery | Ensure wallpapers/ and subfolders are beside FrogPaper.exe. |
| System tray icon missing | Install pystray: pip install pystray |
| Global hotkey not working | Install keyboard package: pip install keyboard |
| App won't start | Check Python 3.11+, all dependencies installed (pip install -r requirements.txt), and a valid provider configured. |
| Android: "Backend offline" | The FrogPaper backend is unreachable. Check Wi-Fi; locally start python app.py in backend/. |
| Android: an engine is greyed out | Tap it — the app opens the key sheet and links to the right Settings card. Add your own Gemini / Hugging Face / Replicate key. |
| Android: gallery looks empty | Check Settings > Wallpaper > Gallery source; the default is this phone. Pull older saves in with "Import from my SD folder". |
Desktop: all images are stored locally beside the app. Only text prompts are sent to the configured AI provider API. No images, filenames, or personal data are transmitted.
Android: wallpapers are stored on the phone. Prompts are sent to the FrogPaper backend, which forwards them to the selected engine. API keys you add stay on the device. No account, ads or tracking.
app.py contains the main UI, layout, and event logic (~2,700 lines)prompt_tab.py (Quick Build, Recipes, Templates) and gallery_tab.py (Gallery, style transfer, text overlay, tags)settings_tab.py — resizable window with 8 sidebar categories (General, Generation, Appearance, Startup, Slideshow, Cloud & Backup, Advanced, Help)theme_mixer.py handles prompt construction; keyword caches pre-warm at startupwallpaper_generator.py supports 6 providers (Pollinations, Cloudflare, Hugging Face, Prodia, Replicate, Fal.ai)prompt_builder.py assembles final prompts with per-mode negatives and subject-aware anatomy constraintsnegative_manager.py manages presets, smart negatives, and style-default negativesstyle_transfer.py uses OpenCV for the filters and Pillow for text overlay (local processing, no API)slideshow.py manages auto-rotation with fullscreen detection, duplicate skipping, and countdown resetsession_manager.py with SQLite storage via database.py and JSON fallbackutils.get_app_dir() returns Path(sys.executable).parent when frozen, Path(__file__).parent otherwise — all modules use this so user data always resolves correctlyicons.py generates themed toolbar icons programmaticallytray_manager.py provides full app control from the system tray with a custom-drawn frog iconfrogpaper-mobile/ is a separate Expo / React Native app with a Flask backend; bottom tabs are Home, Generate, Gallery and SettingsLily pads optional. Wallpapers mandatory.
| Native wallpaper setting, system tray with full controls, minimize-to-tray, startup tasks |
| Keyboard Shortcuts | Ctrl+G (Gallery), Ctrl+S (Settings), Ctrl+N (Generate), Ctrl+Alt+N (next wallpaper) |