Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions share/debate-me/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="index,follow">
<meta name="referrer" content="strict-origin-when-cross-origin">
<link rel="canonical" href="https://appdevelopsk.com/share/debate-me/">
<meta property="og:type" content="website">
<meta property="og:site_name" content="SK APPS">
<meta property="og:title" content="Debate Me – AI Debate Practice">
<meta property="og:description" content="Practice your arguments against an AI opponent across three debate rounds. Get feedback on logic, persuasion and rebuttal.">
<meta property="og:url" content="https://appdevelopsk.com/share/debate-me/">
<meta property="og:image" content="https://appdevelopsk.com/icons/apps/debate-me.png">
<meta name="twitter:card" content="summary_large_image">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src 'self'; base-uri 'none'; form-action 'none'; connect-src 'none';">
<title>Debate Me – AI Debate Practice | SK APPS</title>
<meta name="description" content="Try Debate Me: choose a topic, debate an AI opponent and get feedback. Find the official iOS and Android store listings.">
<style>
:root{color-scheme:light dark;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
*{box-sizing:border-box}
body{min-height:100vh;margin:0;display:grid;place-items:center;padding:20px;background:#eef2ff;color:#171f3a}
main{width:min(100%,500px);background:white;border:1px solid #dfe5f6;padding:30px 24px;border-radius:20px;box-shadow:0 14px 45px #20294e19;text-align:center}
h1{font-size:1.8rem;margin:0 0 12px}
p{line-height:1.6;color:#4b5875}
.actions{display:grid;gap:12px;margin:24px 0 10px}
a.action{padding:14px 20px;border-radius:12px;color:white;background:#3656d6;text-decoration:none;font-weight:700}
a.action.secondary{background:#202b52}
a.text{color:#3656d6;text-decoration:underline}
small{color:#697493;line-height:1.5}
@media(prefers-color-scheme:dark){body{background:#10182b;color:#eff2ff}main{background:#202b45;border-color:#384969}p,small{color:#c0cbe4}a.text{color:#aac0ff}}
</style>
<script src="landing.js" defer></script>
</head>
<body>
<main>
<h1>Debate Me</h1>
<p data-copy="intro">Practice a three-round debate with an AI opponent, then get feedback on your arguments.</p>
<div class="actions">
<a id="android" class="action" href="https://play.google.com/store/apps/details?id=jp.appdevelopsk.debate_me" rel="noopener noreferrer" data-copy="android">Get it on Google Play</a>
<a id="ios" class="action secondary" href="https://apps.apple.com/app/id6760968208" rel="noopener noreferrer" data-copy="ios">Open in the App Store</a>
</div>
<small data-copy="availability">Store availability may vary by region.</small>
<p><a class="text" href="https://appdevelopsk.com/privacy-policy/debate-me/" data-copy="privacy">Privacy policy</a></p>
<p><a class="text" href="https://appdevelopsk.com/apps" data-copy="otherApps">Explore other SK APPS</a></p>
</main>
</body>
</html>
166 changes: 166 additions & 0 deletions share/debate-me/landing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
'use strict';
(() => {
// Navigation only. No device identifiers, debate content or app-open redirects.
const I18N = {
"en": {
"intro": "Practice a three-round debate with an AI opponent, then get feedback on your arguments.",
"android": "Get it on Google Play",
"ios": "Open in the App Store",
"availability": "Store availability may vary by region.",
"privacy": "Privacy policy",
"otherApps": "Explore other SK APPS"
},
"ja": {
"intro": "AIを相手に3ラウンドのディベートを練習し、議論へのフィードバックを確認できます。",
"android": "Google Playで見る",
"ios": "App Storeで見る",
"availability": "ストアでの提供状況は地域によって異なります。",
"privacy": "プライバシーポリシー",
"otherApps": "他のSK APPSを見る"
},
"zh": {
"intro": "与AI对手进行三轮辩论练习,并获得论点反馈。",
"android": "在Google Play查看",
"ios": "在App Store查看",
"availability": "商店提供情况可能因地区而异。",
"privacy": "隐私政策",
"otherApps": "探索其他SK APPS"
},
"zh_TW": {
"intro": "與AI對手進行三回合辯論練習,並獲得論點回饋。",
"android": "在Google Play查看",
"ios": "在App Store查看",
"availability": "商店提供情況可能因地區而異。",
"privacy": "隱私權政策",
"otherApps": "探索其他SK APPS"
},
"ko": {
"intro": "AI 상대와 3라운드 토론을 연습하고 주장에 대한 피드백을 받아보세요.",
"android": "Google Play에서 보기",
"ios": "App Store에서 보기",
"availability": "스토어 제공 여부는 지역에 따라 다릅니다.",
"privacy": "개인정보 처리방침",
"otherApps": "다른 SK APPS 보기"
},
"es": {
"intro": "Practica un debate de tres rondas con una IA y recibe comentarios sobre tus argumentos.",
"android": "Ver en Google Play",
"ios": "Ver en App Store",
"availability": "La disponibilidad varía según la región.",
"privacy": "Política de privacidad",
"otherApps": "Explorar otras apps"
},
"pt": {
"intro": "Pratique um debate de três rodadas com uma IA e receba comentários sobre seus argumentos.",
"android": "Ver no Google Play",
"ios": "Ver na App Store",
"availability": "A disponibilidade varia conforme a região.",
"privacy": "Política de privacidade",
"otherApps": "Explorar outros aplicativos"
},
"fr": {
"intro": "Entraînez-vous à débattre en trois manches avec une IA et recevez des commentaires sur vos arguments.",
"android": "Voir sur Google Play",
"ios": "Voir sur l’App Store",
"availability": "La disponibilité varie selon la région.",
"privacy": "Politique de confidentialité",
"otherApps": "Explorer les autres apps"
},
"de": {
"intro": "Übe eine Debatte über drei Runden mit einer KI und erhalte Feedback zu deinen Argumenten.",
"android": "Bei Google Play ansehen",
"ios": "Im App Store ansehen",
"availability": "Die Verfügbarkeit hängt von der Region ab.",
"privacy": "Datenschutzerklärung",
"otherApps": "Weitere SK APPS entdecken"
},
"it": {
"intro": "Allenati in un dibattito di tre turni con un'IA e ricevi feedback sulle tue argomentazioni.",
"android": "Vedi su Google Play",
"ios": "Vedi su App Store",
"availability": "La disponibilità varia in base alla regione.",
"privacy": "Informativa sulla privacy",
"otherApps": "Scopri altre app"
},
"ru": {
"intro": "Потренируйтесь в трёх раундах дебатов с ИИ и получите отзыв о своих аргументах.",
"android": "Открыть в Google Play",
"ios": "Открыть в App Store",
"availability": "Доступность зависит от региона.",
"privacy": "Политика конфиденциальности",
"otherApps": "Другие приложения"
},
"ar": {
"intro": "تدرّب على مناظرة من ثلاث جولات مع الذكاء الاصطناعي واحصل على ملاحظات حول حججك.",
"android": "عرض في Google Play",
"ios": "عرض في App Store",
"availability": "قد يختلف التوفر حسب المنطقة.",
"privacy": "سياسة الخصوصية",
"otherApps": "استكشف تطبيقات أخرى"
},
"th": {
"intro": "ฝึกโต้วาที 3 รอบกับ AI และรับคำแนะนำเกี่ยวกับเหตุผลของคุณ",
"android": "ดูใน Google Play",
"ios": "ดูใน App Store",
"availability": "การให้บริการอาจแตกต่างกันตามภูมิภาค",
"privacy": "นโยบายความเป็นส่วนตัว",
"otherApps": "สำรวจแอปอื่น"
},
"id": {
"intro": "Latih debat tiga ronde melawan AI dan dapatkan masukan atas argumen Anda.",
"android": "Lihat di Google Play",
"ios": "Lihat di App Store",
"availability": "Ketersediaan dapat berbeda menurut wilayah.",
"privacy": "Kebijakan privasi",
"otherApps": "Jelajahi aplikasi lain"
},
"tr": {
"intro": "Yapay zekâ ile üç turluk tartışma yap ve argümanların için geri bildirim al.",
"android": "Google Play'de görüntüle",
"ios": "App Store'da görüntüle",
"availability": "Mağaza erişimi bölgeye göre değişebilir.",
"privacy": "Gizlilik politikası",
"otherApps": "Diğer uygulamaları keşfet"
},
"nl": {
"intro": "Oefen een debat van drie rondes met AI en krijg feedback op je argumenten.",
"android": "Bekijk in Google Play",
"ios": "Bekijk in de App Store",
"availability": "Beschikbaarheid verschilt per regio.",
"privacy": "Privacybeleid",
"otherApps": "Ontdek andere apps"
},
"vi": {
"intro": "Luyện tranh luận ba vòng với AI và nhận phản hồi về lập luận của bạn.",
"android": "Xem trên Google Play",
"ios": "Xem trên App Store",
"availability": "Tính khả dụng có thể khác theo khu vực.",
"privacy": "Chính sách quyền riêng tư",
"otherApps": "Khám phá ứng dụng khác"
}
};
const browser = (navigator.language || 'en').replace('-', '_');
const lang = I18N[browser] ? browser :
(browser.toLowerCase().startsWith('zh_tw') || browser.toLowerCase().startsWith('zh_hk')) ? 'zh_TW' :
(I18N[browser.split('_')[0]] ? browser.split('_')[0] : 'en');
document.documentElement.lang = lang.replace('_', '-');
if (lang === 'ar') document.documentElement.dir = 'rtl';
const strings = I18N[lang] || I18N.en;
document.querySelectorAll('[data-copy]').forEach((element) => {
const key = element.getAttribute('data-copy');
if (Object.prototype.hasOwnProperty.call(strings, key)) {
element.textContent = strings[key];
}
});

const allowedSources = new Set(['home', 'settings', 'result']);
const source = new URLSearchParams(location.search).get('src');
const tag = allowedSources.has(source) ? source : 'generic';
const play = document.getElementById('android');
const url = new URL(play.href);
// Play Install Referrer may be useful for measurement if available, but
// no click here proves an install. No personal or arbitrary URL values.
url.searchParams.set('referrer',
'utm_source=skapps&utm_medium=share&utm_campaign=debate_me_' + tag);
play.href = url.toString();
})();
1 change: 1 addition & 0 deletions sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -320,4 +320,5 @@
<url><loc>https://appdevelopsk.com/guides/daily-habits/</loc><lastmod>2026-11-07</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
<url><loc>https://appdevelopsk.com/guides/decision-helpers/</loc><lastmod>2026-11-07</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
<url><loc>https://appdevelopsk.com/guides/ai-tools/</loc><lastmod>2026-11-07</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
<url><loc>https://appdevelopsk.com/share/debate-me/</loc><lastmod>2026-11-08</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
</urlset>
30 changes: 30 additions & 0 deletions tests/debate-me-universal-share.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {readFileSync} from 'node:fs';
const read=p=>readFileSync(new URL('../'+p,import.meta.url),'utf8');
const html=read('share/debate-me/index.html');
const js=read('share/debate-me/landing.js');
test('both real store destinations appear without invented redirects',()=>{
assert.match(html,/play\.google\.com\/store\/apps\/details\?id=jp\.appdevelopsk\.debate_me/);
assert.match(html,/apps\.apple\.com\/app\/id6760968208/);
assert.match(html,/rel="canonical" href="https:\/\/appdevelopsk\.com\/share\/debate-me\/"/);
assert.doesNotMatch(html,/debate_id|device_id|argument_text/);
assert.doesNotMatch(js,/window\.location\s*=|location\.replace|innerHTML|fetch\(/);
});
test('query parameters are restricted to non-personal campaign labels',()=>{
assert.match(js,/new Set\(\['home', 'settings', 'result'\]\)/);
assert.match(js,/allowedSources\.has\(source\) \? source : 'generic'/);
assert.match(js,/utm_source=skapps&utm_medium=share&utm_campaign=debate_me_/);
});
test('the visitor-facing landing page supports all 17 app locales',()=>{
const locales=['en','ja','zh','zh_TW','ko','es','pt','fr','de','it','ru','ar','th','id','tr','nl','vi'];
for(const loc of locales)assert.match(js,new RegExp('"'+loc+'":'));
for(const field of ['intro','android','ios','availability','privacy','otherApps'])assert.match(js,new RegExp('"'+field+'":'));
});

test('indexable universal landing is listed once in the sitemap',()=>{
const sitemap=read('sitemap.xml');
const entry='https://appdevelopsk.com/share/debate-me/';
assert.equal(sitemap.split(entry).length-1,1);
assert.match(html,/meta name="robots" content="index,follow"/);
});
Loading