the Eighth Rank Write-up

Anatomy of Apple's Personal Knowledge Graph

Every Mac since macOS 13 (2022) ships a pair of daemons whose only purpose in life is to build a graph about who you are, who you know, how those people are related to you and to each other, how you communicate with them, where you go, what you do and when. In this post, we look into how this system works and give you a tool to peek into your own graph.

The position

A family fork: one knight on e2 attacks White's king, queen, rook and bishop at once. White's pieces are the household the graph is about; the knight is the store, one move from every one of them. White's own last move, 18.e3, emptied the square it stands on. White is in check and has one legal reply, Kh1; then the knight takes the queen. The check falls on the one who accepted the terms. What is lost is someone else.

3r1rk1/pp2qppp/8/3p1b2/8/1NQ1P1B1/PP2nPPP/2R2RK1 w - - 1 19

Finding

Target
Apple Intelligence / Personal Knowledge Graph
Affected
macOS 13+, Intel and Apple silicon
Class
Privacy
Personalized AI

What if I told you that every Mac since 2022 ships a pair of daemons whose only purpose in life is to build a graph about you and the people around you: who you are, who you know, how those people are related to you and to each other, how you communicate with them, where you go, with whom, what you do and when. This graph is built on device by cross-referencing pretty much everything on the machine: Contacts, Calendar, Photos, Messages, Mail, location, Screen Time and a long tail of behavioral signals. And, more importantly, it is held as a queryable store that LLMs retrieve from (allegedly). Would you believe me?

Well, that's what is happening, and interestingly enough, there is little documentation of how this whole mechanism works on your Mac. The closest thing to an official description is the man page (man 8 knowledgeconstructiond), and this is all you get:

man 8 knowledgeconstructiondmacOS 26.6.2, build 25G83
NAME
     knowledgeconstructiond – A daemon that analyzes content on the
     device to build a general purpose knowledge graph.

DESCRIPTION
   knowledgeconstructiond analyzes the content on this device to help
   build a knowledge graph representing the device and the user. It
     works together with intelligenceplatformd, performing some of the
     heavy processing tasks, to generate the knowledge graph.

Previous work: To be fair, Apple's own researchers did publish a paper on the techniques behind this graph construction, back in 2023. But there is next to nothing on how it is integrated into macOS: which versions run it, and the exact list of what is collected and inferred. And not a word about the "kinship" inference discussed below. Also, we personally ran into it while doing some security research on the Apple Intelligence bundle in macOS 26 in August 2026; but a few months before, Nic Lydon came across the same database and wrote it up in I Built a Personal Knowledge Graph. Apple Had Already Built One on My Laptop.

But we go a bit deeper.

This blog post is an account of some analysis work we carried out on what the knowledge graph actually does, so that you (the user) can get a better understanding of how this mechanism works, and some clarity on what the graph holds about you and your family and friends. Everything in it was collected on macOS 26 (26.6.2 at the time of writing).

To this end, we open-source a local dashboard (iKnow) you can use to read the content of your personal knowledge graph on your Mac.

Finally, we derail a bit and look into what we do best: weaponizing and exploiting. We run a thought experiment (one that applies to any such personalized system) and show what happens if such a knowledge base ends up in the wrong hands, and how a "privacy single point of failure" can be exploited to threaten you in ways you may not have considered before (when combined with an abliterated LLM).

What's in the personal knowledge graph?

The two daemons keep their work in ~/Library/IntelligencePlatform, a directory of SQLite databases (fifty-one databases) stored in plaintext but located in a zone protected by TCC Full Disk Access.

Likely, the most interesting is graph.db. It is a triple store written in a vocabulary of 181 entity classes and 278 predicates: every row is a subject, a predicate and an object. The subject is an entity (a person, an app, an event); the object is either a plain value (a name, a handle, a date) or another entity, which is where the graph gets its edges. The predicate is the interesting part: it says what kind of relationship the system believes holds between the two.

an edge, and the rows it is stored as
(Me) the owner of this Mac 9100000000007919 PS500 employer CS165 employment relationship type PS45 member of Halden Labs an organization 9100000000013724 STABLE_GRAPH · THE SAME EDGE, AS THE TWO ROWS IT IS subject predicate relationshipId relationshipPredicate object 9100000000007919 PS500 4412 PS1 CS165 9100000000007919 PS500 4412 PS45 9100000000013724 every row also carries confidence, sources, sourceDuplicates and timestamp

One edge of the graph (synthetic data): a person and the organization the store holds as their employer. PS500 is the id predicate.json gives employer, and its range is not an organization but a relationship type — so one edge is two rows sharing a relationshipId, one naming the kind of relationship and one pointing at the other entity. The forty-six relationship type classes in the table below exist to carry exactly that, which is what lets an edge hold a confidence of its own and be retracted later.

Most of what the two daemons do is populate those predicates, and the tables kept beside them, from everything the OS will let them read. Into the graph go Contacts; Photos (faces); Calendar (titles and attendees); Family Sharing (including the age of every member); the Medical ID emergency contact in Health; events and contacts Siri Suggestions finds in Mail and Messages; people donated by apps through App Intents; and installed apps. Beside it, in tables of their own, sit who appears with whom in your photos; the communication log (who, when, which app, which direction; no content), which also pulls from your other devices; location and movement; and a long tail of device signals (screen locked, Wi-Fi, Bluetooth, charging, ambient light, and a stream named ContextualUnderstanding.PhysicalSocial whose record format lists people by name, phone and email, each with a start and an end time; it reads like a log of who was physically around you, though we never saw it filled in).

What is inferred

The complete list of the 181 entity classes:

the 181 entity classes in class.json
ClassLabelGroupMechanism found?
SB56entitycoreimplemented
SB104personcoreimplemented
SB152placecoreimplemented
nm_topictopiccoreimplemented
SB65eventcoreimplemented
nm_documentdocumentcorecould not find mechanism
SB473homecorecould not find mechanism
SB10organizationcoreimplemented
SB2group of humanscoreimplemented
SB144softwarecoreimplemented
SB193organismcoreimplemented
SB198agentcoreimplemented
SB83conceptcoreimplemented
SB400occurrencecoreimplemented
SB60rolecoreimplemented
SB197siribase typecoreimplemented
nm_knowledgeSourceknowledge sourcecoreimplemented
SB170timecorecould not find mechanism
SB175groupcoreimplemented
SB470device primary userpersoncould not find mechanism
SB199musical artistpersoncould not find mechanism
SB14sports teampersonimplemented
SB417sports organizationpersoncould not find mechanism
SB115sports leaguepersoncould not find mechanism
SB185athletepersoncould not find mechanism
SB21person in the artspersoncould not find mechanism
SB184musicianpersoncould not find mechanism
nm_screenTimeSegmentscreen time segmentpersoncould not find mechanism
CS8sexattributemight be implemented (unverified)
CS4unit of measurementattributeimplemented
CS25type of professionattributeimplemented
CS37religionattributecould not find mechanism
SB74languageattributecould not find mechanism
SB18political partyattributecould not find mechanism
SB461genreattributeimplemented
SB537mode of transportationattributeimplemented
SB544automobile modelattributeimplemented
SB418makeattributeimplemented
SB399content ratingattributecould not find mechanism
SB48populated placeplaceimplemented
SB101stateplacemight be implemented (unverified)
SB163countryplacemight be implemented (unverified)
SB370time zoneplacemight be implemented (unverified)
SB131countyplaceimplemented
SB471calendareventcould not find mechanism
SB472calendar eventeventimplemented
SB513activity eventeventimplemented
SB71sports game eventeventcould not find mechanism
SB77holiday eventeventimplemented
SB514transportation activityactivityimplemented
SB515working activityactivityimplemented
SB516meeting activityactivityimplemented
SB517eating activityactivitymight be implemented (unverified)
SB518watching TV activityactivitymight be implemented (unverified)
SB519communicating activityactivityimplemented
SB520shopping activityactivityimplemented
SB523traveling activityactivitymight be implemented (unverified)
SB524reading activityactivityimplemented
SB525vacationing activityactivityimplemented
SB526gaming activityactivityimplemented
SB527socializing activityactivitymight be implemented (unverified)
SB528waking up activityactivitymight be implemented (unverified)
SB529going to bed activityactivitymight be implemented (unverified)
SB522sleeping activityactivityimplemented
SB530exercising activityactivityimplemented
SB521mindfulness activityactivitymight be implemented (unverified)
SB531on the phone activityactivityimplemented
SB532facetime activityactivityimplemented
SB533walking activityactivityimplemented
SB534running activityactivityimplemented
SB535bicycling activityactivityimplemented
SB536hiking activityactivitycould not find mechanism
SB722commute activityactivityimplemented
SB723dining activityactivityimplemented
SB726attending a performance activityactivityimplemented
SB732stationary activityactivityimplemented
SB764location visit activityactivityimplemented
SB784driving activityactivitycould not find mechanism
SB786behavior activityactivitycould not find mechanism
SB394sports activityactivityimplemented
SB116type of activityactivity typemight be implemented (unverified)
SB545transportation activity typeactivity typecould not find mechanism
SB546working activity typeactivity typecould not find mechanism
SB547meeting activity typeactivity typecould not find mechanism
SB548eating activity typeactivity typecould not find mechanism
SB549watching media activity typeactivity typecould not find mechanism
SB550communicating activity typeactivity typecould not find mechanism
SB551shopping activity typeactivity typecould not find mechanism
SB552mindful activity typeactivity typecould not find mechanism
SB553sleep activity typeactivity typecould not find mechanism
SB554travel activity typeactivity typecould not find mechanism
SB555reading activity typeactivity typecould not find mechanism
SB556vacation activity typeactivity typecould not find mechanism
SB557social activity typeactivity typecould not find mechanism
SB558waking activity typeactivity typecould not find mechanism
SB559going to bed activity typeactivity typecould not find mechanism
SB560phone call activity typeactivity typecould not find mechanism
SB561facetime activity typeactivity typecould not find mechanism
SB562walking activity typeactivity typecould not find mechanism
SB563running activity typeactivity typecould not find mechanism
SB564biking activity typeactivity typecould not find mechanism
SB565hiking activity typeactivity typecould not find mechanism
SB483type of physical exerciseactivity typecould not find mechanism
SB721commute activity typeactivity typecould not find mechanism
SB785driving activity typeactivity typecould not find mechanism
SB787behavior activity typeactivity typecould not find mechanism
SB425vehicletransportimplemented
SB543on foottransportcould not find mechanism
SB335automobiletransportimplemented
SB538planetransportcould not find mechanism
SB539bicycletransportcould not find mechanism
SB358shiptransportcould not find mechanism
SB541bustransportcould not find mechanism
SB542locomotive traintransportcould not find mechanism
SB51workmediaimplemented
SB405media workmediaimplemented
SB44songmediaimplemented
SB138albummediacould not find mechanism
SB85musical workmediaimplemented
SB183moviemediacould not find mechanism
SB295television programmediacould not find mechanism
SB49animalanimalcould not find mechanism
nm_petpetanimalcould not find mechanism
nm_dogdoganimalcould not find mechanism
nm_catcatanimalcould not find mechanism
nm_myPetmy petanimalcould not find mechanism
nm_myDogmy doganimalcould not find mechanism
nm_myCatmy catanimalcould not find mechanism
nm_walletOrderwallet ordercommerceimplemented
nm_walletTransactionwallet transactioncommercecould not find mechanism
nm_paymentpaymentcommerceimplemented
nm_transactiontransactioncommerceimplemented
nm_emailemailcommerceimplemented
nm_shippingInfoshippingInfocommercecould not find mechanism
nm_shipmentFullFillmentInfoshipment full fillment infocommerceimplemented
CS29location relationship typeedgeimplemented
CS97address relationship typeedgeimplemented
nm_topicRelationshipTypetopic relationship typeedgemight be implemented (unverified)
CS1relationship typeedgeimplemented
nm_senderRelationshipTypesender relationship typeedgemight be implemented (unverified)
nm_calendarRelationshipTypecalendar relationship typeedgeimplemented
nm_organizerRelationshipTypeorganizer relationship typeedgecould not find mechanism
CS105text relationship typeedgecould not find mechanism
CS101language relationship typeedgecould not find mechanism
CS22identifier relationship typeedgeimplemented
CS2image relationship typeedgemight be implemented (unverified)
CS13membership relationship typeedgeimplemented
CS165employment relationship typeedgeimplemented
CS154time zone relationship typeedgemight be implemented (unverified)
CS3quantity relationship typeedgeimplemented
CS36religion relationship typeedgecould not find mechanism
CS167interest relationship typeedgecould not find mechanism
CS38participation relationship typeedgeimplemented
nm_calendarSourceRelationshipTypecalendar source relationship typeedgeimplemented
CS168agent affiliation relationship typeedgeimplemented
nm_dateRelationshipTypedate relationship typeedgeimplemented
nm_administratorRelationshipTypeadministrator relationship typeedgecould not find mechanism
nm_visualIdentifierRelationshipTypevisual identifier relationship typeedgeimplemented
nm_songRelationshipTypesong relationship typeedgeimplemented
nm_softwareRelationshipTypesoftware relationship typeedgeimplemented
CS173event relationship typeedgecould not find mechanism
nm_localizedNameRelationshipTypelocalized name relationship typeedgeimplemented
nm_confidenceRelationshipTypeconfidence relationship typeedgeimplemented
CS31performance relationship typeedgecould not find mechanism
CS15part whole relationship typeedgecould not find mechanism
CS113rating relationship typeedgecould not find mechanism
CS166group relationship typeedgeimplemented
nm_livingBeingRelationshipliving being relationshipedgeimplemented
nm_entityAliasRelationshipTypeentity alias relationship typeedgeimplemented
nm_extractionTagRelationshipTypeextraction tag relationship typeedgeimplemented
nm_orderEmailRelationshipTypeorder email relationship typeedgeimplemented
nm_orderTransactionRelationshipTypeorder transaction relationship typeedgeimplemented
nm_orderShippingInfoRelationshipTypeorder shipping info relationship typeedgeimplemented
nm_entityOrganizationRelationshipTypeentity organization relationship typeedgeimplemented
nm_shipmentFullFillmentEmailRelationshipTypeshipment full fillment email relationship typeedgeimplemented
nm_orderShipmentFullFillmentRelationshipTypeorder shipment full fillment relationship typeedgeimplemented
nm_orderPaymentRelationshipTypeorder payment relationship typeedgeimplemented
nm_fromToEmailRelationshipTypefrom to email relationship typeedgecould not find mechanism
nm_orderPersonRelationshipTypeorder person relationship typeedgeimplemented
nm_shipmentPersonRelationshipTypeshipment person relationship typeedgeimplemented
nm_emailInfoRelationshipTypeemail info relationship typeedgecould not find mechanism

Every class the shipped ontology declares, grouped rather than left in file order: the core types, then people, attributes, places and events, then the activity block, and last the forty-six relationship types, which are not things at all — each one reifies an edge so that the edge can carry facets of its own, a confidence among them. The ids and labels are Apple's; the grouping is ours. intValue runs 1 to 185 with four numbers missing — 18, 54, 169, 181 — and nothing on the disk says what they were.

Fifty-seven of the 181 describe an activity: sleeping, exercising, mindfulness, going to bed, commute, dining, most of them with a matching type class beside them, so nearly a third of the vocabulary went on what you are doing rather than on who or where you are. That said, it is not clear that every class is actually used; some may be placeholders that are declared and never filled. In the table, we flag as implemented the classes for which we could locate a mechanism that might be responsible for the class, but those are to be taken as inference work rather than ground truth.

And this is the complete list of predicates (same disclaimer applies):

the 278 predicates in predicate.json
PredicateWhat it recordsData sourceHow it is obtainedMechanism found?
PS1what kind of thing this isevery sourceRuleimplemented
PS10genreApple world knowledgeApple-shippedimplemented
PS102this record is the same person/thing as that oneevery sourceEmbedding modelimplemented
PS106durationCalendar, SuggestionsCopiedcould not find mechanism
PS107has locationCalendar, location historyCopiedmight be implemented (unverified)
PS123part in part-whole relationshipApple world knowledgeApple-shippedcould not find mechanism
PS132has religionContactsCopiedcould not find mechanism
PS133religionApple world knowledgeApple-shippedcould not find mechanism
PS135areaApple world knowledgeApple-shippedcould not find mechanism
PS137performed byApple world knowledgeApple-shippedcould not find mechanism
PS143attendee identifierCalendar, SuggestionsCopiedmight be implemented (unverified)
PS144took part in an eventCalendar, PhotosCopiedcould not find mechanism
PS147populationApple world knowledgeApple-shippedcould not find mechanism
PS16performerApple world knowledgeApple-shippedcould not find mechanism
PS194published byApple world knowledgeApple-shippedimplemented
PS2unitApple world knowledgeApple-shippedimplemented
PS225has location relationshipCalendar, location historyCopiedimplemented
PS232has attendeeCalendar, SuggestionsCopiedimplemented
PS248starting locationCalendar, location historyCopiedimplemented
PS249end locationCalendar, location historyCopiedimplemented
PS29start timeCalendar, SuggestionsCopiedimplemented
PS296URLCalendar, apps, world knowledgeCopiedimplemented
PS3quantityApple world knowledgeApple-shippedimplemented
PS30end timeCalendar, SuggestionsCopiedimplemented
PS312first nameContactsCopiedimplemented
PS313username / handleContacts, Family SharingCopiedimplemented
PS314sportApple world knowledgeApple-shippedcould not find mechanism
PS315postal codeContacts, order emailsCopiedimplemented
PS316full street addressContacts, order emailsCopiedmight be implemented (unverified)
PS317has addressContacts, order emailsCopiedimplemented
PS324has languageContactsCopiedcould not find mechanism
PS325languages spokenContactsCopiedcould not find mechanism
PS33nameContactsCopiedimplemented
PS335text valueCalendar, apps, world knowledgeCopiedcould not find mechanism
PS336official nameApple world knowledgeApple-shippedcould not find mechanism
PS34gender identityContactsCopiedmight be implemented (unverified)
PS343demonymApple world knowledgeApple-shippedcould not find mechanism
PS35citizen ofApple world knowledgeApple-shippedcould not find mechanism
PS358has ratingApple world knowledgeApple-shippedcould not find mechanism
PS359ratingApple world knowledgeApple-shippedcould not find mechanism
PS36birth nameContactsCopiedimplemented
PS37date of birthContactsCopiedimplemented
PS374has memberContacts, Family SharingCopiedimplemented
PS392last updatedCalendar, SuggestionsCopiedimplemented
PS396external identifier, its value, its typeevery sourceJoinedimplemented
PS4widthApple world knowledgeApple-shippedmight be implemented (unverified)
PS406email addressContacts, order emailsCopiedimplemented
PS407phone numberContacts, order emailsCopiedimplemented
PS424member of political partyApple world knowledgeApple-shippedcould not find mechanism
PS441family nameContactsCopiedimplemented
PS447has timezoneCalendar, location historyCopiedcould not find mechanism
PS448time zoneCalendar, location historyCopiedmight be implemented (unverified)
PS45member ofContacts, Family SharingCopiedimplemented
PS450address countryContacts, order emailsCopiedmight be implemented (unverified)
PS453cityContacts, order emailsCopiedmight be implemented (unverified)
PS454country code ISO 3166-1 alpha-2Contacts, order emailsCopiedmight be implemented (unverified)
PS455administrative districtContacts, order emailsCopiedmight be implemented (unverified)
PS46group member identifierFamily SharingJoinedcould not find mechanism
PS484official languageApple world knowledgeApple-shippedcould not find mechanism
PS486display imagePhotos, ContactsCopiedcould not find mechanism
PS5heightApple world knowledgeApple-shippedmight be implemented (unverified)
PS500employerContactsCopiedimplemented
PS51descriptionCalendar, apps, world knowledgeCopiedimplemented
PS515location within locationApple world knowledgeApple-shippedcould not find mechanism
PS520has contact informationContacts, order emailsCopiedimplemented
PS524native homeApple world knowledgeApple-shippedcould not find mechanism
PS53part ofApple world knowledgeApple-shippedcould not find mechanism
PS545name prefixContactsCopiedimplemented
PS546middle nameContactsCopiedimplemented
PS547name suffixContactsCopiedimplemented
PS548departmentContactsCopiedimplemented
PS557topics a person is interested inPersonalization PortraitScored modelcould not find mechanism
PS558topics a person is interested inPersonalization PortraitScored modelcould not find mechanism
PS565abbreviationApple world knowledgeApple-shippedcould not find mechanism
PS566group has partApple world knowledgeApple-shippedcould not find mechanism
PS567seconds from GMTCalendar, location historyCopiedcould not find mechanism
PS568sub administrative areaContacts, order emailsCopiedimplemented
PS569sub localityContacts, order emailsCopiedimplemented
PS570sub thoroughfareContacts, order emailsCopiedimplemented
PS571latitudeCalendar, location historyCopiedimplemented
PS572longitudeCalendar, location historyCopiedimplemented
PS573has latitude/longitudeCalendar, location historyCopiedimplemented
PS574previous family nameContactsCopiedimplemented
PS578has organizerCalendar, SuggestionsCopiedimplemented
PS579on calendarCalendar, SuggestionsCopiedcould not find mechanism
PS580calendar event senderCalendar, SuggestionsCopiedimplemented
PS581second address lineContacts, order emailsCopiedimplemented
PS582who administers the homeHomeKitCopiedcould not find mechanism
PS586status—Not establishedimplemented
PS598a person is related to / associated with anotherContacts, Health, Family Sharing, Screen Time, PhotosXGBoost + rules + copiedimplemented
PS599a person is related to / associated with anotherContacts, Health, Family Sharing, Screen Time, PhotosXGBoost + rules + copiedcould not find mechanism
PS618has subeventCalendar, SuggestionsCopiedcould not find mechanism
PS66source URLCalendar, apps, world knowledgeCopiedimplemented
PS67date of deathApple world knowledgeApple-shippedcould not find mechanism
PS69external identifier, its value, its typeevery sourceJoinedimplemented
PS7image filePhotos, ContactsCopiedmight be implemented (unverified)
PS709has driverCarPlay, WalletCopiedcould not find mechanism
PS710transportation typeApple world knowledgeApple-shippedcould not find mechanism
PS711elevation gainApple world knowledgeApple-shippedcould not find mechanism
PS712terrainApple world knowledgeApple-shippedimplemented
PS713fuel consumedApple world knowledgeApple-shippedcould not find mechanism
PS714highway mileageApple world knowledgeApple-shippedcould not find mechanism
PS715city mileageApple world knowledgeApple-shippedcould not find mechanism
PS716make of automobileCarPlay, WalletCopiedcould not find mechanism
PS717model of automobileCarPlay, WalletCopiedcould not find mechanism
PS718two events happened togetherPhotos, CalendarRulecould not find mechanism
PS719kind of activityHealth, motion sensorsRulecould not find mechanism
PS72external identifier, its value, its typeevery sourceJoinedimplemented
PS73occupationContacts, Apple world knowledgeCopiedimplemented
PS730sub premisesContacts, order emailsCopiedmight be implemented (unverified)
PS731administrative area codeContacts, order emailsCopiedmight be implemented (unverified)
PS733label the user gave a place or thingCalendar, SuggestionsCopiedmight be implemented (unverified)
PS734participant obligationCalendar, SuggestionsCopiedcould not find mechanism
PS740contact labelContactsCopiedimplemented
PS741has eventCalendar, SuggestionsCopiedcould not find mechanism
PS747behavior categoryBehavioral historyRulecould not find mechanism
PS75has mother—Not establishedcould not find mechanism
PS753group includes individualFamily SharingCopiedimplemented
PS76has father—Not establishedcould not find mechanism
PS77spouse—Not establishedcould not find mechanism
PS78has imagePhotos, ContactsCopiedcould not find mechanism
PS79has child—Not establishedcould not find mechanism
PS83lengthApple world knowledgeApple-shippedcould not find mechanism
PS85role heldApple world knowledgeApple-shippedcould not find mechanism
PS89another name the same person is known byContacts, PhotosEmbedding modelimplemented
PS99net worthApple world knowledgeApple-shippedcould not find mechanism
nm_QIDWikidata idApple world knowledgeApple-shippedimplemented
nm_UMC_IDUMC IDApple MusicCopiedimplemented
nm_accountInstitutionaccount institutionWallet, order emailsCopiedimplemented
nm_accountLastFourDigitsaccount last four digitsWallet, order emailsCopiedimplemented
nm_accountTypeaccount typeWallet, order emailsCopiedimplemented
nm_accuracyaccuracyLocation historyCopiedcould not find mechanism
nm_activityCategoryevent type pulled out of textMail, Messages, app contentRulecould not find mechanism
nm_addressStringaddress stringCalendar, SuggestionsCopiedimplemented
nm_ageageFamily SharingCopiedimplemented
nm_albumIdentifieralbum identifierApple MusicCopiedimplemented
nm_albumNamesong album nameApple Music, app usageCopiedimplemented
nm_amountamountWallet, order emailsCopiedimplemented
nm_anniversaryanniversaryContactsCopiedimplemented
nm_applicationIdentifierapplication identifierInstalled appsCopiedimplemented
nm_artistIdentifierartist identifierApple MusicCopiedimplemented
nm_artistNamesong artist nameApple Music, app usageCopiedimplemented
nm_associationReasonwhich mechanism named this facePhotos facesRuleimplemented
nm_availabilityavailabilityCalendar, SuggestionsCopiedcould not find mechanism
nm_birthdayContactIDbirthday contact idContactsJoinedcould not find mechanism
nm_bundleIDbundle idInstalled appsCopiedimplemented
nm_calendarTypecalendar typeCalendar, SuggestionsCopiedcould not find mechanism
nm_carrierNamecarrier nameWallet passes, CalendarCopiedimplemented
nm_categorytopic scored from what you read and writePersonalization PortraitScored modelcould not find mechanism
nm_cnFavoriteActionTypecontact favorite action typeContactsCopiedimplemented
nm_confidencehow sure the system iswhichever engine wrote the factRuleimplemented
nm_confirmationConfidencehow sure a name match isContacts, PhotosEmbedding modelimplemented
nm_creationDatecreation dateCalendar, SuggestionsCopiedimplemented
nm_datesdatesCalendar, SuggestionsCopiedimplemented
nm_documentIDdocument ID—Not establishedcould not find mechanism
nm_dynamicCategorytopic scored from what you read and writePersonalization PortraitScored modelcould not find mechanism
nm_emailFromemail fromOrder emailsCopiedimplemented
nm_emailIdentifieremail identifierOrder emailsJoinedimplemented
nm_emailReplyToemail reply toOrder emailsCopiedimplemented
nm_emailToemail toOrder emailsCopiedcould not find mechanism
nm_emailTypeemail typeOrder emailsCopiedimplemented
nm_entityAliasRelationshiplink joining two names for one personContacts, PhotosEmbedding modelimplemented
nm_exactVersionexact versionInstalled appsCopiedcould not find mechanism
nm_extensionHostIdextension host idInstalled appsCopiedcould not find mechanism
nm_familyMemberTypefamily member typeFamily SharingCopiedimplemented
nm_filefileInstalled appsCopiedcould not find mechanism
nm_flightNumberflight numberWallet passes, CalendarCopiedimplemented
nm_handleIdentifierhandle identifierMessages, MailJoinedimplemented
nm_handlesthe phone numbers and emails a person usesContactsCopiedmight be implemented (unverified)
nm_hasAdministratorhas administratorHomeKitCopiedcould not find mechanism
nm_hasCalendarhas calendarCalendar, SuggestionsCopiedcould not find mechanism
nm_hasConfidenceper-source trust weightDownloadable Apple assetApple-shippedimplemented
nm_hasDatehas dateCalendar, SuggestionsCopiedimplemented
nm_hasDomainwhich classes a predicate applies toThe ontology itselfApple-shippedcould not find mechanism
nm_hasEmailhas emailOrder emailsCopiedimplemented
nm_hasExtractionTagshas extraction tagsIngest laneRulecould not find mechanism
nm_hasFavoriteSportsTeamhas favorite sports teamApp usage, Apple MusicCopiedcould not find mechanism
nm_hasFieldhas field—Not establishedimplemented
nm_hasLocalizedNamehas localized nameApple world knowledgeApple-shippedimplemented
nm_hasMerchanthas merchantWallet, order emailsCopiedimplemented
nm_hasPaymenthas paymentWallet, order emailsCopiedimplemented
nm_hasPersonhas personOrder emailsCopiedimplemented
nm_hasProfileImagehas profile imageContactsCopiedimplemented
nm_hasRangewhich classes a predicate applies toThe ontology itselfApple-shippedimplemented
nm_hasSenderhas senderOrder emailsCopiedmight be implemented (unverified)
nm_hasShipmentFullFillmenthas shipment full fillmentWallet, order emailsCopiedimplemented
nm_hasShippingInfohas shipping infoWallet, order emailsCopiedcould not find mechanism
nm_hasSoftwarehas softwareInstalled appsCopiedimplemented
nm_hasSonghas songApple Music, app usageCopiedimplemented
nm_hasSourcehas sourceCalendar, SuggestionsCopiedcould not find mechanism
nm_hasTopictopic scored from what you read and writePersonalization PortraitScored modelmight be implemented (unverified)
nm_hasTransactionhas transactionWallet, order emailsCopiedimplemented
nm_hasVisualIdentifierthe face cluster for a personPhotos facesFace clusteringimplemented
nm_homeTeamhome teamApple Music, app usageCopiedcould not find mechanism
nm_iataCodeiata codeWallet passes, CalendarCopiedimplemented
nm_image_bytesimage bytesPhotos, ContactsCopiedimplemented
nm_imputedAnniversaryimputed anniversaryContacts, behaviorUnknown modelimplemented
nm_imputedBirthdaybirthday filled in rather than told — and the one the system actually readsPhotos age estimate (candidate)Unknown modelimplemented
nm_imputedCreationDatetimestamp filled in or normalizedCalendar, SuggestionsRuleimplemented
nm_imputedEndTimetimestamp filled in or normalizedCalendar, SuggestionsRuleimplemented
nm_imputedInferredBirthdaybirthday filled in rather than told — and the one the system actually readsPhotos age estimate (candidate)Unknown modelimplemented
nm_imputedLastUpdatedtimestamp filled in or normalizedCalendar, SuggestionsRuleimplemented
nm_imputedNonGregorianBirthdayimputed non-gregorian birthdayContacts, behaviorUnknown modelimplemented
nm_imputedOccurrenceDatetimestamp filled in or normalizedCalendar, SuggestionsRuleimplemented
nm_imputedStartTimetimestamp filled in or normalizedCalendar, SuggestionsRuleimplemented
nm_inferenceFeedbackIDhandle marking a machine-made claimThe kinship classifierXGBoostimplemented
nm_inferredBirthdaybirthday filled in rather than told — and the one the system actually readsPhotos age estimate (candidate)Unknown modelimplemented
nm_inferredDeviceUserowner worked out rather than declaredBehavioral historyUnknown modelimplemented
nm_inferredSemanticLabelwhat a place is for, e.g. home, gymLocation historyUnknown modelimplemented
nm_intentPersonIdperson as an app referred to themApp donationsJoinedimplemented
nm_isAllDayis all dayCalendar, SuggestionsCopiedimplemented
nm_isCurrentUserthis person is the phone's ownerContacts me-cardRuleimplemented
nm_isDetachedis detachedCalendar, SuggestionsCopiedcould not find mechanism
nm_isFavoriteis favoriteContactsCopiedimplemented
nm_isStartingis startingCalendar, SuggestionsCopiedcould not find mechanism
nm_isSubscribedsubscribed statusCalendar, SuggestionsCopiedcould not find mechanism
nm_launchReasonlaunch reasonApp usage, Screen TimeCopiedcould not find mechanism
nm_launchTypelaunch typeApp usage, Screen TimeCopiedcould not find mechanism
nm_league_nameleague nameApple Music, app usageCopiedimplemented
nm_listening_confidenceper-language competence on a relationship—Not establishedmight be implemented (unverified)
nm_localeIdentifierlocale identifierSystem settingsCopiedimplemented
nm_mappedTopictopic scored from what you read and writePersonalization PortraitScored modelcould not find mechanism
nm_merchantNamemerchant nameWallet, order emailsCopiedimplemented
nm_naturalLanguageEventTypeIdentifierevent type pulled out of textMail, Messages, app contentRulecould not find mechanism
nm_nonGregorianBirthdaynon-gregorian birthdayContactsCopiedimplemented
nm_occurrenceDateoccurrence dateCalendar, SuggestionsCopiedimplemented
nm_orderContentTypeorder content typeWallet, order emailsCopiedimplemented
nm_orderNumberorder numberWallet, order emailsCopiedimplemented
nm_organizationIdentifierorganization identifierContacts, WalletJoinedimplemented
nm_parentBundleIdparent bundle idInstalled appsCopiedcould not find mechanism
nm_paymentIdentifierpayment identifierWalletJoinedimplemented
nm_paymentMethodIsApplePaypayment method is apple payWallet, order emailsCopiedimplemented
nm_personIdentifierwho a relationship points atthe other end of a relationshipJoinedimplemented
nm_personTypewhat kind of thing Photos detectedPhotosRuleimplemented
nm_phoneticFamilyNamephonetic family nameContactsCopiedimplemented
nm_phoneticFirstNamephonetic first nameContactsCopiedimplemented
nm_phoneticMiddleNamephonetic middle nameContactsCopiedimplemented
nm_phoneticNamephonetic nameContactsCopiedimplemented
nm_photosDetectionTypewhat kind of thing Photos detectedPhotosRuleimplemented
nm_poiTypekind of placeMaps, location historyCopiedcould not find mechanism
nm_reading_confidenceper-language competence on a relationship—Not establishedmight be implemented (unverified)
nm_relationshipa person is related to / associated with anotherContacts, Health, Family Sharing, Screen Time, PhotosXGBoost + rules + copiedimplemented
nm_relationshipLabelthe relationship word, e.g. sister, coworkerContacts, Health, Family SharingXGBoost + copiedimplemented
nm_rolerole—Not establishedcould not find mechanism
nm_screenTimeSegmentPersonscreen time segment personScreen TimeCopiedcould not find mechanism
nm_senderDomainsender domainOrder emailsCopiedimplemented
nm_senderIdentifiersender identifierMessages, MailJoinedmight be implemented (unverified)
nm_sgEventTypeevent type worked out from an app or emailSuggestionsRuleimplemented
nm_shipmentFullFillmentIdentifiershipment full fillment identifierWalletJoinedimplemented
nm_shippingMethodshipping methodWallet, order emailsCopiedimplemented
nm_shippingStatusshipping statusWallet, order emailsCopiedimplemented
nm_shortVersionshort versionInstalled appsCopiedcould not find mechanism
nm_signalLabelsignal labelPhotosRuleimplemented
nm_softwareIdentifiersoftware identifierInstalled appsJoinedmight be implemented (unverified)
nm_songIdentifiersong identifierApple MusicCopiedcould not find mechanism
nm_sourceTypesource typeIngest laneRuleimplemented
nm_subjectsubjectOrder emailsCopiedimplemented
nm_suggestedNamename guessed for an unnamed facePhotos faces + Messages textLocal LLMimplemented
nm_suggestedRelationshipConfidenceguessed relationship of a face to the phone's ownerPhotos faces + Messages textLocal LLMimplemented
nm_suggestedRelationshipToDeviceOwnerguessed relationship of a face to the phone's ownerPhotos faces + Messages textLocal LLMimplemented
nm_teamIdentifierteam identifierInstalled appsJoinedimplemented
nm_toDisplayNamedisplay name on an email recipientEmailCopiedimplemented
nm_toEmailAddressto email addressEmailCopiedimplemented
nm_topicIdentifiertopic identifierPersonalization PortraitJoinedmight be implemented (unverified)
nm_totalAmounttotal amountWallet, order emailsCopiedimplemented
nm_totalNotificationstotal notificationsApp usage, Screen TimeCopiedcould not find mechanism
nm_totalPickupstotal pickupsApp usage, Screen TimeCopiedcould not find mechanism
nm_trackingNumbertracking numberWallet, order emailsCopiedimplemented
nm_transactionIdentifiertransaction identifierWalletJoinedimplemented
nm_transactionSourcetransaction sourceWallet, order emailsCopiedimplemented
nm_transactionStatustransaction statusWallet, order emailsCopiedimplemented
nm_transactionTypetransaction typeWallet, order emailsCopiedimplemented
nm_uncertaintyuncertaintyLocation historyCopiedcould not find mechanism
nm_unknownHandleunknown handleMessages, MailJoinedimplemented
nm_unlocalizedRelationshipLabelthe relationship word, e.g. sister, coworkerContacts, Health, Family SharingXGBoost + copiedimplemented
nm_virtualConferenceURLvirtual conference URLCalendar, SuggestionsCopiedimplemented
nm_visualIdentifierthe face cluster for a personPhotos facesFace clusteringimplemented
nm_writing_confidenceper-language competence on a relationship—Not establishedmight be implemented (unverified)

Every predicate the shipped ontology declares. The first column is the id as graph.db stores it; the last says how a value gets there: copied from a source, joined from another record, derived by a rule, shipped by Apple as world knowledge, or produced by a model (in bold). Seven we could not establish, and the table says so rather than guessing. The ids and labels are Apple's; the plain-language readings are ours.

How it is inferred

The methods run the whole range. Most of the vocabulary is filled by plain copying (a name from Contacts, an attendee from Calendar) and rules over the copies; the interesting rows come from models: a pair of XGBoost classifiers decides who is family from 144 mostly behavioral features, two embedding models are one of ten signals the system uses to decide when two records are the same person, twelve analyzers in Photos score partner, parent, child, coworker and friend from who appears in your pictures with you, on which trips and holidays, and Apple's on-device LLM reads your messages to put a name and a relationship on a face (if Apple Intelligence is active).

Whatever the method, every row lands in the graph with a confidence attached, a number between 0 and 1.

The family scores live apart. Two CoreML models ship next to the ontology, EntityTagging_Family.mlmodelc and EntityTagging_FamilyAndFriends.mlmodelc: binary XGBoost classifiers that take 144 features and return a class and a probability over it. Their scores do not go into the triple store but into a table of their own (entityTagging.db, one row per person, seventeen relationship columns from family to mother to coworker, recomputed every day), which is what the iKnow scorecard further down reads. Only two of those seventeen columns have a shipped model behind them; what fills the other fifteen, and how any of these probabilities would become a confidence in the graph, we could not trace.

The feature names are in each model's metadata.json, in plain text. They are the clearest statement of what this system is that I have found anywhere. All 144:

the 144 features in metadata.json
#FeatureGroup
0isVIPidentity
1sharesWorkAddressidentity
2hasSamePrivateEmailDomainidentity
3hasBirthdayidentity
4hasSameEmailDomainsidentity
5sameLastNameidentity
6hasSamePublicEmailDomainidentity
7photosPersonAgeidentity
8isFavoriteidentity
9hasSameEduEmailDomainidentity
10hasSameWorkEmailDomainidentity
11hasNicknameidentity
12allowListedNameMatchidentity
13ageDifferenceCategoryidentity
14nameContainsEmojiidentity
15nicknameContainsEmojiidentity
16sharesHomeAddressidentity
17allowListedNicknameMatchidentity
18photosAgeDifferenceCategoryidentity
19iCloudFamilyMemberidentity
20personOverallPopularitycommunication
21personLongTermPopularitycommunication
22personPopularityGivenMondaycommunication
23personPopularityGivenTuesdaycommunication
24personPopularityGivenWednesdaycommunication
25personPopularityGivenThursdaycommunication
26personPopularityGivenFridaycommunication
27personPopularityGivenSaturdaycommunication
28personPopularityGivenSundaycommunication
29mondayPopularityGivenPersoncommunication
30tuesdayPopularityGivenPersoncommunication
31wednesdayPopularityGivenPersoncommunication
32thursdayPopularityGivenPersoncommunication
33fridayPopularityGivenPersoncommunication
34saturdayPopularityGivenPersoncommunication
35sundayPopularityGivenPersoncommunication
36personPosteriorProbabilityGivenMondaycommunication
37personPosteriorProbabilityGivenTuesdaycommunication
38personPosteriorProbabilityGivenWednesdaycommunication
39personPosteriorProbabilityGivenThursdaycommunication
40personPosteriorProbabilityGivenFridaycommunication
41personPosteriorProbabilityGivenSaturdaycommunication
42personPosteriorProbabilityGivenSundaycommunication
43personPopularityGivenMorningcommunication
44personPopularityGivenAfternooncommunication
45personPopularityGivenEveningcommunication
46personPopularityGivenNightcommunication
47personPopularityGivenHomecommunication
48personPopularityGivenWorkcommunication
49homePopularityGivenPersoncommunication
50workPopularityGivenPersoncommunication
51personPosteriorProbabilityGivenHomecommunication
52personPosteriorProbabilityGivenWorkcommunication
53personPopularityGivenWeekdaycommunication
54personPopularityGivenWeekendcommunication
55weekdayPopularityGivenPersoncommunication
56weekendPopularityGivenPersoncommunication
57top1PersonInteractionMechanismcommunication
58top2PersonInteractionMechanismcommunication
59top3PersonInteractionMechanismcommunication
60photosPersonOverallPopularityphotos
61photosPersonLongTermPopularityphotos
62photosPersonPopularityGivenMondayphotos
63mondayPopularityGivenPhotosPersonphotos
64photosPersonPosteriorProbabilityGivenMondayphotos
65photosPersonPopularityGivenTuesdayphotos
66tuesdayPopularityGivenPhotosPersonphotos
67photosPersonPosteriorProbabilityGivenTuesdayphotos
68photosPersonPopularityGivenWednesdayphotos
69wednesdayPopularityGivenPhotosPersonphotos
70photosPersonPosteriorProbabilityGivenWednesdayphotos
71photosPersonPopularityGivenThursdayphotos
72thursdayPopularityGivenPhotosPersonphotos
73photosPersonPosteriorProbabilityGivenThursdayphotos
74photosPersonPopularityGivenFridayphotos
75fridayPopularityGivenPhotosPersonphotos
76photosPersonPosteriorProbabilityGivenFridayphotos
77photosPersonPopularityGivenSaturdayphotos
78saturdayPopularityGivenPhotosPersonphotos
79photosPersonPosteriorProbabilityGivenSaturdayphotos
80photosPersonPopularityGivenSundayphotos
81sundayPopularityGivenPhotosPersonphotos
82photosPersonPosteriorProbabilityGivenSundayphotos
83photosPersonPopularityGivenMorningphotos
84morningPopularityGivenPhotosPersonphotos
85photosPersonPosteriorProbabilityGivenMorningphotos
86photosPersonPopularityGivenAfternoonphotos
87afternoonPopularityGivenPhotosPersonphotos
88photosPersonPosteriorProbabilityGivenAfternoonphotos
89photosPersonPopularityGivenEveningphotos
90eveningPopularityGivenPhotosPersonphotos
91photosPersonPosteriorProbabilityGivenEveningphotos
92photosPersonPopularityGivenNightphotos
93nightPopularityGivenPhotosPersonphotos
94photosPersonPosteriorProbabilityGivenNightphotos
95photosPersonPosteriorProbabilityGivenMondayMorningphotos
96photosPersonPosteriorProbabilityGivenMondayAfternoonphotos
97photosPersonPosteriorProbabilityGivenMondayEveningphotos
98photosPersonPosteriorProbabilityGivenMondayNightphotos
99photosPersonPosteriorProbabilityGivenTuesdayMorningphotos
100photosPersonPosteriorProbabilityGivenTuesdayAfternoonphotos
101photosPersonPosteriorProbabilityGivenTuesdayEveningphotos
102photosPersonPosteriorProbabilityGivenTuesdayNightphotos
103photosPersonPosteriorProbabilityGivenWednesdayMorningphotos
104photosPersonPosteriorProbabilityGivenWednesdayAfternoonphotos
105photosPersonPosteriorProbabilityGivenWednesdayEveningphotos
106photosPersonPosteriorProbabilityGivenWednesdayNightphotos
107photosPersonPosteriorProbabilityGivenThursdayMorningphotos
108photosPersonPosteriorProbabilityGivenThursdayAfternoonphotos
109photosPersonPosteriorProbabilityGivenThursdayEveningphotos
110photosPersonPosteriorProbabilityGivenThursdayNightphotos
111photosPersonPosteriorProbabilityGivenFridayMorningphotos
112photosPersonPosteriorProbabilityGivenFridayAfternoonphotos
113photosPersonPosteriorProbabilityGivenFridayEveningphotos
114photosPersonPosteriorProbabilityGivenFridayNightphotos
115photosPersonPosteriorProbabilityGivenSaturdayMorningphotos
116photosPersonPosteriorProbabilityGivenSaturdayAfternoonphotos
117photosPersonPosteriorProbabilityGivenSaturdayEveningphotos
118photosPersonPosteriorProbabilityGivenSaturdayNightphotos
119photosPersonPosteriorProbabilityGivenSundayMorningphotos
120photosPersonPosteriorProbabilityGivenSundayAfternoonphotos
121photosPersonPosteriorProbabilityGivenSundayEveningphotos
122photosPersonPosteriorProbabilityGivenSundayNightphotos
123photosPersonPopularityGivenHomephotos
124homePopularityGivenPhotosPersonphotos
125photosPersonPosteriorProbabilityGivenHomephotos
126photosPersonPopularityGivenWorkphotos
127workPopularityGivenPhotosPersonphotos
128photosPersonPosteriorProbabilityGivenWorkphotos
129photosPersonPopularityGivenWeekdayphotos
130weekdayPopularityGivenPhotosPersonphotos
131photosPersonPosteriorProbabilityGivenWeekdayphotos
132photosPersonPopularityGivenWeekendphotos
133weekendPopularityGivenPhotosPersonphotos
134photosPersonPosteriorProbabilityGivenWeekendphotos
135photosPersonPosteriorProbabilityGivenWeekdayMorningphotos
136photosPersonPosteriorProbabilityGivenWeekdayAfternoonphotos
137photosPersonPosteriorProbabilityGivenWeekdayEveningphotos
138photosPersonPosteriorProbabilityGivenWeekdayNightphotos
139photosPersonPosteriorProbabilityGivenWeekendMorningphotos
140photosPersonPosteriorProbabilityGivenWeekendAfternoonphotos
141photosPersonPosteriorProbabilityGivenWeekendEveningphotos
142photosPersonPosteriorProbabilityGivenWeekendNightphotos
143hasWeekendWeekdayPhotosFeaturesphotos

Every input EntityTagging_Family.mlmodelc reads, in the order its metadata.json declares them. EntityTagging_FamilyAndFriends reads the same 144 in the same order, and every one is a number. The groups are the schema's own three blocks: twenty on who the person is, forty on when and how you communicate with them, eighty-four on the photographs you both appear in. Two of the twenty, photosPersonAge and photosAgeDifferenceCategory, are read from Photos too. The names are Apple's; the group labels are ours.

The identity group is the tidy story: same surname, same home address, an iCloud Family flag — and it is the small half. The bulk of the model is the other two: who you message and who appears in your photographs, conditioned on the day of the week and the time of day, and then on both at once. photosPersonPosteriorProbabilityGivenSaturdayNight is a shipped feature name in a shipped classifier whose job is deciding whether someone is family.

Deleting something does not delete it everywhere.

The live graph forgets. Delete a contact and nothing re-derives them; the next run replaces the table wholesale.

But the store keeps a second table, expired_stable_graph, beside the live one. The retracted row moves there and keeps its confidence and its sources. How long it stays there is not clear from what we could see. It seems to go after about 48 hours (the store keeps a prune watermark, and a recent snapshot of the table reached back no further than that); but on my own Mac, I could still read very old records in it.

And a conclusion can outlive the evidence for it. On my Mac, the scorecard still scored two people the graph had dropped the day before, both of them known to it only from a calendar invitation. Well, if you want your partner not to discover some contacts you might have deleted and their "closeness" to you, better to drop some rows from expired_stable_graph too (unfortunately, you have to do it manually). But I am sure you have nothing to hide (just joking).

Look into your own data

Is any of this sensitive? We'll leave that to you, since "sensitive" means different things to different people (though I think you have plenty to choose from here). However, the thing is, none of it lives in isolation. It is built to be joined and correlated; the nodes are there to be linked:

a personal knowledge graph (synthetic data)
me · the owner of this Mac · 1a group the store holds as an entity · 1family, as scored · 7scored close to me · 9employer · 4group chat · 6known, not scored close · 61membership of a group chata calendar event both attendedan employment statementnamed by the stored groupa closeness score above the cut · nobody typed it

How to read this

Every node is a row in the store, and the record under it is what the store holds. Size is how many rows name it; shape is what kind of thing it is; the one node in accent is you, and a ring marks the four the store scores as family. A dashed line is a conclusion nobody typed.

Click a node — or reach the graph with Tab, walk it with the arrow keys and press Enter — and its record replaces these notes.

Click a node and the record under the graph is what the store holds on it (the rows, not a summary of them). The sixty-one faint ones are the part nobody expects: people the store knows and has not placed, in it because they wrote to you once, or because they were on somebody else's invitation.

The most important point, though, is that this is not only about you (the person using the Mac). The people around you are in it too: your family, your friends, "anyone" you have talked to through your device. None of them was asked, and the store links them to you and, through the events and groups they share, to each other. A relationship is intelligence one level above the rows it was inferred from. For instance, by correlating across my own store, I (well, an LLM working for me) could easily work out the following:

  • That there is a child in the household, and roughly how old. The family-member types and a family circle give the household. The scorecard's child and son/daughter columns give the child's place in it. Beside it sits an age, copied from Family Sharing; and dates of birth in the store can carry the system's own word imputed, though what the system means by it is not clear to us.
  • Which daycare the child goes to, and both of the numbers that reach it. Copied off contact cards. Note what is not there: the calendar has no school-run event, so the store holds the institution and its lines but not the hour the child is dropped off. That is still enough to call a parent from a number their phone already trusts.
  • Where the family will be, on which days, between which hours. One calendar event, a place, two stored time slots and a title that names the family (so the guest list is in the string even where the attendee rows are empty).
  • Which of the family will be there. The scorecard names the ones scored as family, a household entity holds them together, and a Family Sharing circle says which of them are in the same family group.
  • And, in the same file, what is installed on the machine, down to the password manager.

It is easy to see how this could be weaponized if this single point of failure for your privacy ends up in the wrong hands. We play that (hypothetical) scenario out in a second write-up. The good thing is that this knowledge is meant to stay local on your machine, protected by the Full Disk Access permission; although it can be consumed by other services (but it is not entirely clear to us how and what can be accessed).

The reality is that the amount of information in this store is really something else: every time we dig into what the daemons infer, and how, a few new lines of investigation open up. Whatever you would rather no one knew about you or your family may well be in there somewhere, and we think you have the right to know whether it is. What you get instead: no documentation, no way to inspect the store and no general way to correct an inference that is wrong.

So we give you two tools. The first is iKnow, a local dashboard for browsing your own graph without anything leaving your Mac (the next section walks through it). The second is for going deeper. The iKnow repository ships a manual for your own agent that tells it where the databases are and how to read them, so it can go looking for whatever you are after. (Please point a self-hosted model at it, not a cloud one.)

iKnow

We designed iKnow as a web dashboard implemented in the Python standard library; no npm and no CDN.

It is meant to be run directly on your Mac, where the databases are stored. When executed, it binds 127.0.0.1, locates the databases in your file system (granted the necessary permissions), opens them read-only, collects the info on the fly and represents it on a dashboard. Nothing is written and nothing is logged; values go from the stores, over loopback, into a browser tab; it can be run air-gapped if you want.

We have tested it on macOS 26.6.2 and 26.7.1, and, only partially, on 27.0.1.

iKnow has a dozen pages.

Start here

What your Mac knows. The landing page: the graph of people around you. Below it come the faces in your photos, your family, your handles, your correspondents and where you will be next.

Its graph is the same household as the one at the top of this post, this time drawn by the tool's own renderer:

the landing page
A dark dashboard showing a force-directed graph of about seventy-eight labeled nodes around one white node marked "(Me)", with a color key reading "you", "a group the store holds as an entity", "family, as scored", "scored close to you", "employer", "group chat" and "known, not scored close".

The first screen. The white node marked (Me) is the owner of the Mac; the rest are the people, employers and group chats the store links to it, colored by what it says each one is. Orange is family, as scored. Blue is a closeness score above the cut. The faded names around the edges are people the store knows and has not placed.

Nothing here is summarized that is not in the record: every node is a row, and clicking one shows you the row (which is what the graph at the top of this post does too).

The graph is the overview, and an overview is easy to shrug at. The pages behind it are not.

Social graph. Who the store links to whom through shared meetings, group chats and a closeness score. Each circle opens to its members and to the evidence behind it.

What it concluded

Kinship scorecard. The family bindings inferred by the daemon.

Its card on the landing page is cut down to the people it names:

Family, as the scorecard has it
A dashboard card headed "Family, as the scorecard has it", subtitled "61 people scored on 17 relationship columns. Nobody typed any of it", listing six people with one label and one score each: Mara Quill, mother, 0.960; Tomas Quill, father, 0.960; Maya Smith, daughter, 0.960; Nils Quill, brother, 0.500; Leo Smith, son, 0.500; Ines Quill, sister, 0.500. A section headed "The household, by how many signals agree" scores Mara Quill 8 of 9, Tomas Quill and Priya Sandoval 7 of 9 and Maya Smith 6 of 9, and a last one names the Quill household, 4 members, at confidence 0.880.

Six people, six relationships, and a subtitle saying nobody typed any of it. That holds for the scores; some of what they are computed from, you did type (a relation on a contact card, an emergency contact, Family Sharing). A mother, a father and a daughter at 0.960, which is as high as these columns go; a brother, a son and a sister at 0.500.

Below that is the part I find hardest to argue with. Nine separate checks (the partner column, the composite score, the household group entity, the Family Sharing token, the iCloud Family flag, top twelve-month contact, a Photos face cluster, a Contacts record, a reachable handle), and the card counts how many of them land on the same person. Eight of nine on the mother; seven on the father, and seven on Priya Sandoval, the partner, who is not in the list above: iKnow lists the relationships that roll up into another column (mother and father into parent), and partner rolls up into nothing. The join found the partner anyway.

The card is a summary of one table, and iKnow draws the whole table too:

Every person, every column
A heatmap headed "Every person, every column": thirty people against seventeen relationship columns with abbreviated headers. The top seven rows are the family, each lit on its own relationship (mother, father, daughter, brother, son, sister, partner), on the column that relationship rolls up into, and on family and familyAndFriends; the partner's row is also lit on coworker. Below them a few rows are lit on friend or coworker, every row is lit on family and familyAndFriends, most of them at the same two shades, and the alumni and unknown columns are empty from top to bottom.

Sorted by familyAndFriends, the broadest of the scores. The seven at the top each light up their own relationship and the column it rolls up into (mother and father into parent, sister and brother into sibling, son and daughter into child), and the partner is also a colleague. Further down are the friends and the rest of the office. Under them, almost everyone else is the same two cells: one repeated value on family and another on familyAndFriends, which is what the classifier writes when it has nothing to say. Two columns (alumni and unknown) are never used at all.

The scores in these two shots are invented, and more generous than the real thing. On the Mac we took apart, only mother reached the top of the ladder; the few others it scored at all got one small vote on every family label at once, father and brother alike. What the fixture keeps is the table's grain: it only ever writes a handful of values (0.125, 0.25, 0.5 and 0.96), and most people sit on one default.

The face index. A face cluster for everyone in your photos.

Its co-occurrence graph does not use a single contact, message or calendar entry. It is built from your photographs alone:

The face co-occurrence graph
A dashboard card headed "The face co-occurrence graph": forty-seven circles, each filled with a blurred face, linked when two of them appear in the same photograph and labeled with six-character fragments of cluster identifiers instead of names. One cluster sits at the center, linked to nearly everything; a tight knot sits to its left, a looser group above it, and a third group at the bottom right shares no link with the knot. A control above the graph reads "photographs on the nodes — 47 of 47 drawn here have one".

Two faces are linked when they appear in the same photograph, and that is the only input: 8,904 clustered faces over the 1,643 photographs that hold more than one. The labels are fragments of each cluster's local identifier, because there are no names to show. The owner is the hub. The knot on the left is the family, the group at the bottom right is work, and the two never share a frame.

Each node wears its cluster's key face, read out of the photo library and blurred by iKnow's own switch for sharing the screen. Under the blur there is nobody: the fixture has no photo library, so every face is a synthetic portrait painted for it.

This is the page's own honest point: the graph points at the face clusters and can name almost none of them (three of the twenty-nine, in the fixture). It does not need to. Who stands next to whom, how often, and which groups never meet is all there without a single name, and whoever knows the household can put the names back on in a second.

Guessed or given. What you typed in and what the Mac worked out for itself live in the same table. A confidence score is the only thing separating them.

What it recorded

A year of contact. Who you talked to, when, and not a word of message text (and it does not need any to tell when you are asleep).

Its card on the landing page is the one that gets the reaction, and it contains no inference at all.

A year of who you talked to
A dashboard card headed "A year of who you talked to", subtitled "18,432 interactions over 365 days, 146 correspondents (97 named), 5 apps — and not one word of text", listing eight people with interaction counts, in and out splits, call counts and last-contact dates, and a final section headed "The hours it can read as sleep".

A year of contact, per person, split incoming and outgoing, with call counts and a last-seen date, across five messaging apps — and, exactly as the subtitle says, not one word of message text. None of this is content. It is all metadata, and it is enough.

The last line is the one to read twice: the hours it can read as sleep.

iKnow draws that line too, from the same log folded onto a single week:

Weekday against hour of day
Two dashboard cards. The first, headed "Weekday against hour of day — when this person is reachable, and when they are asleep", is a heatmap of seven weekday rows against twenty-four hour columns: a pale band from 01 to 07 on every day, running later into Saturday and Sunday mornings, a dark plateau through the working day on weekdays, and the darkest cells between 20 and 22. The second, headed "The hours the log goes quiet — a sleep schedule nobody wrote down", reads: "Hours carrying less than 25% of an even spread form one unbroken run of 6 hours, 01:00 to 07:00 Europe/London. 402 of 18.4K events fall inside it (2%)."

Every cell counts the messages and calls that fell in one hour of one weekday, over the year. The working week is in there, and so are the evenings and the late weekend mornings; and so is the pale band from one to seven, every night. Nobody stored a sleep schedule. The quietest six-hour stretch falls out of the timestamps for free.

That is the general shape of this store: almost nothing in it had to be collected, because almost everything in it is a consequence of something that was.

The calendar. The one layer that knows where you will be: the hour, the room, the attendees and the dial-in.

What you withdrew. Withdrawing a fact does not remove it. The row moves to an expired table and keeps its confidence and provenance.

The machinery

The store. The file itself: what it models, and two real rows expanded into everything they touch.

Device fingerprint. Every app installed on the Mac is written down in plain text, next to a token that is an unsalted SHA-256 of that same app identifier, so the page recomputes it in your browser and you can watch it match.

Who else reads it. The graph is the first copy, not the only one. This page maps the views that subscribe to it, the databases they publish into, the tables that repeat the same facts, the streams coming in from hardware paired with the Mac, and the machinery that is set up but has not run yet.

A note on macOS 27. macOS 27 was released on September 14, 2026. After the upgrade to 27.0.1, the graph withdrew most of the rows it had built from Contacts, Calendar, Siri Suggestions, Family Sharing and the app catalog, and rebuilt them over the following day. Some pages of iKnow may not work fully on macOS 27 yet.

But let's go deeper:

How to cite this game

BibTeX · click to select
@misc{8rank:apple-intelligence-personal-knowledge-graph,
  author       = {Dario Pasquini and Micha{\l} Bazyli},
  title        = {{Anatomy of Apple's Personal Knowledge Graph}},
  year         = {2026},
  month        = oct,
  howpublished = {\url{https://8rank.ai/game/apple-intelligence-personal-knowledge-graph}},
}