#ASO ν΄
μ± μ€ν μ΄ μ΅μ ν(ASO) λ°μ΄ν° κ΄λ¦¬ ν΄.
#ν΄ λͺ©λ‘
#aso-to-public (pull)
.aso/pullData/μ ASO λ°μ΄ν°λ₯Ό public/products/[slug]/ νμμΌλ‘ λ³ν.
μ λ ₯:
slug(νμ): μ ν μ¬λ¬κ·Έlocale(μ ν): λμ λ‘μΌμΌ (κΈ°λ³Έκ°: λͺ¨λ λ‘μΌμΌ)
μΆλ ₯:
- λ‘μΌμΌλ³ λ³ν ν둬ννΈ
- μΉ μ¬μ©μ μν ꡬ쑰νλ λ°μ΄ν°
#public-to-aso (push)
public/products/[slug]/ λ°μ΄ν°λ₯Ό .aso/pushData/ ASO νμμΌλ‘ λ³ν.
μ λ ₯:
slug(νμ): μ ν μ¬λ¬κ·ΈdryRun(μ ν): νμΌ μ°κΈ° μμ΄ λ―Έλ¦¬λ³΄κΈ°locales(μ ν): μ²λ¦¬ν νΉμ λ‘μΌμΌ
μΆλ ₯:
- μ€ν μ΄ μ λ‘λμ© ASO λ°μ΄ν°
- μ λ‘λμ© μ€ν¬λ¦°μ· κ²½λ‘
#improve-public
κΈ°μ‘΄ νΌλΈλ¦ λ°μ΄ν°μ λν ASO μ΅μ ν ν둬ννΈ μμ±.
μ λ ₯:
slug(νμ): μ ν μ¬λ¬κ·Έlocale(μ ν): μ΅μ ν λμ λ‘μΌμΌmode(μ ν):primary(ν€μλ μ΅μ ν) λλlocalize(λ²μ)
μΆλ ₯:
- ν€μλ λΆμ
- μ΅μ ν μ μ
- νμ§ν ν둬ννΈ
#validate-aso
μ€ν μ΄ νλ μ ν λ° κ·μΉμ λν ASO λ°μ΄ν° κ²μ¦.
μ λ ₯:
slug(νμ): μ ν μ¬λ¬κ·Έstore(μ ν):appStore,googlePlay, λλboth
μΆλ ₯:
- νλ κΈΈμ΄ κ²μ¦
- ν€μλ κ³ μ μ± κ²μ¬
- μ μ± μ€μ κ²½κ³
#keyword-research
ASO μ΅μ νλ₯Ό μν ν€μλ 리μμΉ λ°μ΄ν° κ΄λ¦¬.
μ λ ₯:
slug(νμ): μ ν μ¬λ¬κ·Έlocale(νμ): λμ λ‘μΌμΌplatform(μ ν):iosλλandroid
μΆλ ₯:
- ν€μλ 리μμΉ νμΌ κ²½λ‘
- λΆμμ© λ¦¬μμΉ ν둬ννΈ
#localize-screenshots
Gemini APIλ₯Ό μ¬μ©νμ¬ μ± μ€ν¬λ¦°μ·μ μ¬λ¬ μΈμ΄λ‘ λ²μν©λλ€.
κΈ°λ³Έ λͺ¨λΈ: gemini-3.1-flash-image-preview (μ νμ μΌλ‘ gemini-3-pro-image-preview).
μꡬμ¬ν:
- Gemini API ν€ μ€μ νμ (μ€μ λ°©λ² μ°Έμ‘°)
- μ€ν¬λ¦°μ·μ΄
public/products/{slug}/screenshots/{locale}/phone/λ°/λλtablet/μ μμ΄μΌ ν¨
μ λ ₯:
appName(νμ): μ± μ΄λ¦, μ¬λ¬κ·Έ, bundleId λλ packageNametargetLocales(μ ν): λ²μν νΉμ λ‘μΌμΌ (κΈ°λ³Έκ°: μ§μνλ λͺ¨λ λ‘μΌμΌ)deviceTypes(μ ν):["phone"],["tablet"], λλ["phone", "tablet"](κΈ°λ³Έκ°: λ λ€)dryRun(μ ν): μ€μ λ²μ μμ΄ λ―Έλ¦¬λ³΄κΈ° λͺ¨λ (κΈ°λ³Έκ°: false)skipExisting(μ ν): λ²μλ νμΌμ΄ μμΌλ©΄ 건λλ°κΈ° (κΈ°λ³Έκ°: true)screenshotNumbers(μ ν): μ²λ¦¬ν νΉμ μ€ν¬λ¦°μ· λ²νΈ- λͺ¨λ κΈ°κΈ°μ μ μ©:
[1, 3, 5] - κΈ°κΈ°λ³ μ§μ :
{ phone: [1, 2], tablet: [1, 3, 5] } - μ§μ νμ§ μμΌλ©΄ λͺ¨λ μ€ν¬λ¦°μ· μ²λ¦¬
- λͺ¨λ κΈ°κΈ°μ μ μ©:
preserveWords(μ ν): λ²μνμ§ μμ λ¨μ΄ (μ:["Pabal", "Pro", "AI"])imageModel(μ ν):"flash"(κΈ°λ³Έκ°) λλ"pro"
μΆλ ₯:
- λ²μλ μ€ν¬λ¦°μ·μ
screenshots/{targetLocale}/phone/λ°tablet/μ μ μ₯ - μ΄λ―Έμ§λ₯Ό μμ€ ν¬κΈ°μ λ§κ² μλ 리μ¬μ΄μ§
λΉμ© μ 보:
- μ΄λ―Έμ§ μμ± μ μ₯λΉ μ½ $0.13
μ§μ μΈμ΄:
μ΅μ μ μ±λ₯μ μν΄ Gemini API λ¬Έμμ λͺ μλ λ€μ μΈμ΄λ§ μ΄λ―Έμ§ μμ±μ μ§μν©λλ€:
| Gemini λ‘μΌμΌ | μΆλ ₯ λ‘μΌμΌ (UnifiedLocale) |
|---|---|
en-US (μμ΄) | en-US, en-AU, en-CA, en-GB, en-IN, en-SG, en-ZA |
ar-EG (μλμ΄) | ar |
de-DE (λ
μΌμ΄) | de-DE |
es-MX (μ€νμΈμ΄) | es-419, es-ES, es-US |
fr-FR (νλμ€μ΄) | fr-FR, fr-CA |
hi-IN (νλμ΄) | hi-IN |
id-ID (μΈλλ€μμμ΄) | id-ID |
it-IT (μ΄ν리μμ΄) | it-IT |
ja-JP (μΌλ³Έμ΄) | ja-JP |
ko-KR (νκ΅μ΄) | ko-KR |
pt-BR (ν¬λ₯΄ν¬κ°μ΄) | pt-BR, pt-PT |
ru-RU (λ¬μμμ΄) | ru-RU |
ua-UA (μ°ν¬λΌμ΄λμ΄) | uk-UA |
vi-VN (λ² νΈλ¨μ΄) | vi-VN |
zh-CN (μ€κ΅μ΄) | zh-Hans, zh-Hant, zh-HK |
μ μ¬ν λ‘μΌμΌμ κ·Έλ£ΉμΌλ‘ λ¬Άμ΄ API νΈμΆμ μ€μ
λλ€. μλ₯Ό λ€μ΄, μ€νμΈμ΄(es-MX)λ‘ λ²μνλ©΄ λμΌν μ΄λ―Έμ§κ° es-419, es-ES, es-US ν΄λμ μλμΌλ‘ μ μ₯λ©λλ€.
μ§μ λͺ©λ‘μ μλ λ‘μΌμΌμ λ²μ μ 건λλλλ€.
μμ:
screenshots/
βββ en-US/ # μμ€ (κΈ°λ³Έ λ‘μΌμΌ)
β βββ phone/
β β βββ 1.png
β β βββ 2.png
β βββ tablet/
β βββ 1.png
βββ ko-KR/ # μμ±λ¨
β βββ phone/
β β βββ 1.png
β β βββ 2.png
β βββ tablet/
β βββ 1.png
βββ ja-JP/ # μμ±λ¨
βββ ...
#Gemini API μ€μ
localize-screenshots ν΄μ Gemini API ν€κ° νμν©λλ€.
#Gemini API ν€ λ°κΈ
- Google AI Studioμ μ μ
- Google κ³μ μΌλ‘ λ‘κ·ΈμΈ
- "Create API Key" ν΄λ¦
- μμ±λ API ν€ λ³΅μ¬
- μ€μ: Google Cloud Consoleμμ κ²°μ κ³μ μ μ°κ²°ν΄μΌ Imagen API μ¬μ© κ°λ₯
#μ€μ λ°©λ²
~/.config/pabal-mcp/config.jsonμ μΆκ°:
{
"dataDir": "/path/to/your/project",
"gemini": {
"apiKey": "your-gemini-api-key"
}
}
λλ GEMINI_API_KEY νκ²½λ³μλ₯Ό μ€μ ν΄λ λ©λλ€.
#νλ μ ν μ°Έμ‘°
#Apple App Store
| νλ | μ ν |
|---|---|
| μ± μ΄λ¦ | β€30μ |
| λΆμ λͺ© | β€30μ |
| ν€μλ | β€100μ |
| νλ‘λͺ¨μ ν μ€νΈ | β€170μ |
| μ€λͺ | β€4000μ |
| μλ‘μ΄ κΈ°λ₯ | β€4000μ |
#Google Play
| νλ | μ ν |
|---|---|
| μ λͺ© | β€50μ (β€30μ κΆμ₯) |
| κ°λ¨ν μ€λͺ | β€80μ |
| μ 체 μ€λͺ | β€4000μ |
| μΆμ λ ΈνΈ | β€500μ |