mesh-avatar-studio
Turn one illustration into an animated 2D mesh avatar with a coding agent and a local editor
翻译准备中
Generate professional App Store & Google Play screenshots with AI-powered copywriting, device mockups, drag & drop ordering, and one-click export. Built with Nuxt 4.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Generate professional, production-ready screenshots for Apple App Store and Google Play — with device mockups, customisable slide templates, AI-powered copywriting, smart slide ordering, and one-click bundle export for every store size.
Live: storeshots.org · Open source · Free to use · Bring your own AI key.
Built upon the concepts from ParthJadhav/app-store-screenshots — an AI skill for generating store screenshots via coding agents. Storeshots takes that foundation and turns it into a standalone visual application with a guided editor, real-time preview, drag-to-reposition fine-tuning, project files, store bundle exports, and a privacy-first analytics stack.
See the full CHANGELOG.md or the /changelog page on the live site for release history.
The classic editor (/editor) and V2 Beta (/editor-v2) remain available side by side. Each keeps a separate draft. Save a project file in one editor and open a copy in the other to transfer your work; there is no automatic migration. V1 remains available for advanced workflows that V2 does not yet cover.
V2 follows Screenshots → Outputs → Your set. Reorder slides across screenshot outputs and languages, choose separate images for paired device frames, and undo layout changes without losing text edits. Use Store preview to review the leading images, then Download options to include or omit the closing card and choose output sizes. All sizes are selected by default.
In V2, configure your provider, API key and model through AI settings once, then use the AI tools without repeating setup. Provider/model preferences stay in this browser across projects; your key stays only for the current tab session. Imported projects preserve your active AI connection. Saving settings does not send a provider request.
V2 supports iPhone Duo outer and inner screenshots in portrait and landscape, plus App Store product page header (3840 × 1646) and search artwork (1920 × 1280). These targets keep separate uploads. Apple artwork defaults to Fit without cropping; choose Fill and adjust the focal point to cover the canvas. Placement and background are saved separately for each target and orientation. Duo exports use the actual screen ratio without a simulated hardware frame. Check final placement with App Store Connect's preview tool. Video and automatic App Store uploads are not included.
Design changes use the installed UI UX Pro Max skill, with Nuxt UI guidance and responsive previews.
copyByLocale); a language tab bar above the canvas lets you switch and edit copy per language, with a green dot marking languages that already have copy.⌘/Ctrl + E exports all, ⌘/Ctrl + G generates copy, Esc closes modals. Skips while typing.[{label, headline}]) or CSV, export a language's copy as JSON, and AI-translate from one source language into the others (translates the copy you already have instead of re-deriving it from screenshots)..ttf/.otf/.woff/.woff2 (max 2 MB). The chosen font applies to every slide, embeds into PNG exports, and travels inside the exported .storeshots.json.<language>/<device>/<size>/NN-label.png (the language folder is omitted when only one language is selected). Three store presets act as one-click quick-fills:
.storeshots.json snapshots include the full project state. The exported file strips the API key so a shared snapshot never leaks credentials.useScriptTriggerConsent. No third-party tracking.sessionStorage for the current tab only, cleared on tab close, never written to localStorage or sent to anyone but the AI provider.nuxt-security, no 'unsafe-inline' for scripts, narrow allowlist for the analytics origin./api/generate-copy, /api/copy-variants, /api/translate all enforce body size caps, field length limits, provider whitelist, and max-image checks./api/version (every 5 min and on tab focus) and surface a "Refresh" prompt instead of silently 404-ing on stale hashed asset URLs.# Install dependencies
pnpm install
# Start dev server (port 3005)
pnpm dev
# Production build
pnpm build
Open http://localhost:3005 and start designing.
Copy .env.example to .env and fill in the values you need:
# Optional — Umami analytics (cookieless, GDPR-safe)
NUXT_PUBLIC_UMAMI_WEBSITE_ID=
NUXT_PUBLIC_UMAMI_HOST=https://cloud.umami.is
The editor itself works without any environment variables. Analytics and AI are entirely opt-in.
The editor is a five-step wizard. The sidebar nav at the top of every panel marks completed steps with a green dot.
App icon (drag-and-drop dropzone), app name, description (with a 600-character counter), and key features as a chip input. The description and features feed AI prompts.
Upload your actual app screenshots — these go inside the device mockups. Up to 10 per device. Drag thumbnails to reorder. "Upload All" picks multiple files at once and fills slots in order.
Pick a provider (Claude / OpenRouter), paste a key, choose a model and language, optionally write an AI brief, then run one of:
| Button | What it does |
|---|---|
| ✦ Headlines | Analyses screenshots → generates matching headlines per slide |
| ✦ Full design | Analyses screenshots → generates headlines + feature chips + derives brand colour palette |
AI reorders slides for optimal App Store conversion: hero → primary feature → differentiator → supporting features → trust.
Review and edit the generated copy. Drag rows to reorder, or click the pencil icon on any preview slide to edit inline. Open the Translations dialog to manage every selected language side by side — edit, import/export, or AI-translate.
Tweak the brand palette manually, hit Auto to derive it from your uploaded screenshots client-side, and pick a typeface (built-in or your own uploaded font).
The toolbar's Export button opens a dialog to pick any combination of languages × devices × sizes and download them as one ZIP. The Project dropdown saves / loads .storeshots.json snapshots so you never lose work.
| Provider | Vision | Free? | How to get a key |
|---|---|---|---|
| Claude (Anthropic) | Yes (every model) | No (pay-per-use) | console.anthropic.com |
| OpenRouter | Depends on model | Free tier available | openrouter.ai/keys |
| Model | Best for |
|---|---|
claude-opus-4-7 | Highest quality, most nuanced copy |
claude-sonnet-4-6 | Balanced (default) |
claude-haiku-4-5-20251001 | Fast and cheap |
| Model | Vision | Free? |
|---|---|---|
google/gemini-2.0-flash-001 | Yes | No |
anthropic/claude-3-5-sonnet | Yes | No |
openai/gpt-4o-mini | Yes | No |
google/gemini-2.0-flash-exp:free | No | Yes |
meta-llama/llama-4-maverick:free | No | Yes |
deepseek/deepseek-chat-v3-0324:free | No | Yes |
API keys are stored in sessionStorage — cleared automatically when you close the tab. Never persisted to disk, never sent to anyone but the AI provider.
| Device | Resolution |
|---|---|
| iPhone 6.9" | 1320 × 2868 |
| iPhone 6.5" | 1284 × 2778 |
| iPhone 6.3" | 1206 × 2622 |
| iPhone 6.1" | 1125 × 2436 |
| iPad Pro 12.9" | 2048 × 2732 |
| iPad Pro 11" | 1668 × 2224 |
| Device | Resolution |
|---|---|
| Android Phone | 1080 × 1920 |
| Android 7" Tablet (Portrait) | 1200 × 1920 |
| Android 7" Tablet (Landscape) | 1920 × 1200 |
| Android 10" Tablet (Portrait) | 1600 × 2560 |
| Android 10" Tablet (Landscape) | 2560 × 1600 |
| Feature Graphic | 1024 × 500 |
The Export dialog produces every selected size at once and packages the result as a ZIP.
| # | Background | Layout | Best for |
|---|---|---|---|
| 1 | Light gradient | Title top, device bottom centre | Hero / main benefit |
| 2 | Light gradient | Title top, two devices (depth) | Second feature |
| 3 | Light gradient | Title bottom-left, device top-right | Third feature |
| 4 | Dark gradient | Title top, device bottom centre | Highlight feature |
| 5 | Light gradient | Title top, device bottom centre | Fifth feature |
| 6 | Light gradient | Title top, two devices (reversed) | Sixth feature |
| 7 | Light gradient | Title top, device bottom centre | Seventh feature |
| 8 | Light gradient | Title bottom-left, device top-right | Eighth feature |
| 9 | Dark gradient | Title top, device bottom centre | Ninth feature |
| 10 | Dark gradient | Centred icon + title, no device | Trust / closing |
| Layer | Technology |
|---|---|
| Framework | Nuxt 4 + Vue 3 |
| UI kit | @nuxt/ui 4 |
| Styling | Tailwind CSS 4 |
| Fonts | @nuxt/fonts + 8 built-in typefaces + custom font upload |
| SEO | @nuxtjs/seo (sitemap, robots, OG, schema.org) |
| Security | nuxt-security (CSP nonce, rate limiting) |
| Analytics | Umami via @nuxt/scripts (cookieless, consent-gated) |
| Markdown | marked (render) + jagajs/sanitize (zero-dep, serverless-safe) |
| ZIP export | jszip (client-side packaging) |
| PNG capture | html-to-image |
| AI | Anthropic Messages API · OpenRouter Chat Completions |
storeshots/
├── app/
│ ├── pages/
│ │ ├── index.vue # Marketing landing
│ │ ├── editor.vue # Editor (toolbar, preview, modals)
│ │ ├── changelog.vue # Release notes (rendered from CHANGELOG.md)
│ │ ├── cookies.vue # Cookie policy
│ │ ├── privacy.vue # Privacy policy
│ │ └── terms.vue # Terms of service
│ ├── components/
│ │ ├── AppSidebar.vue # 5-step wizard sidebar
│ │ ├── SlideCard.vue # Preview card (edit / move / download buttons)
│ │ ├── TranslationsManager.vue # Side-by-side per-language copy table
│ │ ├── CookieBanner.vue # Granular cookie consent banner
│ │ ├── UpdateBanner.vue # New-deploy refresh prompt
│ │ └── slides/
│ │ ├── DeviceFrames.vue # iPhone / Android / iPad frames
│ │ ├── SlideTemplate.vue # 10 slide templates with caption transform
│ │ ├── SlideElementRenderer.vue # Draggable per-element renderer
│ │ ├── SlideTransformOverlay.vue # Drag / resize / rotate handles
│ │ ├── SlideBlob.vue # Decorative blobs
│ │ ├── SlideCaption.vue # Headline + label
│ │ └── FeatureGraphic.vue # Editable Google Play feature graphic
│ ├── composables/
│ │ ├── useScreenshots.ts # Editor state, AI calls, export, project I/O
│ │ ├── useElementOverride.ts # Per-element layout overrides
│ │ ├── useCookieConsent.ts # Versioned consent state + DNT respect
│ │ ├── useUpdateAvailable.ts # /api/version polling + visibility check
│ │ └── useMockup.ts # iPhone PNG preload
│ ├── layouts/
│ │ └── legal.vue # Shared header/footer for legal & changelog
│ └── utils/
│ ├── types.ts # UserConfig, SlideCopy, BrandColors
│ ├── defaults.ts # DEFAULT_CONFIG + load/save
│ ├── canvas.ts # Canvas dims + STORE_PRESETS
│ ├── templates.ts # Quick-start templates (SaaS / Game / Finance / Health)
│ ├── locales.ts # Language list for picker + translations
│ ├── fonts.ts # Built-in typefaces + custom font handling
│ ├── anchor.ts # Element anchor / transform math
│ ├── color-extract.ts # Client-side palette quantiser
│ └── analytics.ts # Shared scriptsConsent trigger
├── server/api/
│ ├── generate-copy.post.ts # Vision + text → slides + colours
│ ├── copy-variants.post.ts # Three tone-of-voice alternatives
│ ├── translate.post.ts # Multi-locale translation
│ └── version.get.ts # Build id used by the update banner
├── public/
│ ├── mockup.png # iPhone mockup image
│ ├── llms.txt # AI engine discovery file
│ └── favicons / icons # PWA icons + OG images
├── CHANGELOG.md # Release notes (rendered into /changelog)
├── netlify.toml # Build config + cache headers
└── nuxt.config.ts # Modules, security, SEO, runtime config
sessionStorage (cleared on tab close, never on disk).localStorage (no credentials, image data lives in memory only and is included in .storeshots.json exports).html-to-image; no server upload.'unsafe-inline' for scripts, narrow connect-src allowlist.See SECURITY.md (if present) for vulnerability disclosure.
Contributions welcome! Read the Contributing Guide before submitting a PR.
Areas of interest:
Built upon the concepts from ParthJadhav/app-store-screenshots — an AI skill that generates App Store screenshots through coding agents. Storeshots evolves that into a standalone visual application with:
.storeshots.json filesGNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
Storeshots is free software. If you modify and run Storeshots as a network service (SaaS), the AGPL requires you to make the source code of your modified version available to your users. Self-hosting for your own team or customers is fine — forking it to run a competing hosted service requires you to open-source your changes.