// storebound config of the demo app "Tidy Lists" (fictional, made for this repo) to show the app profile and the app // screenshot style. Placeholder ids and URLs only: nothing here points at a real store record. See README.md. import type { ShipConfig } from '../../cli/lib/config'; const config: ShipConfig = { app: { name: 'Tidy Lists', profile: 'app', copyright: '2026 Example Studio', privacyPolicyUrl: 'https://example.com/privacy', termsUrl: 'https://example.com/terms', supportUrl: 'https://example.com/support', website: 'https://example.com', contactEmail: 'support@example.com', }, accounts: { enabled: true, deletionUrl: 'https://example.com/delete-account', inApp: 'Settings > Account > Delete account' }, reviewAccess: { signInRequired: true, instructions: 'Sign in with the demo account; the Groceries list is shared with a second demo user.' }, languages: [ { id: 'en', play: 'en-US', apple: 'en-US' }, { id: 'tr', play: 'tr-TR', apple: 'tr' }, ], play: { packageName: 'com.example.tidylists' }, apple: { bundleId: 'com.example.tidylists' }, // Play Data safety answers (`storebound play data-safety --dry` prints the CSV Play imports). Lists sync to the account. dataSafety: { collectsData: true, encryptedInTransit: true, accountCreation: ['PSL_ACM_USER_ID_PASSWORD'], partialDeletion: false, // a page that deletes data without deleting the account? (true needs partialDeletionUrl) data: { PSL_EMAIL: { shared: false, collect: ['functionality', 'account'] }, PSL_USER_ACCOUNT: { shared: false, collect: ['functionality', 'account'] }, PSL_USER_GENERATED_CONTENT: { shared: false, collect: ['functionality'] }, PSL_CRASH_LOGS: { shared: false, collect: ['analytics'] }, }, }, // `storebound scan` findings that are true for this fictional demo and accepted on purpose (README.md) scan: { ignore: [ { rule: 'template-answers', reason: 'fictional demo app: its Example Studio copyright is the placeholder of a project that is never uploaded' }, { rule: 'demo-account', reason: 'fictional demo app without a store record: there is no backend to sign in to, so no App Review demo account' }, { rule: 'play-app-access', reason: 'fictional demo app without a store record: no Play App access credentials' }, { rule: 'play-package-name', reason: 'fictional demo app: com.example.* is the repo placeholder and is never uploaded' }, { rule: 'play-testing-requirement', reason: 'fictional demo app without a Play developer account, so there is no account type to set' }, ], }, renders: 'store/renders', shots: { style: 'app', copy: 'store/shots/copy.json', frames: 'store/shots/frames', out: 'store/renders', scenes: [ { id: 'lists', palette: 'mist', frames: [{ src: 'lists.png' }] }, { id: 'check', palette: 'mint', frames: [{ src: 'list.png' }] }, { id: 'share', palette: 'sky', frames: [{ src: 'share.png' }] }, { id: 'account', palette: 'slate', frames: [{ src: 'account.png' }] }, ], feature: { frame: 'lists.png', palette: 'mist' }, capture: { source: 'web', baseUrl: 'http://127.0.0.1:8741', query: 'lang={lang}', shots: { lists: { path: '/?screen=lists', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' }, list: { path: '/?screen=list', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' }, share: { path: '/?screen=share', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' }, account: { path: '/?screen=account', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' }, }, }, }, }; export default config;