smooth-app
A collaborative, free and open database of ingredients, nutrition facts and information on food products from around the world
A short, honest Big Five personality test. 20–50 public-domain questions, a model trained on hundreds of thousands of real responses, and five percentiles with their margins of error. Runs entirely in
HealthTypeScript · PythonGitHub @haaj-1OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Big Five personality test that shows its work: short-form IPIP model trained on 597k responses, per-trait percentiles with error bands, runs entirely in the browser.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Fivefold: a Big Five personality test that shows its work
A short Big Five (OCEAN) personality test that runs entirely in your browser. You answer 20, 30 or all 50 public-domain IPIP statements. For each of the five traits you get a percentile against hundreds of thousands of real respondents, an honest error band, and the answers that moved each score.
Built with Next.js (static export), TypeScript and Tailwind. The model is trained in Python (ml/) and shipped as a JSON file of about 200 KB (about 65 KB gzipped).Read the full README ↗A short Big Five (OCEAN) personality test that runs entirely in your browser. You answer 20, 30 or all 50 public-domain IPIP statements. For each of the five traits you get a percentile against hundreds of thousands of real respondents, an honest error band, and the answers that moved each score.
Live: https://personality-trait-predictor.vercel.app
Built with Next.js (static export), TypeScript and Tailwind. The model is trained in Python (ml/) and shipped as a JSON file of about 200 KB (about 65 KB gzipped).
The model is trained on the Open Psychometrics IPIP-FFM dataset: about 1M anonymous online responses (2016-2018) to the 50-item IPIP Big Five markers. Cleaning steps:
| Step | Removed | Remaining |
|---|---|---|
| Raw | 1,015,341 | |
One submission per IP (IPC == 1) | 318,496 | 696,845 |
| No missing answers | 93,523 | 603,322 |
| Not a straight-liner (all 50 identical) | 731 | 602,591 |
| Completion time 50 s to 1 h | 5,491 | 597,100 |
The clean rows are split at random: 477,680 for training and 119,420 held out for testing.
Standard IPIP scoring. Each trait is the mean of its 10 keyed items on a 1-5 scale, and a reverse-keyed item counts as 6 - x. Traits are reported in this order: Extraversion, Neuroticism, Agreeableness, Conscientiousness, Openness.
The model predicts your full 50-item scores from fewer answers.
stages[k-1].traits[t].band). A single pooled ±1 RMSE band was the wrong width near the ends of the scale: scores cannot exceed 5, and on skewed traits a fixed score band spans far more percentiles at the top than at the bottom. On the test split the conditional band covers 68% of people for every trait and length (target 68%).ml/reports/evaluation.md → "Result wording" has the table.model.json → . Results also need at least 10 answers; shorter links ask the person to continue the test.Each trait is reported on its own scale, as a percentile against the training split's full-scale scores (1,001 stored quantiles, linear interpolation). The trait shown as "most distinctive" is the one furthest from the 50th percentile, not the one with the largest raw number.
Mean R² across the five traits, predicting the full 50-item score:
| Model | k=10 | k=20 | k=25 | k=30 | k=40 |
|---|---|---|---|---|---|
| Linear (shipped) | 0.754 | 0.883 | 0.917 | 0.942 | 0.978 |
| LightGBM | 0.758 | 0.886 | 0.919 | 0.943 | 0.977 |
| Small MLP | 0.757 | 0.885 | 0.918 | 0.942 | 0.978 |
| Prorated baseline (score only answered items) | 0.506 | 0.800 | 0.863 | 0.895 | 0.967 |
The full report, with per-trait R², RMSE, MAE and Pearson r, the confusion matrix and plots, is in ml/reports/evaluation.md. The same numbers appear on the site's /method page, generated from the shipped model.json.
The first version (a Streamlit app with five CatBoost models) told nearly everyone they had the same "dominant" trait. The original bug report named Agreeableness. A faithful replay of the committed code on 5,000 held-out respondents gave Openness for 88.9% and Agreeableness for 9.5%. Its top trait matched the person's real top trait only 12% of the time, worse than chance (20%). Several bugs combined to cause this:
v2 replaces all of this: correct scoring, one linear model per test length, a separate percentile for each trait, and the bias check above.
Requires Node 20.9+ (developed on Node 24).
npm install
npm run dev # http://localhost:3000
npm run build # static export to out/
npm start # serve out/ locally
| Command | What it does |
|---|---|
npm run lint | ESLint |
npm run typecheck | tsc --noEmit |
npm test | Vitest unit tests: inference, parity with Python, share links, export |
npm run test:e2e | Playwright end-to-end tests against the static build (desktop 1440 px and mobile 375 px) |
npm run sync-model | Validate ml/artifacts/model.json, copy it to src/data/model.json and regenerate src/data/model.runtime.json (also regenerated before every build) |
npm run og-image | Regenerate the Open Graph image and touch icon |
Layout:
src/lib/model.ts pure inference (predict, percentiles, contributions)
src/data/model.json the trained model (copied from ml/artifacts)
src/data/model.runtime.json slim slice of it for /test (order, statements, per-k error); generated
src/data/content.ts trait descriptions and citations
src/app/ /, /test, /results, /method
ml/ training pipeline, tests and reports (not deployed)
ml/)python -m venv .venv && . .venv/bin/activate
pip install -r ml/requirements.txt
python ml/pipeline.py --data path/to/data-final.csv --out ml/artifacts --reports ml/reports --seed 42
npm run sync-model
If --data doesn't exist, the pipeline downloads the dataset. The dataset is never committed. A full run takes about 7-8 minutes on a laptop and is deterministic for a given seed. Use --sample 50000 for a quick run. The pipeline writes ml/artifacts/model.json, ml/artifacts/parity_cases.json (30 reference predictions, with their bands and wording, that the TypeScript code must reproduce) and ml/reports/evaluation.md.
model.json follows the contract in SPEC.md, plus optional extras the web app reads when present: per-stage conditional bands, responseStyle, and in evaluation the per-length byK and strength tables, traitCorrelation and shrinkage.
python -m pytest -q ml/tests # scoring, cleaning, model contract, sanity profiles, parity cases
PTP_DATA=path/to/data-final.csv python -m pytest -q ml/tests/test_heldout.py # re-checks wording and band coverage on the held-out split
npx vitest run # TS inference + parity with Python (scores within 1e-6, percentiles within 1e-4)
npx playwright test # full test flow, results, share links, /method, no horizontal scroll at 375 px
Everything runs in your browser. Answers are never sent anywhere. There is no server, no analytics and no cookies. A share link carries your answers in the URL fragment (#…), which browsers do not send to the server.
This is a self-report personality description, not a clinical or hiring tool.
responseStylecoef × (answer − population mean answer).