{
  "version": "prince-self-ledger-v1",
  "updated": "2026-09-29",
  "statement": "PRINCE holds every AI to what a person actually allowed. It lists itself first, under the same rule: every power it has, when it uses it, what it cannot do, and where your information goes.",
  "capabilities": [
    {
      "id": "scan_what_you_share",
      "surface": "all",
      "channel": "all",
      "title": "Checks what you choose to scan",
      "when": "When you share, paste, upload or tap Scan on a message, link, picture, recording or video.",
      "sends": "What you chose goes to PRINCE's servers, and from there to the AI and checking services below that the scan needs.",
      "keeps": "A personal scan is kept as signals, not your content: the verdict, the bare name of the site, the guardian and the time. It expires after 90 days.",
      "cannot": [
        "It does not keep the words, pictures or recordings you scanned.",
        "It does not use your scans to train anyone's AI unless you choose to share an example."
      ],
      "primitives": [
        "READ_DATA",
        "DISCLOSE"
      ],
      "dataClasses": [
        "messages",
        "photos_video",
        "voice_likeness",
        "browsing"
      ],
      "evidence": [
        "public/privacy.html",
        "docs/PLAY-SUBMISSION.md"
      ]
    },
    {
      "id": "help_others_share",
      "surface": "all",
      "channel": "all",
      "title": "Helps others, only if you turn it on",
      "when": "Only when Help others is on, or when you tap Share this example on a dangerous result.",
      "sends": "A cleaned, anonymous copy joins the public threat map with your country only. A shared example is kept for 30 days to teach the guardians, under a code that is not your account.",
      "keeps": "Threat-map entries show country only. Shared examples are deleted after 30 days.",
      "cannot": [
        "It never shares anything while Help others is off and you have not tapped Share.",
        "The public map never shows your city, your name or your message."
      ],
      "primitives": [
        "DISCLOSE"
      ],
      "dataClasses": [
        "messages",
        "browsing"
      ],
      "evidence": [
        "public/privacy.html",
        "functions/trainingCorpus.js"
      ]
    },
    {
      "id": "crown_screen_read",
      "surface": "android",
      "channel": "all",
      "title": "Reads your screen when you tap the crown",
      "when": "Only when you tap the crown. It reads the email or page in front of you, scrolling down to reach the end, and scans what it read. If an app hides its words, it reads them from a screenshot on the phone instead. Long-press the crown and it describes the screen aloud. With Mama Mode on, it also reads the web address in your browser's address bar and checks it on the phone against a list of known scams.",
      "sends": "A tap sends the words it read to be scanned; the screenshot itself stays on the phone. A long-press on a screen that is mostly pictures sends a small picture of the screen to an AI model to be described. The Mama Mode address check happens on the phone and sends nothing.",
      "keeps": "Nothing from the screen is kept, here or on the server.",
      "cannot": [
        "It does not read your screen on its own.",
        "It never taps, types or changes anything in another app. Its only movement is scrolling down while you watch.",
        "In Mama Mode it never reads the page itself, only the address."
      ],
      "primitives": [
        "READ_DATA",
        "CONTROL_DEVICE"
      ],
      "dataClasses": [
        "messages",
        "browsing"
      ],
      "androidServices": [
        "ai.projectprince.mobile.service.GuardianBubbleService"
      ],
      "androidPermissions": [
        "android.permission.BIND_ACCESSIBILITY_SERVICE"
      ],
      "evidence": [
        "mobile-android/app/src/main/res/xml/guardian_bubble_config.xml",
        "docs/PLAY-SUBMISSION.md"
      ]
    },
    {
      "id": "call_screening",
      "surface": "android",
      "channel": "all",
      "title": "Stops known scam calls before they ring",
      "when": "Only after you give PRINCE the call-screening role in Android's own dialog and turn Mama Mode on.",
      "sends": "Nothing. Each incoming number is checked on the phone against a hashed list of known scam numbers.",
      "keeps": "Nothing about your calls.",
      "cannot": [
        "It cannot hear any call.",
        "Numbers never leave the phone for this check."
      ],
      "primitives": [
        "READ_DATA",
        "CONTROL_DEVICE"
      ],
      "dataClasses": [
        "contacts"
      ],
      "androidServices": [
        "ai.projectprince.mobile.service.MamaCallScreeningService"
      ],
      "androidPermissions": [
        "android.permission.BIND_SCREENING_SERVICE"
      ],
      "evidence": [
        "mobile-android/app/src/main/AndroidManifest.xml"
      ]
    },
    {
      "id": "message_watch",
      "surface": "android",
      "channel": "pilot",
      "title": "Warns about scam messages as they arrive (pilot app only)",
      "when": "Only in the pilot app, and only after you grant notification access. It reads new message notifications on the phone and matches them against PRINCE's fixed scam signs.",
      "sends": "Nothing. A cloud scan runs only if you tap the warning.",
      "keeps": "Nothing.",
      "cannot": [
        "The message text never leaves the phone unless you tap to scan it.",
        "The Play Store version does not contain this at all."
      ],
      "primitives": [
        "READ_DATA"
      ],
      "dataClasses": [
        "messages"
      ],
      "androidServices": [
        "ai.projectprince.mobile.service.MamaTextWatchService"
      ],
      "androidPermissions": [
        "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
      ],
      "evidence": [
        "mobile-android/app/src/main/AndroidManifest.xml",
        "mobile-android/app/src/play/AndroidManifest.xml"
      ]
    },
    {
      "id": "network_protection",
      "surface": "android",
      "channel": "all",
      "title": "Blocks known scam sites for the whole phone (Mama Network Protection)",
      "when": "Only after you turn it on, agree to the disclosure and accept Android's VPN dialog. You can pause it at any time.",
      "sends": "Your phone's internet traffic travels encrypted through PRINCE's gateway. Site names are checked against a signed warning list; allowed look-ups go to Cloudflare's 1.1.1.1. When a listed scam site is stopped, its name is sent to PRINCE once to recheck the evidence.",
      "keeps": "No browsing history. A stopped site becomes an unreadable security code that is deleted after 30 days.",
      "cannot": [
        "It cannot read the contents of secure (HTTPS) connections, and PRINCE will never try.",
        "It does not sell or advertise with network data."
      ],
      "primitives": [
        "READ_DATA",
        "CONTROL_DEVICE"
      ],
      "dataClasses": [
        "browsing"
      ],
      "androidServices": [
        "ai.projectprince.mamavpnclient.MamaOutlineVpnService"
      ],
      "androidPermissions": [
        "android.permission.BIND_VPN_SERVICE",
        "android.permission.FOREGROUND_SERVICE",
        "android.permission.FOREGROUND_SERVICE_SPECIAL_USE"
      ],
      "evidence": [
        "docs/MAMA-VPN-PLAY-COMPLIANCE.md"
      ]
    },
    {
      "id": "microphone",
      "surface": "android",
      "channel": "all",
      "title": "Listens only while you use a voice feature",
      "when": "Only after you start one: Echo Ears on a call, a Lingua conversation, a question to Solomon or Nana, Task Rescue, or recording a story for Solomon.",
      "sends": "Speech is turned into text by your phone's own speech service (on most Android phones, Google's), and that text is handled like anything else you ask. A story you record for Solomon is kept with that story.",
      "keeps": "Only the stories you choose to record for Solomon.",
      "cannot": [
        "It never listens in the background.",
        "Echo Ears only listens after you tap it."
      ],
      "primitives": [
        "PERCEIVE"
      ],
      "dataClasses": [
        "voice_likeness"
      ],
      "androidPermissions": [
        "android.permission.RECORD_AUDIO"
      ],
      "evidence": [
        "mobile-android/app/src/main/java/ai/projectprince/mobile/screens/EchoEarsScreen.kt",
        "mobile-android/app/src/main/java/ai/projectprince/mobile/screens/SolomonScreen.kt"
      ]
    },
    {
      "id": "solomon_memory",
      "surface": "all",
      "channel": "all",
      "title": "Remembers what you ask Solomon to remember",
      "when": "When you save something with Solomon or ask him a question.",
      "sends": "What you save is kept under your account on PRINCE's servers. To answer a question, Solomon sends your saved memories and the question to an AI model.",
      "keeps": "Your memories, until you delete them. The questions you asked, for 180 days, so he can carry the thread.",
      "cannot": [
        "He answers only from what you saved and never invents a memory.",
        "Your Trusted Circle sees only what you grant, and every look is recorded for you.",
        "Nothing outside can write into Solomon's memory: not a scan, not another guardian, not Proto."
      ],
      "primitives": [
        "REMEMBER"
      ],
      "dataClasses": [
        "messages",
        "health",
        "contacts",
        "calendar",
        "voice_likeness",
        "photos_video"
      ],
      "evidence": [
        "functions/solomonMemory.js"
      ]
    },
    {
      "id": "on_phone_memory",
      "surface": "android",
      "channel": "all",
      "title": "Keeps some things only on your phone",
      "when": "Echo's memory of how a conversation is building, Wallah's Circle picks and people, your guardian settings.",
      "sends": "Nothing. These never leave the phone.",
      "keeps": "Encrypted on the phone until you clear them.",
      "cannot": [
        "PRINCE's servers never see them.",
        "Wallah never builds a profile of a child anywhere."
      ],
      "primitives": [
        "REMEMBER"
      ],
      "dataClasses": [
        "messages",
        "children"
      ],
      "evidence": [
        "docs/WALLAHS-CIRCLE-BUILD-PLAN-2026-09-12.md"
      ]
    },
    {
      "id": "phone_basics",
      "surface": "android",
      "channel": "all",
      "title": "The ordinary phone permissions",
      "when": "Always, in the background of the features above.",
      "sends": "Nothing by itself.",
      "keeps": "Nothing by itself.",
      "cannot": [
        "None of these lets PRINCE read your messages, photos, contacts or location."
      ],
      "details": [
        "Internet and network state: to reach PRINCE's servers and to know when you are offline.",
        "Notifications: to warn you and to remind you.",
        "Vibration: so a warning can be felt, not only seen or heard.",
        "Exact alarms and starting after a restart: so Solomon's reminders ring on time. The Play Store version asks only for the alarm permission you can switch off in Android's settings.",
        "Battery optimization exemption: so the crown and protection are not put to sleep by the phone.",
        "Protected-call cards: short fixed messages that tell the app a call was checked. For PRINCE's founders only, the same channel carries a count of decisions waiting, never their details."
      ],
      "primitives": [
        "COMMUNICATE"
      ],
      "dataClasses": [
        "public"
      ],
      "androidPermissions": [
        "android.permission.INTERNET",
        "android.permission.ACCESS_NETWORK_STATE",
        "android.permission.POST_NOTIFICATIONS",
        "android.permission.VIBRATE",
        "android.permission.SCHEDULE_EXACT_ALARM",
        "android.permission.USE_EXACT_ALARM",
        "android.permission.RECEIVE_BOOT_COMPLETED",
        "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
      ],
      "androidServices": [
        "ai.projectprince.mobile.echo.EchoProtectedCallMessagingService"
      ],
      "evidence": [
        "mobile-android/app/src/main/AndroidManifest.xml",
        "mobile-android/app/src/play/AndroidManifest.xml"
      ]
    },
    {
      "id": "extension_mama_mode",
      "surface": "chrome",
      "channel": "all",
      "title": "Desktop Mama Mode checks the pages you open",
      "when": "Only while you have Mama Mode switched on in the extension, on the tab you are looking at.",
      "sends": "The page's address, title, the first 2,000 characters of visible text and up to 25 links go to PRINCE for a quick check: at most once every 30 seconds per tab, and the same page at most once every 3 minutes. Web mail is included on purpose, because scam emails live there.",
      "keeps": "The same as any personal scan: signals, not the page.",
      "cannot": [
        "It skips every government (.gov) and .bank site and a named list of major banks, brokerages, payment apps, credit bureaus, health portals, pharmacies and password managers. A smaller bank that is not on that list is not skipped, so switch Mama Mode off on sites like that.",
        "With Mama Mode off, nothing is sent unless you tap Scan."
      ],
      "primitives": [
        "READ_DATA",
        "DISCLOSE"
      ],
      "dataClasses": [
        "browsing",
        "messages"
      ],
      "chromePermissions": [
        "<all_urls>",
        "tabs",
        "storage"
      ],
      "evidence": [
        "PRINCE-Scanner/content.js",
        "PRINCE-Scanner/background.js"
      ]
    },
    {
      "id": "extension_scan_on_tap",
      "surface": "chrome",
      "channel": "all",
      "title": "Scans a page, selection or picture when you ask",
      "when": "When you click Scan, use the right-click menu, or pick something on the page.",
      "sends": "What you chose goes to be scanned, like any scan.",
      "keeps": "Signals, not the page.",
      "cannot": [
        "It does not scan pages you did not ask about, unless Mama Mode is on."
      ],
      "primitives": [
        "READ_DATA",
        "DISCLOSE"
      ],
      "dataClasses": [
        "browsing",
        "messages",
        "photos_video"
      ],
      "chromePermissions": [
        "activeTab",
        "scripting",
        "contextMenus",
        "windows",
        "clipboardWrite"
      ],
      "evidence": [
        "PRINCE-Scanner/manifest.json"
      ]
    },
    {
      "id": "extension_captions",
      "surface": "chrome",
      "channel": "all",
      "title": "Captions and translates a tab's audio when you start it",
      "when": "Only after you start Lingua's live captions or a clip-and-transcribe on a tab.",
      "sends": "The tab's sound goes to PRINCE's Lingua service to be turned into text and, if you asked, translated.",
      "keeps": "Nothing.",
      "cannot": [
        "It never records a tab you did not start it on.",
        "It stops when you stop it or close the tab."
      ],
      "primitives": [
        "PERCEIVE"
      ],
      "dataClasses": [
        "voice_likeness",
        "photos_video"
      ],
      "chromePermissions": [
        "tabCapture",
        "offscreen"
      ],
      "evidence": [
        "PRINCE-Scanner/offscreen.js"
      ]
    }
  ],
  "processors": [
    {
      "id": "google_cloud",
      "name": "Google Cloud (Firebase)",
      "role": "PRINCE's own servers, database, file storage, sign-in, app check, notifications and one of its voices.",
      "receives": "Everything PRINCE handles passes through here first.",
      "hosts": [
        "googleapis.com",
        "cloudfunctions.net",
        "run.app",
        "web.app",
        "firebaseapp.com",
        "gstatic.com"
      ],
      "signatures": []
    },
    {
      "id": "aws",
      "name": "Amazon Web Services",
      "role": "AI models through Amazon Bedrock (Anthropic's Claude and Amazon Nova), plus Transcribe, Rekognition, Translate, Comprehend and Polly, and short-lived storage for recordings and videos you scan.",
      "receives": "The words, pictures, recordings or videos of a scan that needs them, and the guardians' own words to be spoken aloud.",
      "hosts": [
        "amazonaws.com"
      ],
      "signatures": [
        "@aws-sdk/client-bedrock-runtime",
        "@aws-sdk/client-transcribe",
        "@aws-sdk/client-rekognition",
        "@aws-sdk/client-translate",
        "@aws-sdk/client-comprehend",
        "@aws-sdk/client-polly",
        "@aws-sdk/client-s3"
      ]
    },
    {
      "id": "mistral",
      "name": "Mistral AI",
      "role": "AI models, including reading pictures and translating.",
      "receives": "The words or pictures of a scan, and text you ask Lingua to translate.",
      "hosts": [
        "api.mistral.ai"
      ],
      "signatures": [
        "@mistralai/mistralai"
      ]
    },
    {
      "id": "together",
      "name": "Together AI",
      "role": "Open AI models, used for some features, for turning recordings you scan into text, and as a fallback when the others are unavailable.",
      "receives": "The words, pictures or recordings of a scan.",
      "hosts": [
        "api.together.xyz"
      ],
      "signatures": []
    },
    {
      "id": "azure_speech",
      "name": "Microsoft Azure Speech",
      "role": "Turns text into speech.",
      "receives": "Text PRINCE reads aloud: a guardian's words, or text you asked Lingua to speak.",
      "hosts": [
        "tts.speech.microsoft.com"
      ],
      "signatures": [
        "tts.speech.microsoft.com"
      ]
    },
    {
      "id": "elevenlabs",
      "name": "ElevenLabs",
      "role": "Turns text into speech.",
      "receives": "Text PRINCE reads aloud.",
      "hosts": [
        "api.elevenlabs.io"
      ],
      "signatures": []
    },
    {
      "id": "google_web_risk",
      "name": "Google Web Risk and Safe Browsing",
      "role": "Google's lists of dangerous websites.",
      "receives": "Web addresses from a scan.",
      "hosts": [
        "webrisk.googleapis.com",
        "safebrowsing.googleapis.com"
      ],
      "signatures": []
    },
    {
      "id": "virustotal",
      "name": "VirusTotal",
      "role": "Checks a site against many security vendors.",
      "receives": "Web addresses and site names from a scan.",
      "hosts": [
        "www.virustotal.com"
      ],
      "signatures": []
    },
    {
      "id": "urlscan",
      "name": "urlscan.io",
      "role": "Looks at a website safely from the outside.",
      "receives": "Web addresses from a scan, submitted as private scans.",
      "hosts": [
        "urlscan.io"
      ],
      "signatures": []
    },
    {
      "id": "abuse_ch",
      "name": "abuse.ch URLhaus",
      "role": "A shared list of sites that spread malware.",
      "receives": "Web addresses and site names from a scan.",
      "hosts": [
        "urlhaus-api.abuse.ch",
        "urlhaus.abuse.ch"
      ],
      "signatures": []
    },
    {
      "id": "whoisxml",
      "name": "WhoisXML API",
      "role": "Registration records that show how old a site is.",
      "receives": "Site names from a scan.",
      "hosts": [
        "www.whoisxmlapi.com"
      ],
      "signatures": []
    },
    {
      "id": "greynoise",
      "name": "GreyNoise",
      "role": "What is known about a server's internet address.",
      "receives": "Server addresses from a scan.",
      "hosts": [
        "api.greynoise.io"
      ],
      "signatures": []
    },
    {
      "id": "abuseipdb",
      "name": "AbuseIPDB",
      "role": "Reports of abuse from a server's internet address.",
      "receives": "Server addresses from a scan.",
      "hosts": [
        "api.abuseipdb.com"
      ],
      "signatures": []
    },
    {
      "id": "ipinfo",
      "name": "ipinfo.io",
      "role": "Approximate, city-level location of internet addresses.",
      "receives": "The server address of a scam site, to map where it is hosted, and your connection's address, for an approximate location on your own dashboard. The address is discarded after the lookup; only the approximate location is kept. The public map shows country only.",
      "hosts": [
        "ipinfo.io"
      ],
      "signatures": []
    },
    {
      "id": "phishtank",
      "name": "PhishTank",
      "role": "A shared list of phishing sites. Inactive: the service refuses requests without a key, and PRINCE has none.",
      "receives": "Nothing while inactive. If it were switched on: web addresses from a scan.",
      "hosts": [
        "checkurl.phishtank.com",
        "data.phishtank.com",
        "cdn.phishtank.com"
      ],
      "signatures": []
    },
    {
      "id": "brave_search",
      "name": "Brave Search",
      "role": "The web search Proto uses for research.",
      "receives": "Public claims and site names Proto is checking. Never your messages.",
      "hosts": [
        "api.search.brave.com"
      ],
      "signatures": []
    },
    {
      "id": "stripe",
      "name": "Stripe",
      "role": "Payments.",
      "receives": "Your payment details when you buy a plan, directly. PRINCE never sees your card number.",
      "hosts": [
        "api.stripe.com"
      ],
      "signatures": [
        "require('stripe')",
        "require(\"stripe\")"
      ]
    },
    {
      "id": "cloudflare_dns",
      "name": "Cloudflare 1.1.1.1",
      "role": "Looks up site names while network protection is on.",
      "receives": "The names of sites your phone looks up, over an encrypted connection. Cloudflare may keep limited resolver logs for up to 25 hours.",
      "hosts": [],
      "signatures": []
    },
    {
      "id": "prince_gateway",
      "name": "PRINCE's network-protection gateway",
      "role": "Carries your phone's traffic while network protection is on. It runs on Amazon Web Services.",
      "receives": "Encrypted traffic. It sees where connections go, never the contents of secure connections.",
      "hosts": [],
      "signatures": []
    }
  ],
  "publicSources": {
    "note": "PRINCE reads these public pages and logs. It sends them nothing about you.",
    "hosts": [
      "projectprince.ai",
      "consumer.ftc.gov",
      "consumidor.ftc.gov",
      "www.ic3.gov",
      "www.uspis.gov",
      "www.scamwatch.gov.au",
      "www.incibe.es",
      "www.gov.br",
      "www.irs.gov",
      "irs.gov",
      "www.econsumer.gov",
      "www.interpol.int",
      "www.snopes.com",
      "leadstories.com",
      "fullfact.org",
      "www.ifrc.org",
      "www.unwomen.org",
      "www.befrienders.org",
      "findahelpline.com",
      "www.youtube.com",
      "youtu.be",
      "ct.cloudflare.com",
      "wyvern.ct.digicert.com",
      "sphinx.ct.digicert.com",
      "tiger2026h2.ct.sectigo.com",
      "elephant2026h2.ct.sectigo.com",
      "ct2026-a.trustasia.com",
      "ct2026-b.trustasia.com"
    ]
  },
  "notContacted": {
    "note": "Addresses that appear in PRINCE's code as examples, tests or configuration and are never sent anything about a person.",
    "hosts": [
      "paypal-security-team.helpcenter-lock247.click",
      "preflight.local"
    ]
  },
  "commitments": [
    "PRINCE never decrypts secure (HTTPS) connections.",
    "PRINCE keeps no browsing history.",
    "PRINCE does not sell data or use it for advertising.",
    "PRINCE never acts inside your accounts or holds the passwords to them.",
    "PRINCE does not ask any AI provider for hidden reasoning, and never passes one AI's hidden reasoning to another."
  ]
}
