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.
How it works
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.
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.
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.