ArticleReadMain page

Nathan's Technology Wiki / Projects

Mr Personality

A privacy-first recommendation prototype that analyses photos locally and shows its evidence for every inference.

Project identity

Mr Personality turns a small set of photographs and confirmed context into gift ideas, conversation starters, and activity plans. It is a prototype, and its interesting property is architectural rather than cosmetic: the photo analysis that would normally justify a cloud vision API runs inside a local container instead.

History beginsSeptember 5, 2026
StatusRunning locally as a prototype
Photo analysisLocal container; images never leave the machine

How it works

InputBetween two and ten photographs, plus any context the user confirms.
Local analysisA container service detects visible activities and reads text found inside images.
SignalsDetected activities select matching interests; bio text feeds interest, reading, career, and personality rules.
ScorecardBuilt automatically once at least two photos finish, with confidence and evidence attached to every trait.
EditThe user can change every result afterwards; nothing is presented as final.

The browser pipeline has a two-minute overall timeout, and if local analysis is unavailable the application degrades to pasted-bio matching and manual selection rather than failing.

Local photo analysis

The container image downloads a pinned vision-model revision at build time and packages local English text-recognition data alongside it. At runtime the service loads both from disk and remote model loading is disabled outright, so the analysis cannot silently fall back to a network call.

What it reads

  • Visible activities such as hiking, bowling, wine tasting, concerts, reading, travel, and fitness.
  • Text inside uploaded screenshots, so a profile bio visible in an image feeds the same rules as pasted text.

Why this shape

  • Pinning the model revision makes the build reproducible instead of dependent on whatever the upstream registry serves that day.
  • Disabling remote loading turns the privacy claim into a runtime property rather than a promise.
  • Packaging the recognition data avoids a first-run download that would fail on an offline host.

The scorecard and its evidence

The scorecard builds itself from detected interests and direct language in the bio. It assigns a confidence level and supporting evidence to each dimension rather than presenting a bare score.

RuleBehavior
TraitsSpontaneity, flirt energy, sarcasm, whimsy, technical depth, empathy cues, passion, and ambition cues, each with confidence and evidence.
ReadingHas its own affinity score, but a specific genre stays unknown unless the bio supplies evidence for one.
CareerComes only from explicit terms in the bio, never inferred from imagery.
HobbiesCome from detected and user-confirmed interests.
Unknown is a valid answer
The rules deliberately return unknown rather than guessing when the evidence is not there. A recommendation engine that always produces a confident answer is not more useful; it is only harder to check.

Module boundaries

The project keeps provider-neutral contracts separate from the deterministic logic that consumes them, so the local analysis service could later be replaced by a server-side implementation without rewriting the recommendation rules.

ModuleResponsibilityReason for the boundary
Application flowThe working product journey and site themePresentation changes should not touch matching logic.
Domain contractsProvider-neutral type definitionsThe rules depend on a contract, not on a specific analysis provider.
Recommendation engineDeterministic matchingTestable in isolation and repeatable for the same input.
Bio parserDeterministic extraction of bio signalsText rules stay independent of image analysis.
Local photo serviceVisual recognition and text recognition inside the containerThe only component that touches image data.
Model adapterThe seam for a future server-side analysis integrationDocuments the intended production boundary before it is needed.

Testing and QA

Quality checks exercise nine two-photo activity profiles and twenty public profile screenshots, validating every scorecard field and recommendation. Test images are cached outside version control, and the QA commands require the local container to be running because they test the real analysis path rather than a stub.

  • The QA report records the current test matrix together with its interpretation limits, which is the part usually left out.
  • Because the engine is deterministic, a changed result is a real regression rather than sampling noise.
  • The two-minute pipeline timeout is itself a tested path, not only a defensive constant.

Limits and responsible use

This project infers characteristics about a person from photographs and text they wrote. That is worth stating plainly rather than burying, because the design choices only make sense in that light.

  • Every inference is probabilistic. Confidence and evidence are shown so a user can disagree with a specific claim rather than accepting a summary.
  • Every result is editable, and user edits take precedence over detection.
  • Unknown is returned instead of a guess wherever evidence is missing, particularly for career and reading genre.
  • Images are processed locally and are not transmitted, which keeps other people photographs out of any third-party service.
  • The output is intended to help someone think of a gift or a conversation topic. It is not a personality assessment, and it should not be presented to anyone as a judgment about who they are.

Roadmap

  • Adopt semantic versioning and a changelog so prototype releases become traceable like the rest of the portfolio.
  • Implement the documented model adapter so the analysis provider can change without touching the recommendation rules.
  • Expand the recognition data beyond English if the screenshot path is used for non-English profiles.
  • Record the confidence distribution across the QA set, so a rules change can be measured rather than eyeballed.