Download Raw Markdown (.md)

AI Agent Guide for SoloScreenshot Projects

This is the operational specification for AI assistants that edit a SoloScreenshot / App Screenshot Studio project. Use it to modify project metadata, page copy, localization, screenshot bindings, templates, colors, device appearance, layout, preview state, and export scope without opening the application.

The instructions below describe the current desktop project format and schema version 2.


1. AI Operating Contract

When a user asks you to edit a SoloScreenshot project:

  1. Locate the project folder that contains both config.json and translations.json.
  2. Read both files completely before editing either one.
  3. Inspect screenshots/ when the request involves pages, images, renaming, adding, or deleting.
  4. Preserve every unrelated field, page, locale, style override, custom template, and screenshot mapping.
  5. Make the smallest change that satisfies the request. Do not “clean up” unknown fields.
  6. Keep schemaVersion at 2. If it is missing or older, do not perform a broad migration unless the user asks; add version-2 fields only as needed.
  7. Validate all edited JSON and all cross-file references before finishing.
  8. Prefer an atomic write: write and validate a temporary file in the same directory, then replace the target.
  9. Report which files and page keys changed, plus any assumptions or missing assets.

Never:


2. Project Folder and Source of Truth

project-folder/
├── config.json
├── translations.json
└── screenshots/
    ├── screenshot-01.png
    └── screenshot-02.png

The files have distinct responsibilities:

LocationResponsibility
config.jsonProject settings, screenshot filename bindings, default appearance, per-page styles, preview/export preferences, and custom templates
translations.jsonPage existence, page order, titles, subtitles, and active locales
screenshots/Raw app screenshots displayed inside device frames

Critical page-key relationship

For every real page key such as screenshot-01:

The application treats non-underscore top-level keys in translations.json as the authoritative page list. Their JSON insertion order is the page order shown and exported by the application.

Destructive behavior: When the application loads a project, files in screenshots/ whose basename is not an active translation page key may be deleted as orphans. Removing or renaming a page key can also discard its screenshot/style binding. Do not remove or rename page keys without explicit user approval and a coordinated rename of all three locations.


3. Safe Editing Workflow

3.1 Read and inventory

Before editing, determine:

3.2 Clarify only material ambiguity

Infer obvious intent from existing names and patterns. Ask the user only when a choice would materially change the result, for example:

3.3 Apply a minimal patch

Parse JSON into an object, edit only targeted paths, and serialize with readable indentation. Preserve object order in translations.json.

3.4 Validate before completion

At minimum verify:


4. config.json Schema

4.1 Complete top-level field reference

FieldTypeAccepted/default behaviorAI editing guidance
schemaVersionintegerUse 2Preserve as 2
appNamestringDefaults to SoloScreenshot when missingSafe to edit
platformsstring arrayValues with size presets: ios, android, otherControls batch export targets
activeTemplateIdstring or nullBuilt-in or existing custom-template IDProject default template
bgTypestring or nullsolid or linearGradientProject default background
bgColorsstring arrayHex colorsOne color for solid; normally two or more for gradient
phoneFrameColorstring or nullHex colorProject default device-frame color
titleColorstring or nullHex colorProject default title color
subtitleColorstring or nullHex colorProject default subtitle color
showSensorAreabooleanDefaults to trueShows notch, Dynamic Island, or punch-hole
useDeviceFramebooleanDefaults to trueShows the physical phone shell
previewLanguagestring or nullMust be a locale found in translationsUI preview preference only
previewSizeIdstring or nullBuilt-in size IDUI preview and “current size” export
previewScreenshotKeystring or nullExisting page keyUI preview and “current page” export
exportLangModestringall or current; default allSaved export-dialog preference
exportSizeModestringall or current; default allSaved export-dialog preference
exportPageModestringall or current; default allSaved export-dialog preference
screenshotsobject{ pageKey: fileName }Image bindings, not the page list
screenshotStylesobject{ pageKey: overrides }Sparse per-page overrides
customTemplatesarraySaved custom-template snapshotsPreserve unless specifically editing templates

Unknown top-level fields should be preserved.

4.2 Supported platform and size IDs

PlatformpreviewSizeIdOutput size
iosios_6_71290 × 2796
androidandroid_phone_portrait1440 × 2880
otherother_android_1080_19201080 × 1920

Notes:

4.3 Built-in template IDs

Use IDs exactly as written:

IDLayout character
app_store_heroCentered classic hero
modern_saasText above, phone cropped toward bottom
minimal_cleanMinimal centered layout
ai_assistantPhone-left composition
travel_storyStory-style bottom composition
health_trackerCentered health layout
dashboard_analyticsPhone-right dashboard composition
dark_cyberpunkDark centered composition
neon_glowNeon phone-right composition
gaming_neonGaming phone-right composition
luxury_goldPremium bottom composition
finance_proProfessional phone-left composition
flight_status_tiltSmall left tilt
calendar_sync_tiltSmall right tilt
crisp_orange_tiltLarge left tilt

An ID may also refer to an entry in customTemplates. Do not guess a custom ID: read it from the array.

If a template ID cannot be found, the renderer falls back visually to the first built-in preset (app_store_hero), but the invalid ID remains bad configuration. Fix the reference instead of relying on fallback.


5. Per-Page Styles: screenshotStyles

screenshotStyles is a map of page keys to sparse override objects. Omitted fields inherit; null is not normally written by the application and should be omitted rather than used to mean “reset.”

{
  "screenshotStyles": {
    "screenshot-02": {
      "templateId": "calendar_sync_tilt",
      "bgType": "linearGradient",
      "bgColors": ["#1D4ED8", "#7C3AED"],
      "titleColor": "#FFFFFF",
      "subtitleColor": "#E0E7FF",
      "phoneFrameColor": "#111827",
      "showSensorArea": true,
      "useDeviceFrame": true,
      "phoneXOffset": 24,
      "phoneYOffset": 40,
      "phoneScale": 1.08,
      "phoneRotationOffsetDegrees": -2,
      "textYOffset": 0,
      "titleScale": 1.05,
      "subtitleScale": 1,
      "titleLineHeight": 1.15,
      "titleSubtitleSpacing": 22
    }
  }
}

5.1 Override field reference

FieldTypeDefault when not inheritedValid/safe range or valuesMeaning
templateIdstringProject activeTemplateIdBuilt-in or existing custom IDBase layout for this page
bgTypestringTemplate/project valuesolid, linearGradientBackground type
bgColorsstring arrayTemplate/project valueValid hex colorsBackground colors
phoneFrameColorstringTemplate/project valueHex colorDevice shell
titleColorstringTemplate/project valueHex colorMain title
subtitleColorstringTemplate/project valueHex colorSubtitle
showSensorAreabooleanUsually truetrue, falseNotch/island/camera visibility
useDeviceFramebooleanUsually truetrue, falsePhysical device shell visibility
phoneXOffsetnumber0-300 to 300Horizontal offset in design pixels
phoneYOffsetnumber0-500 to 500Vertical offset in design pixels
phoneScalenumber10.5 to 2Device scale multiplier
phoneRotationOffsetDegreesnumber0-45 to 45Rotation added to template baseline
textYOffsetnumber0-200 to 200Vertical text-group offset
titleScalenumber10.5 to 2Title size multiplier
subtitleScalenumber10.5 to 2Subtitle size multiplier
titleLineHeightnumber1.20.8 to 1.8Title line-height multiplier
titleSubtitleSpacingnumber248 to 80Gap between title and subtitle

Values must be finite JSON numbers, not numeric strings. The renderer clamps geometry and typography, but AI edits should remain inside the documented ranges.

5.2 Rotation semantics

phoneRotationOffsetDegrees is an offset, not always the final angle. Approximate built-in baselines are:

The final rendered angle is the template baseline plus the offset, clamped to -45°...45°.

5.3 Exact style resolution

For a page, the renderer:

  1. Chooses screenshotStyles[pageKey].templateId when present; otherwise activeTemplateId.
  2. Resolves that ID to a custom template first, then a built-in preset.
  3. Builds the base style:
  1. Applies all non-null page-level override fields.
  2. Clamps numeric layout values.

This nuance matters: adding only "templateId": "minimal_clean" to a page intentionally resets its missing appearance fields to that preset, rather than keeping the project background.

5.4 Reset and apply-to-all recipes

Do not create screenshotStyles entries for underscore metadata keys.


6. Colors and Backgrounds

Preferred color syntax is uppercase #RRGGBB, for example #0F172A. The parser also accepts 8 hex digits as #AARRGGBB (alpha first), but six-digit opaque colors are safest.

Rules:

Example:

{
  "bgType": "linearGradient",
  "bgColors": ["#0F172A", "#1D4ED8"],
  "titleColor": "#FFFFFF",
  "subtitleColor": "#DBEAFE"
}

Gradient direction comes from the selected template. There is no top-level or per-page field for changing gradient direction in schema version 2.


7. translations.json Schema

7.1 Canonical structure

{
  "_meta": {
    "note": "Optional metadata; ignored as a page because the key starts with _"
  },
  "screenshot-01": {
    "title": {
      "en": "Create beautiful store screenshots",
      "zh-Hans": "制作精美的商店截图",
      "ja": "美しいストア画像を作成"
    },
    "subtitle": {
      "en": "Export every language and device size in one workflow.",
      "zh-Hans": "一次完成多语言与多尺寸导出。",
      "ja": "多言語・多サイズをまとめて書き出せます。"
    }
  },
  "screenshot-02": {
    "title": {
      "en": "Keep every screen private",
      "zh-Hans": "让每张截图保持私密",
      "ja": "画面データを安全に保護"
    },
    "subtitle": {
      "en": "Local rendering keeps unreleased UI on your machine.",
      "zh-Hans": "本地渲染让未发布界面始终留在设备上。",
      "ja": "ローカル処理で未公開UIを端末内に保ちます。"
    }
  }
}

7.2 Parsing behavior

Use locale codes consistently. Common supported UI/localization codes include:

en, zh-Hans, zh-Hant, ja, ko, de, fr, es, it, pt-BR

Other locale codes can exist in a project, but use standard BCP 47-style codes and preserve the user’s existing convention.

7.3 Copy-editing guidance


8. Screenshot Image Bindings

config.json.screenshots is an object, not an array:

{
  "screenshots": {
    "screenshot-01": "screenshot-01.png",
    "screenshot-02": "screenshot-02.jpg"
  }
}

For each mapping:

Coordinated page rename

Only do this when explicitly requested. To rename old-key to new-key:

  1. Rename the top-level translation key without changing its relative order.
  2. Move config.json.screenshots["old-key"] to ["new-key"].
  3. Rename the image file so its basename is new-key.
  4. Move config.json.screenshotStyles["old-key"] to ["new-key"].
  5. Update previewScreenshotKey if it equals old-key.
  6. Validate that no old references remain.

Add a page

  1. Add a new non-underscore top-level key to translations.json at the desired position.
  2. Add complete title/subtitle locale maps.
  3. If an image was provided, place it under screenshots/ with a matching basename and add the mapping.
  4. Add screenshotStyles[newKey] only if page-specific styling is needed.

Delete a page

Deletion is destructive and must be explicit:

  1. Remove the translation key.
  2. Remove its screenshots mapping.
  3. Remove its screenshotStyles entry.
  4. Update previewScreenshotKey if necessary.
  5. Remove or archive the image only as authorized by the user.

9. Preview and Export Configuration

Preview fields do not change the design itself:

{
  "previewLanguage": "en",
  "previewSizeId": "ios_6_7",
  "previewScreenshotKey": "screenshot-01"
}

Export preferences:

{
  "exportLangMode": "all",
  "exportSizeMode": "all",
  "exportPageMode": "all"
}

Semantics:

If the user asks to prepare a project for a specific single export, update the relevant preview value and its export mode together.


10. Custom Templates

Each custom template is a self-contained snapshot. The following is a structural outline only; it is intentionally not a usable template because the required background and element details are abbreviated:

{
  "id": "custom_123456789",
  "name": "Brand Blue",
  "version": 1,
  "templateSnapshot": {
    "id": "custom_123456789",
    "name": "Brand Blue",
    "engine": "centerClassic",
    "category": "premium",
    "background": {},
    "elements": []
  },
  "styleSnapshot": {}
}

Valid engine names:

centerClassic, bottomCrop, leftSlide, rightSlide, tiltLeft, tiltRight, tiltLeftLarge, tiltRightLarge

Valid category names:

recommended, ai, dashboard, premium

templateSnapshot.background and every template element contain required structural fields. Therefore:


11. Common AI Modification Recipes

Change copy only

Edit only the target strings in translations.json. Do not modify config.json, page keys, or images.

Add a language

For every real page, add the locale to both title and subtitle. Then set previewLanguage only if the user wants that locale selected by default.

Change the entire project’s brand colors

Edit top-level bgType, bgColors, titleColor, subtitleColor, and optionally phoneFrameColor. Remove the same per-page fields only from pages the user wants to inherit the global palette.

Give one page a special style

Merge fields into screenshotStyles[pageKey]. Preserve other fields already present in that page override.

Use one template everywhere

Set activeTemplateId to the chosen ID. Remove page-level templateId only on pages that should inherit it. Preserve other page-specific overrides.

Center the first page and control its rotation

For the first real page key, center the device with:

{
  "phoneXOffset": 0
}

For a non-tilted template, set phoneRotationOffsetDegrees to 0. An offset of 0 preserves a tilted template’s baseline; to produce an approximately straight device on a tilted template, apply the inverse baseline (for example about -5.73 on calendar_sync_tilt) or choose a non-tilted template.

Alternate visual rhythm across pages

Prefer alternating tilt template IDs or modest rotation offsets on pages 2–5. Keep page 1 clear, high-contrast, and easy to scan. Do not sacrifice text/image separation for decorative motion.


12. Canonical Version-2 Example

{
  "schemaVersion": 2,
  "appName": "MyApp",
  "platforms": ["ios", "android"],
  "activeTemplateId": "modern_saas",
  "bgType": "linearGradient",
  "bgColors": ["#0F172A", "#1E3A8A"],
  "phoneFrameColor": "#111827",
  "previewLanguage": "en",
  "previewSizeId": "ios_6_7",
  "previewScreenshotKey": "screenshot-01",
  "titleColor": "#FFFFFF",
  "subtitleColor": "#DBEAFE",
  "showSensorArea": true,
  "useDeviceFrame": true,
  "exportLangMode": "all",
  "exportSizeMode": "all",
  "exportPageMode": "all",
  "screenshots": {
    "screenshot-01": "screenshot-01.png",
    "screenshot-02": "screenshot-02.png"
  },
  "screenshotStyles": {
    "screenshot-01": {
      "phoneScale": 1.08,
      "titleScale": 1.1
    },
    "screenshot-02": {
      "templateId": "calendar_sync_tilt",
      "bgType": "solid",
      "bgColors": ["#4F46E5"],
      "titleColor": "#FFFFFF",
      "subtitleColor": "#E0E7FF",
      "phoneRotationOffsetDegrees": -2
    }
  },
  "customTemplates": []
}

13. Final Validation Checklist

Before telling the user the edit is complete, confirm:

If application execution is available, reopen/refresh the project and visually inspect every changed page in at least the primary locale and target size. Configuration validity does not guarantee that long localized copy will fit every template.