A model is selectable only after its ratings, feature data, model run, and coefficients are complete.
product system / 2026
Matchmaker Ratings + Ranking
I built two connected applications that turn a client's subjective attraction ratings into a reusable preference model. Then I apply that model to rank new candidates for their matchmaker.
the problem
“Not my type” is a barrier to a matchmaker's success.
Clients are often vague about what they find physically attractive in an ideal candidate. That leaves matchmakers with sparse data and a tedious, manual process of trial and error to learn the specifics of each client's type. It wastes both the matchmaker's and the client's time.
This system turns that ambiguity into a shared, client-approved model by having clients rate photos and learning what, specifically, they like and dislike about them. With richer data, matchmakers can learn which signals to look for and move more promising introductions toward a yes.
visual walkthrough
From a client's ratings to a ranked candidate batch.
One connected workflow across the matchmaker and client experiences.
-
01
Set the depth of the signal
The matchmaker creates a client and chooses how many photos they should rate. A short set gets the workflow moving; a larger set gives the model a deeper picture of the client's preferences.
- Multi-client matchmaker workspace
- Configurable rating assignments
- Progress and readiness states
Matchmaker workspace -
02
Capture instinct, one photo at a time
The client sees an intentionally simple rating experience: one image, one question, and a 1–5 response. The interface tracks completion while the system records the signal needed for the preference model. Each photo is meticulously labeled so the rating can be connected to consistent visual attributes.
- Focused, low-friction client flow
- Ordered photo assignment
- Response timing captured with each rating
Client rating flow · one photo at a time -
03
Make the model editable
Completed ratings become an attraction report organized by positive and negative signals. Before approval, the client—or the matchmaker on their behalf—can move an insight between impact buckets so the final model reflects what they actually mean.
- Human-readable model factors
- Six impact-strength buckets
- Approval locks a shared source of truth
Demo note: Only five photos were rated in this sample, so the report contains very few example insights. A full client rating set produces a much deeper report.
Client-approved attraction report -
04
Bring the client's attraction model into a ranking algorithm
In the ranking workspace, the matchmaker chooses a ready client model and drops in a batch of candidate photos. Pending clients remain visibly unavailable until enough rating data has been processed.
- Secure cross-app session handoff
- Client-specific and general models
- Batch upload with durable draft state
Client selection and batch upload -
05
Prioritize candidates with evidence
The processed batch returns to a client-filtered gallery with a score on each photo. The matchmaker can compare batches, inspect the factors behind a result, and export the ranking for the rest of their workflow.
- Realtime processing updates
- Per-client batch history
- Detailed breakdowns and CSV export
Ranked candidate results
technical brief
README.md
A production system assembled around explicit boundaries, reviewable model outputs, and two purpose-built interfaces.
01 / architecture
Two applications with a secure model handoff
Matchmaker Ratings owns client setup, photo assignments, rating capture, report generation, and approval. Matchmaker Ranking consumes only ready client models, adds them to new photo-analysis jobs, and owns batch review and results.
A signed, expiring handoff moves the authenticated matchmaker from the ratings app to the ranking app. The ranking server then retrieves model artifacts over a private, authenticated server-to-server endpoint; coefficients never need to be trusted from the browser.
02 / modeling pipeline
Personalized enough to be useful, simple enough to explain
A Python pipeline combines labeled baseline examples with the client's weighted rating rows. It standardizes features and fits a cross-validated Elastic Net model, producing an intercept and a rich set of positive and negative coefficients.
baseline photo signals
+ weighted client ratings
↓
StandardScaler → ElasticNetCV
↓
versioned coefficients + impact %
↓
client review → approved model
Rather than exposing every coefficient, the client-facing report surfaces only the photo attributes the model determines are most impactful. Those attributes are translated into readable labels and six impact levels—from minimal to major. A client can correct the strength of an insight before approval, keeping the machine-learning layer auditable and the human decision-maker in control.
03 / engineering decisions
Reliability is built into the workflow
Reliability here means making incomplete or invalid states explicit: a model cannot be selected too early, data is validated as it crosses services, and a ranking batch keeps its identity throughout processing.
Every client model carries a stable identity and version so a ranking batch remains traceable.
Zod schemas validate session, model, upload, API, and realtime payloads as they cross services.
Uploads preserve client, model, order, expected size, and draft state across processing and refreshes.
Ranking results are scoped to the authenticated matchmaker before they reach the UI.
React Query cache updates and Socket.IO events keep multi-photo processing visible in real time.
04 / stack
Built across the full product surface
- ratings frontend
- React, TypeScript, Vite
- ranking frontend
- Next.js 16, React 19, Tailwind, React Query
- services + data
- Node, Express, PostgreSQL, Zod, Socket.IO
- modeling
- Python, pandas, NumPy, scikit-learn
- operations
- Linux, Nginx, systemd, Hetzner