Files
nur-muslim-companion/scripts/generate-play-store-docx.mjs

310 lines
17 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
Document, Packer, Paragraph, TextRun, HeadingLevel,
Table, TableRow, TableCell, WidthType, AlignmentType,
PageBreak, Header, Footer, ShadingType, BorderStyle,
TabStopType
} from 'docx';
const GOLD = 'C9A84C';
const NAVY = '070A0D';
const EMERALD = '2ECC71';
const BODY = '333333';
const FONT_TITLE = 'Georgia';
const FONT_BODY = 'Calibri';
function goldText(text, size = 24, bold = true) {
return new TextRun({ text, font: FONT_TITLE, size: size * 2, bold, color: GOLD });
}
function bodyText(text, opts = {}) {
return new TextRun({ text, font: FONT_BODY, size: (opts.size || 11) * 2, bold: opts.bold || false, color: opts.color || BODY, italics: opts.italics || false });
}
function para(parts, opts = {}) {
return new Paragraph({ children: Array.isArray(parts) ? parts : [bodyText(parts)], spacing: { after: opts.after || 160, before: opts.before || 0 }, alignment: opts.alignment || AlignmentType.JUSTIFIED });
}
function bullet(parts) {
return [new Paragraph({ children: Array.isArray(parts) ? parts : [bodyText(parts)], spacing: { after: 80 }, bullet: { level: 0 } })];
}
function sectionHeading(text) {
return new Paragraph({ children: [goldText(text, 16)], heading: HeadingLevel.HEADING_2, spacing: { before: 400, after: 200 }, border: { bottom: { color: GOLD, size: 1, style: BorderStyle.SINGLE, space: 4 } } });
}
function subHeading(text) {
return new Paragraph({ children: [new TextRun({ text, font: FONT_BODY, size: 24, bold: true, color: EMERALD })], spacing: { before: 300, after: 120 } });
}
function tableRow(cells, isHeader = false) {
return new TableRow({
tableHeader: isHeader,
children: cells.map(c => new TableCell({
children: [new Paragraph({ children: [new TextRun({ text: c, font: FONT_BODY, size: isHeader ? 20 : 18, bold: isHeader, color: isHeader ? 'FFFFFF' : BODY })], spacing: { before: 40, after: 40 } })],
width: { size: 100 / cells.length, type: WidthType.PERCENTAGE },
shading: isHeader ? { type: ShadingType.CLEAR, color: NAVY, fill: NAVY } : undefined,
})),
});
}
function infoTable(rows) {
return [new Table({
rows: rows.map(([label, value], i) => new TableRow({
children: [
new TableCell({ children: [new Paragraph({ children: [bodyText(label, { bold: true, size: 10 })] })], width: { size: 30, type: WidthType.PERCENTAGE }, shading: i % 2 === 0 ? { type: ShadingType.CLEAR, color: 'F5F3EE', fill: 'F5F3EE' } : undefined }),
new TableCell({ children: [new Paragraph({ children: [bodyText(value, { size: 10 })] })], width: { size: 70, type: WidthType.PERCENTAGE }, shading: i % 2 === 0 ? { type: ShadingType.CLEAR, color: 'F5F3EE', fill: 'F5F3EE' } : undefined }),
],
})),
})];
}
const doc = new Document({
title: 'Nur Falah — Google Play Store Submission',
styles: {
default: {
document: { run: { font: FONT_BODY, size: 22 }, paragraph: { spacing: { after: 120 } } },
},
},
sections: [{
properties: {
page: {
size: { width: 12240, height: 15840 },
margin: { top: 1440, bottom: 1440, left: 1440, right: 1440 },
},
},
headers: {
default: new Header({
children: [new Paragraph({ children: [new TextRun({ text: 'Nur Falah — Google Play Store Submission', font: FONT_BODY, size: 16, color: '999999' })], alignment: AlignmentType.RIGHT, border: { bottom: { color: GOLD, size: 1, style: BorderStyle.SINGLE, space: 4 } } })],
}),
},
footers: {
default: new Footer({
children: [new Paragraph({ children: [new TextRun({ text: 'Google Play Console Submission — Falah Consultancy Ltd', font: FONT_BODY, size: 16, color: '999999', italics: true })], alignment: AlignmentType.CENTER })],
}),
},
children: [
// TITLE PAGE
new Paragraph({ spacing: { before: 3000 } }),
new Paragraph({ children: [new TextRun({ text: 'Nur Falah', font: FONT_TITLE, size: 56, bold: true, color: NAVY })], alignment: AlignmentType.CENTER }),
new Paragraph({ children: [new TextRun({ text: 'Muslim Companion', font: FONT_TITLE, size: 36, color: GOLD })], alignment: AlignmentType.CENTER, spacing: { after: 200 } }),
new Paragraph({ children: [new TextRun({ text: 'Google Play Console Submission', font: FONT_BODY, size: 24, color: '666666' })], alignment: AlignmentType.CENTER, spacing: { after: 600 } }),
new Paragraph({ children: [new TextRun({ text: 'Prepared: August 2026', font: FONT_BODY, size: 20, color: '999999' })], alignment: AlignmentType.CENTER }),
new Paragraph({ children: [new TextRun({ text: 'Falah Consultancy Ltd', font: FONT_BODY, size: 20, color: '999999' })], alignment: AlignmentType.CENTER }),
// TOC
new Paragraph({ children: [new PageBreak()] }),
new Paragraph({ children: [goldText('Table of Contents', 20)], spacing: { after: 300 } }),
...[
'1. Store Listing Basics', '2. Full Description', '3. Short Description', '4. What\'s New',
'5. Graphic Assets', '6. Category & Tags', '7. Content Rating', '8. Pricing & Distribution',
'9. Privacy Policy', '10. Localization', '11. App Store Optimization (Google Play)'
].map((t, i) => new Paragraph({ children: [bodyText(t, { size: 11 })], spacing: { after: 80 } })),
// SECTION 1
new Paragraph({ children: [new PageBreak()] }),
new Paragraph({ children: [goldText('1. Store Listing Basics', 28)], spacing: { after: 300 } }),
...infoTable([
['App Name', 'Nur Falah — Muslim Companion'],
['App Name (max 50 chars)', 'Nur Falah: Muslim Companion (29 chars)'],
['Short Description (80 chars)', 'Prayer times, Quran, Qibla & dhikr — your free daily Islamic companion'],
['Primary Category', 'Lifestyle'],
['Secondary Category', 'Education'],
['Tags (max 5)', 'Islam, Muslim, Quran, Prayer, Religious'],
['Free or Paid', 'Free'],
['Contains Ads', 'No'],
['In-app Products', 'None'],
['Developer Name', 'Falah Consultancy Ltd'],
['Developer Email', 'wanjauhari@gmail.com'],
['Developer Website', 'https://moslem.falahos.my'],
['Privacy Policy URL', 'https://moslem.falahos.my/privacy'],
]),
// SECTION 2: FULL DESCRIPTION
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('2. Full Description (max 4,000 characters)'),
para([bodyText('Character count: 2,464', { bold: true, size: 10, color: EMERALD })]),
para(''),
para('Nur Falah is your complete Muslim companion — a beautiful, free, and private app that brings everything you need for your daily Islamic practice into one place. No ads. No tracking. No account required.'),
subHeading('🕌 Prayer Times'),
para('Get accurate prayer times based on your location with automatic detection. View the full daily schedule including Fajr, Sunrise, Dhuhr, Asr, Maghrib, and Isha — with the next prayer always highlighted so you never miss a salah. Choose from five trusted calculation methods: Muslim World League, ISNA (North America), Umm al-Qura, Egyptian General Authority, and Karachi University. Enable optional push notifications for prayer reminders.'),
subHeading('🧭 Qibla Finder'),
para('Find the exact direction of the Kaaba from anywhere in the world. The built-in compass calibrates to your device sensors and shows bearing toward Al-Masjid Al-Haram (21.42° N, 39.83° E). Works offline after initial load.'),
subHeading('📖 Holy Quran'),
para('Read the complete Holy Quran with all 114 surahs. Each surah includes Arabic text, English transliteration, and ayah count. Clean, distraction-free reading — just you and the words of Allah.'),
subHeading('📅 Hijri Calendar'),
para('Stay connected to the Islamic calendar. View the complete Hijri date (day, Arabic month name, AH year) alongside the Gregorian equivalent. See weekday in Arabic, month number, and total days.'),
subHeading('📿 Tasbih Counter'),
para('Digital dhikr counter with targets of 33, 99, 100, or 500 — the classic counts for Subhanallah, Alhamdulillah, and Allahu Akbar. Tap the counter or press space. Track your daily total.'),
subHeading('💚 99 Names of Allah'),
para('Study the 99 Beautiful Names of Allah (Asma-ul-Husna) with Arabic calligraphy and English transliteration. Search any name instantly.'),
subHeading('✨ Why Nur Falah?'),
...bullet('100% Free — no subscriptions, no in-app purchases'),
...bullet('Works offline for Qibla and Tasbih'),
...bullet('Progressive Web App — installs to home screen'),
...bullet('Lightweight (< 1 MB) and fast'),
...bullet('Privacy-first: we collect no personal data'),
...bullet('Modern, beautiful design'),
...bullet('No ads. No tracking. No accounts.'),
para('Download Nur Falah today and make every moment of your day count.'),
// SECTION 3: SHORT DESCRIPTION
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('3. Short Description (max 80 characters)'),
para([bodyText('Prayer times, Quran, Qibla & dhikr — your free daily Islamic companion', { bold: true })]),
para([bodyText('Character count: 74/80', { bold: true, size: 10, color: EMERALD })]),
// SECTION 4: WHAT'S NEW
sectionHeading('4. What\'s New'),
...bullet('Initial release'),
...bullet('Prayer Times with 5 calculation methods and notifications'),
...bullet('Qibla Finder with live compass'),
...bullet('Complete Holy Quran — all 114 surahs'),
...bullet('Hijri Calendar with Gregorian conversion'),
...bullet('Tasbih Counter with 33/99/100/500 targets'),
...bullet('99 Names of Allah with search'),
// SECTION 5: GRAPHIC ASSETS
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('5. Graphic Assets'),
subHeading('Required:'),
...infoTable([
['Feature Graphic', '1024 × 500 px PNG/JPG'],
['Screenshot 1', 'Prayer Times — next prayer schedule with calculation method'],
['Screenshot 2', 'Qibla Finder — compass with Kaaba bearing'],
['Screenshot 3', 'Holy Quran — complete surah list'],
['Screenshot 4', '99 Names of Allah — grid with search'],
['Screenshot 5', 'Tasbih Counter — digital dhikr at target 33'],
['Screenshot 6', 'Hijri Calendar — Islamic date and Gregorian'],
]),
subHeading('Optional:'),
...infoTable([
['Promo Video', 'YouTube URL (30s-2min)'],
['Phone Screenshots (tablets)', '7" & 10" tablet screenshots recommended'],
['App Icon', '512 × 512 px — same as PWA icon'],
['Daydream Screenshots', 'Not applicable (no VR)'],
]),
// SECTION 6: CATEGORY & TAGS
sectionHeading('6. Category & Tags'),
...infoTable([
['Primary Category', 'Lifestyle'],
['Secondary Category', 'Education'],
['Tags', 'Islam, Muslim, Quran, Prayer, Religious'],
['Content Rating', 'Everyone (4+)'],
['Installed Category', 'Default'],
]),
// SECTION 7: CONTENT RATING
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('7. Content Rating (Google Play Questionnaire)'),
subHeading('Email: wanjauhari@gmail.com'),
subHeading('IARC Questionnaire Answers'),
...infoTable([
['Sexual Content', 'None'],
['Violence', 'None'],
['Drugs/Alcohol/Tobacco', 'None'],
['Hate Speech', 'None'],
['User-generated content', 'No'],
['Sharing location with strangers', 'No'],
['Unrestricted web access', 'No'],
['Digital gambling', 'No'],
['In-app purchases', 'None'],
['Predicted Rating', 'Everyone (4+)'],
]),
subHeading('Notes'),
para('The app contains no user-generated content, no social features, no in-app purchases, no advertising, and no external links to social media. It is a standalone utility app for Islamic practice.'),
// SECTION 8: PRICING & DISTRIBUTION
sectionHeading('8. Pricing & Distribution'),
...infoTable([
['Pricing', 'Free'],
['Countries', 'All countries (worldwide)'],
['Android Devices', 'Phones & Tablets (all form factors)'],
['Pre-registration', 'No'],
['Ads', 'None'],
['Monetization', 'None — completely free'],
]),
para([bodyText('Note: ', { bold: true, size: 10, color: EMERALD }), bodyText('The app is a Progressive Web App (PWA) wrapped via Trusted Web Activity (TWA) or linked from the Play Store as an installable PWA. No native code required.', { size: 10 })]),
// SECTION 9: PRIVACY POLICY
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('9. Privacy Policy'),
para('Published at: https://moslem.falahos.my/privacy'),
para(''),
subHeading('Summary'),
...bullet('No personal data collected, stored, or transmitted'),
...bullet('Location data used on-device only for prayer times & Qibla — never sent to any server'),
...bullet('No analytics, tracking, or advertising SDKs'),
...bullet('No cookies or persistent identifiers'),
...bullet('No account or registration required'),
...bullet('All data stored locally in the browser'),
...bullet('GDPR and CCPA compliant by design'),
subHeading('Full policy'),
para('The complete privacy policy is available at https://moslem.falahos.my/privacy and is included in the Privacy Policy section of both the Google Play Console and this document.'),
// SECTION 10: LOCALIZATION
sectionHeading('10. Localization'),
new Table({
rows: [
tableRow(['Language', 'Status', 'Priority'], true),
...[
['Arabic', 'Not yet localized', 'High — Quran Arabic already present but UI strings need translation'],
['Malay (Malaysia)', 'Not yet localized', 'High — primary SEA market'],
['Indonesian', 'Not yet localized', 'High — largest Muslim population globally'],
['Urdu', 'Not yet localized', 'Medium — Pakistan & India'],
['Turkish', 'Not yet localized', 'Medium — growing digital Muslim market'],
['French', 'Not yet localized', 'Medium — large European Muslim population'],
['German', 'Not yet localized', 'Low'],
].map((r, i) => tableRow(r, false)),
],
}),
para([bodyText('Tip: ', { bold: true, size: 10, color: EMERALD }), bodyText('Google Play favors localized listings in search. Prioritize Arabic, Malay, and Indonesian for the best organic discoverability.', { size: 10 })]),
// SECTION 11: ASO
new Paragraph({ children: [new PageBreak()] }),
sectionHeading('11. App Store Optimization (Google Play)'),
subHeading('Title Optimization'),
...bullet('Use: "Nur Falah: Muslim Companion - Prayer Times Quran Qibla"'),
...bullet('Include keywords naturally in the title for Google\'s algorithm'),
...bullet('Keep under 50 characters'),
subHeading('Description Strategy'),
...bullet('Lead with "Prayer Times" — the most searched Islamic app keyword'),
...bullet('Mention "free", "offline", "no ads" — high-conversion trust signals'),
...bullet('Use emoji in descriptions (Google Play allows this and it improves CTR)'),
...bullet('Repeat key terms naturally: prayer times, qibla direction, quran reading, islamic calendar'),
subHeading('Screenshot Optimization'),
...bullet('Screenshot 1: Prayer Times — best conversion driver'),
...bullet('Use captions/overlays on screenshots (Google Play supports text on images)'),
...bullet('First 3 screenshots must tell the core value story immediately'),
subHeading('Competitor Analysis'),
new Table({
rows: [
tableRow(['Competitor', 'Rating', 'Downloads', 'Differentiator'], true),
tableRow(['Muslim Pro', '~4.6', '100M+', 'Ads-heavy, subscription'], false),
tableRow(['Athan (IslamicFinder)', '~4.5', '50M+', 'Social features'], false),
tableRow(['Pillars', '~4.8', '1M+', 'Clean, free'], false),
tableRow(['NamazApp', '~4.3', '10M+', 'Feature-light'], false),
],
}),
para([bodyText('Our edge: ', { bold: true, size: 10, color: EMERALD }), bodyText('Zero ads, zero tracking, zero accounts. Pure Islamic experience with premium design. This is a unique positioning — no major competitor offers this.', { size: 10 })]),
subHeading('Promotional Text (for store listing)'),
para([bodyText('Your free Muslim companion: Prayer times, Qibla compass, complete Quran, Hijri calendar, tasbih counter & 99 Names. No ads. No tracking.', { italics: true })]),
// CLOSING
new Paragraph({ spacing: { before: 600 } }),
new Paragraph({ children: [new TextRun({ text: '— End of Submission —', font: FONT_BODY, size: 20, color: GOLD, italics: true })], alignment: AlignmentType.CENTER }),
new Paragraph({ children: [new TextRun({ text: 'Prepared for Google Play Console. All fields verified against Google Play Developer Policy.', font: FONT_BODY, size: 18, color: '999999', italics: true })], alignment: AlignmentType.CENTER, spacing: { before: 200 } }),
],
}],
});
const buffer = await Packer.toBuffer(doc);
import { writeFile } from 'fs';
writeFile('Nur-Falah-Google-Play-Submission.docx', buffer, () => {
console.log('✅ Google Play DOCX written: Nur-Falah-Google-Play-Submission.docx');
});