diff --git a/apps/wallet/.gitignore b/apps/wallet/.gitignore index 7d785fe..6c4cad9 100644 --- a/apps/wallet/.gitignore +++ b/apps/wallet/.gitignore @@ -8,3 +8,8 @@ web-build/ # system, so android/ and ios/ are produced by prebuild rather than committed. /android /ios + +# Store material (listings, review notes, questionnaire answers, EAS Metadata +# config) is kept on the publisher's machine, not in the repository. +/store/ +/store.config.json diff --git a/apps/wallet/README.md b/apps/wallet/README.md index 7386020..105e03a 100644 --- a/apps/wallet/README.md +++ b/apps/wallet/README.md @@ -300,8 +300,10 @@ Store builds are made with EAS from `eas.json`: encryption, a privacy manifest that declares no tracking and no collected data plus the required-reason APIs the dependencies use, and the camera prompt in the seven wallet languages (`locales/`). `expo-system-ui` lets the Android build follow the light or dark appearance. Android -targets API 36, the React Native 0.86 default. Listings, review notes, the privacy policy text and -the questionnaire answers are in [`store/`](store/). +targets API 36, the React Native 0.86 default. The privacy policy is published at +https://ledgerinnovation.com/euvena/privacy/. Store listings, review notes and the questionnaire +answers are kept with the publisher, outside the repository; `store/` and `store.config.json` +(the EAS Metadata config for the App Store) are ignored so they can sit in the app folder. EAS installs the workspace but builds nothing in it, so the `eas-build-post-install` script in `package.json` builds `@euvena/qr` before the bundle is made, as the second command under @@ -326,7 +328,6 @@ pnpm --filter @euvena/wallet build # bundles the JS, no native toolchain requi | `App.tsx` | Root component, loads the payee settings, opens incoming links, holds the tab bar and switches between the screens | | `eas.json` | EAS build profiles: simulator, preview and production | | `locales/` | The camera prompt in each wallet language, for the iOS Info.plist | -| `store/` | Store listings, review notes, privacy policy text and questionnaire answers | | `plugins/` | Config plugin that keeps a restored Android activity from reopening its launch link | | `src/epc/` | Form state to an EPC069-12 payload or an EN 18184 URL (`poi.ts`), the link form of a request, plus the display formatting | | `src/i18n/` | The typed dictionary shape, one file per language, language resolution and number and date formatting | diff --git a/apps/wallet/store/README.md b/apps/wallet/store/README.md deleted file mode 100644 index 3dbf52a..0000000 --- a/apps/wallet/store/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Store material - -What the App Store and Google Play ask for beyond the build, kept beside the code it describes. - -| File | Use | -| --- | --- | -| `listing.en.md`, `listing.de.md` | Name, subtitle, short and full description, keywords, category | -| `review-notes.md` | Notes for App Review; `review-code.png` is the sample request as a QR code to attach | -| `privacy-policy.md` | The privacy policy text, published at https://ledgerinnovation.com/euvena/privacy/ | -| `declarations.md` | Answers for App Privacy, Data safety, the financial features declaration, content rating, export compliance and trader status | - -Screenshots are taken from a build on a device or simulator and are not kept here. diff --git a/apps/wallet/store/declarations.md b/apps/wallet/store/declarations.md deleted file mode 100644 index 697febf..0000000 --- a/apps/wallet/store/declarations.md +++ /dev/null @@ -1,76 +0,0 @@ -# Store declarations - -The answers for the questionnaires in App Store Connect and the Play Console, with the reason for -each. They follow from what the app does: it has no server, sends nothing by itself and keeps -everything on the device. - -## App Store Connect - -**App Privacy: Data Not Collected.** Apple counts data as collected when it is transmitted off the -device in a way that lets the developer or a partner access it. Nothing is: payees, kept requests -and settings are stored on the device (and in the user's own device backups, which the developer -cannot access), and sharing or exporting hands data to the system share sheet at the user's -request, to a destination the user picks. The privacy manifest in -`app.json` says the same: no tracking, no tracking domains, no collected data types. - -**Required reason APIs.** The privacy manifest declares the reasons the dependencies give in their -own manifests, since App Store processing does not read those from static CocoaPods: - -| API | Reasons | Declared by | -| --- | --- | --- | -| UserDefaults | CA92.1 | React Native, expo-constants, expo-localization, expo-system-ui | -| File timestamp | 0A2A.1, 3B52.1, C617.1 | React Native and its pods, AsyncStorage, expo-file-system | -| Disk space | 85F4.1, E174.1 | expo-file-system | -| System boot time | 35F9.1 | React Native | - -When a dependency is added or updated, compare its `ios/PrivacyInfo.xcprivacy` with this list. - -**Export compliance.** `usesNonExemptEncryption: false`. The app makes no network requests and -contains no encryption of its own, so the question does not come up at each upload. - -**Age rating: 4+.** No objectionable content, no web browsing inside the app, no user-generated -content shared through the app, no purchases. - -**Devices.** iPhone only (`supportsTablet: false`). Screenshots are needed for the 6.9-inch -iPhone size. - -## Play Console - -**Data safety: no data collected, no data shared.** Google counts data as collected when it is -transmitted off the device; data processed only on the device is not collected, and a transfer -the user starts through the share sheet or an intent to another app is not sharing by the -developer. The camera image is processed on the device and never stored. - -**Financial features declaration.** A choice for the publisher. The app creates and reads -payment request QR codes and hands the payment to the user's banking app; it holds no funds, -moves no money and is not a payment service. Two answers fit: - -- *Support services, Other*, described as "Creates and reads SEPA payment request QR codes. No - funds are held or moved; the payment is made in the user's own banking app." This matches the - Finance category the listing uses and explains the app to the reviewer. -- *My app doesn't provide any financial features*, since none of the listed features (banking, - loans, wallets, transfers, trading) is offered. - -"Mobile payments and digital wallets" and "Money transfer and wire services" do not fit: the app -neither stores payment credentials nor transmits money. - -**Content rating (IARC).** Category: utility, productivity, communication or other. No violence, -sexual content, profanity, controlled substances, gambling or horror. Users cannot interact or -exchange content with each other inside the app, no location is shared and nothing is sold. The -expected result is the lowest rating in every region (PEGI 3, USK 0, Everyone). - -**Target API.** 36, the default of React Native 0.86. The production profile in `eas.json` builds -an app bundle for Play App Signing. - -**Ads.** The app contains no ads. - -## Both stores - -**Privacy policy.** https://ledgerinnovation.com/euvena/privacy/, the text of -`privacy-policy.md`. - -**EU trader status (Digital Services Act).** Set on the publisher's developer accounts, not per -app: Euvena is published from the Ledger Innovation MB accounts that carry its other apps. -Confirm in each console that the trader details are complete before the first release. - -**Support URL.** The repository's issue tracker. diff --git a/apps/wallet/store/listing.de.md b/apps/wallet/store/listing.de.md deleted file mode 100644 index 533d825..0000000 --- a/apps/wallet/store/listing.de.md +++ /dev/null @@ -1,57 +0,0 @@ -# Store-Eintrag, Deutsch - -Grenzen der Stores: App-Store-Name und Untertitel 30 Zeichen, Schlüsselwörter 100, Werbetext 170, -Beschreibung 4000; Google Play Titel 30, Kurzbeschreibung 80, vollständige Beschreibung 4000. - -## Name (beide Stores) - -Euvena - -## Untertitel (App Store) - -Zahlungs-QR-Codes für SEPA - -## Kurzbeschreibung (Google Play) - -SEPA-Überweisungen per QR-Code anfordern und bezahlen. Ohne Konto, ohne Server. - -## Werbetext (App Store) - -Fordere eine SEPA-Überweisung per QR-Code an, den europäische Banking-Apps lesen, oder lies einen und gib ihn an deine Banking-App weiter. Ohne Konto, ohne Server. - -## Schlüsselwörter (App Store) - -sepa,epc,qr,qr-code,iban,überweisung,zahlungsanforderung,rechnung,bank,en 18184,echtzeit - -## Beschreibung (beide Stores) - -Euvena macht aus einer SEPA-Überweisung einen QR-Code und wieder zurück. - -GELD ANFORDERN -Gib einen Betrag ein, auf Wunsch auch den Verwendungszweck, und Euvena zeigt einen EPC-QR-Code (GiroCode), das Format, mit dem viele europäische Banking-Apps eine Überweisung ausfüllen. Teile die Anforderung als Link oder behalte sie im Verlauf auf deinem Handy. Mehrere Empfänger lassen sich speichern, für einen Haushalt, einen Verein oder ein kleines Geschäft. - -ANFORDERUNG BEZAHLEN -Scanne einen Zahlungscode oder füge eine geteilte Anforderung ein. Euvena zeigt genau, was der Code enthält: Name, IBAN, Betrag und Referenz. Dann übergibt Euvena die Angaben als payto-Link an eine App, die ihn annimmt, oder lässt dich sie Feld für Feld in deine Banking-App kopieren. Ein Code, der eine Prüfung nicht besteht, wird ganz abgelehnt und nie nur teilweise angezeigt. - -EN-18184-CODES -Euvena liest auch EN-18184-Codes (EPC024-22) für den Point of Interaction, die die Empfängerdaten enthalten, und erstellt sie, sobald du die Angaben eingibst, die dir dein Zahlungsrahmenwerk zugewiesen hat. - -KEIN KONTO, KEIN SERVER, KEINE DATEN -Euvena hat keine Konten und kein Backend. Die App hält und bewegt nie Geld und kontaktiert keine Bank: Jede Zahlung wird in deiner eigenen Banking-App ausgeführt und freigegeben. Empfänger und gespeicherte Anforderungen liegen auf deinem Handy, nie auf einem Server von uns, und eine Exportdatei überträgt sie auf ein anderes Handy, wenn du das möchtest. Es wird nichts erhoben, verfolgt oder weitergegeben. - -SIEBEN SPRACHEN -Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch und Polnisch, in heller oder dunkler Darstellung. - -Euvena ist Open Source. Der Code und die Bibliothek für Zahlungscodes dahinter liegen auf GitHub. - -## Kategorie - -Finanzen (beide Stores) - -## URL der Datenschutzerklärung - -https://ledgerinnovation.com/euvena/privacy/ - -## Support-URL - -https://github.com/LedgerInnovation/euvena/issues diff --git a/apps/wallet/store/listing.en.md b/apps/wallet/store/listing.en.md deleted file mode 100644 index 19eceba..0000000 --- a/apps/wallet/store/listing.en.md +++ /dev/null @@ -1,57 +0,0 @@ -# Store listing, English - -Limits are the stores' own: App Store name and subtitle 30 characters, keywords 100, promotional -text 170, description 4000; Google Play title 30, short description 80, full description 4000. - -## Name (both stores) - -Euvena - -## Subtitle (App Store) - -EPC QR payment requests - -## Short description (Google Play) - -Request and pay SEPA transfers by QR code. No account, no server. - -## Promotional text (App Store) - -Ask for a SEPA transfer with a QR code European banking apps can scan, or read one and pass it on to your banking app. No account, no server. - -## Keywords (App Store) - -sepa,epc,qr,qr code,iban,transfer,payment request,invoice,bank,en 18184,instant,pay me - -## Description (both stores) - -Euvena turns a SEPA credit transfer into a QR code and back. - -REQUEST MONEY -Enter an amount, and what it is for if you like, and Euvena shows an EPC QR code, the format many European banking apps scan to fill in a transfer. Share the request as a link, or keep it in the history on your phone. Several payees can be kept, for a household, a club or a small business. - -PAY A REQUEST -Scan a payment code or paste a shared request. Euvena shows exactly what the code says: the name, the IBAN, the amount and the reference. Then it hands the details on as a payto link to an app that accepts one, or lets you copy them field by field into your banking app. A code that fails any check is refused as a whole, never shown in part. - -EN 18184 CODES -Euvena also reads EN 18184 (EPC024-22) point-of-interaction codes that carry the payee's details, and builds them once you enter the details your payment framework assigned to you. - -NO ACCOUNT, NO SERVER, NO DATA -Euvena has no accounts and no backend. It never holds or moves money and never contacts a bank: every payment is made and authorised in your own banking app. Payees and kept requests are stored on your phone, never on a server of ours, and an export file moves them to another phone when you choose to. Nothing is collected, tracked or shared. - -SEVEN LANGUAGES -English, German, French, Spanish, Italian, Dutch and Polish, in light or dark appearance. - -Euvena is open source. The code and the payment code library behind it are on GitHub. - -## Category - -Finance (both stores) - -## Privacy policy URL - -https://ledgerinnovation.com/euvena/privacy/ - -## Support URL - -https://github.com/LedgerInnovation/euvena/issues diff --git a/apps/wallet/store/privacy-policy.md b/apps/wallet/store/privacy-policy.md deleted file mode 100644 index 1a16d04..0000000 --- a/apps/wallet/store/privacy-policy.md +++ /dev/null @@ -1,67 +0,0 @@ -# Euvena privacy policy - -Both stores require a privacy policy at a public address, even for an app that collects nothing. -This is its text, published at https://ledgerinnovation.com/euvena/privacy/ from the -LedgerInnovation/ledgerinnovation site repository. A change here goes there too, with a new date. - ---- - -# Privacy policy for Euvena - -Last updated: 25 September 2026 - -Euvena is a mobile app for requesting and paying SEPA credit transfers with payment QR codes. It -is published by Ledger Innovation MB, Lithuania, European Union ("we"). - -## What we collect - -Nothing. Euvena has no accounts and no server of its own. We do not collect, receive, store or -share any personal data or usage data, and the app contains no analytics, advertising or -tracking code. - -## What stays on your device - -What you enter is stored on your device, by the app: - -- the payees you add: name, IBAN and optional BIC -- the payment requests you keep in the history -- your settings: appearance, language and, if you set them up, the EN 18184 framework details - -We cannot see this data. If you use device backups, such as iCloud Backup or Android backup to -your Google account, it is included in your own backup like other app data, which we cannot -access either. It is removed from the device when you remove it in the app or uninstall the app. On Android, a -file you export can stay in the app's cache until the system clears it or the app is uninstalled. - -## Camera - -The camera is used only to read payment QR codes on the Pay tab, and only after you allow it. -Images are processed on the device, never recorded and never sent anywhere. - -## When data leaves your device - -Only when you act: - -- **Sharing a request** hands a message with the request to the share sheet of your operating - system. You choose where it goes. -- **Handing a payment to your banking app** opens that app, or another app you have installed, - with the payment details. Copying a field places it on your clipboard. -- **Exporting your data** writes a file with your payees and kept requests and hands it to the - share sheet. You choose where it is saved or sent. - -In each case the receiving app or service handles the data under its own terms. Euvena does not -send anything to us or to anyone else by itself. - -Scanning or pasting an EN 18184 code, which is a web address, does not open that address: the -app reads it on the device. - -## Children - -Euvena is not directed at children and collects no data from anyone. - -## Changes - -If this policy changes, the new version is published at this address with a new date. - -## Contact - -Ledger Innovation MB, Lithuania, European Union. info@ledgerinnovation.com diff --git a/apps/wallet/store/review-code.png b/apps/wallet/store/review-code.png deleted file mode 100644 index 64bb0bb..0000000 Binary files a/apps/wallet/store/review-code.png and /dev/null differ diff --git a/apps/wallet/store/review-notes.md b/apps/wallet/store/review-notes.md deleted file mode 100644 index edb8c64..0000000 --- a/apps/wallet/store/review-notes.md +++ /dev/null @@ -1,48 +0,0 @@ -# App review notes - -Paste into App Store Connect (App Review Information, Notes) and, shortened, into the Play -Console where a reviewer note is asked for. No sign-in is needed, so no demo account is given. - ---- - -Euvena composes and reads payment requests for SEPA credit transfers. It holds no funds, executes -no payments, has no accounts and no backend, and contacts no bank or payment service. - -How to try it: - -1. On first launch the app asks for a payee. Enter any name and a test IBAN such as - DE89 3704 0044 0532 0130 00, then Save. -2. The Request tab now shows an EPC069-12 QR code ("EPC QR code" or "GiroCode"), the format - European banking apps scan to fill in a transfer. Type an amount and the code updates. "Share - this request" opens the system share sheet with the request as text and a link. -3. The Pay tab reads a payment code with the camera, or pasted text. Copy one of the two samples - below to the test device, paste it and tap "Read what was pasted". The review shows the decoded - values. "Open your banking app" hands them on as a payto link to an installed app that accepts - one; the rows below it copy each value for a transfer form. The payment itself is always made - and authorised in the user's own banking app. -4. The History tab lists requests that were shared or kept. Settings holds the payees, the - appearance, the language, an export and import of the on-device data, and the optional - EN 18184 code settings. - -Sample request on one line, a payto link: - -payto://iban/DE33100205000001194700?amount=EUR:13.05&receiver-name=Wikimedia%20Foerdergesellschaft&message=Spende%20fuer%20Wikipedia - -The same request as an EPC069-12 payload, eleven lines copied exactly, with nothing before each -line. Lines 5, 9 and 10 are empty: no BIC, no purpose code, no structured reference. - -BCD -002 -1 -SCT - -Wikimedia Foerdergesellschaft -DE33100205000001194700 -EUR13.05 - - -Spende fuer Wikipedia - -The same request is attached as review-code.png, for scanning from a second device. - -The camera is used only on the Pay tab, to read QR codes. All data stays on the device.