The economy can look fine on paper while feeling broken in real life.
HOSI, the Household Opportunity & Stress Index, is an open-source dashboard built around a simple idea:
Headline unemployment tells you who kept a job. HOSI tries to tell you whether ordinary people can stay afloat, move up, and access the services the economy claims to provide.
Two economies can post the same unemployment rate and still feel completely different.
In one, teenagers can get summer jobs, graduates can find paid internships, families can absorb a surprise bill, and businesses are actually staffed.
In the other, older workers keep their jobs, young adults can't break in, internships are unpaid, families are stretched thin, and businesses run permanently understaffed.
Traditional topline statistics often blur that distinction.
HOSI is built to make it visible.
HOSI starts from a 2019 average = 100 baseline.
- Above
100means conditions are more stressed than pre-pandemic normal. - Below
100means conditions are less stressed than that baseline.
The current index combines four pillars:
Can a household actually absorb pressure?
- personal saving rate
- housing-payment burden proxy
- credit-card delinquency
- real median weekly earnings
Can people actually get in, move up, and switch jobs?
- hires rate
- quits rate
- youth unemployment
- U-6 unemployment
Are people patching together stability the hard way?
- multiple jobholding
Is the real economy staffed enough to deliver what it advertises?
- leisure and hospitality employment
- job openings pressure
This is still version one. The long-term vision is broader:
- entry-level job access
- paid vs unpaid internships
- applicant pressure for first jobs
- service availability signals
- behavioral confidence measures like delayed household decisions
Most people do not experience the economy as a spreadsheet.
They experience it as questions:
- Can my kid get a summer job?
- Can a recent graduate find a real first step?
- Can I switch jobs without falling backward?
- Can a family handle rent, insurance, food, and debt at the same time?
- Are businesses actually open at the capacity they advertise?
HOSI is an attempt to measure that lived economic ecosystem better than unemployment alone.
- A React + TypeScript frontend deployable to GitHub Pages
- A FastAPI backend deployable to Railway
- DuckDB + Parquet data artifacts for reproducible snapshots
- Monthly ETL against official public data
- Clear source notes and methodology endpoints
- A test stack with unit tests, Storybook tests, and Playwright smoke coverage
Current automated inputs come from official public releases, mainly through stable FRED series access:
PSAVERTpersonal saving rateMDSPmortgage debt service payments ratioDRCCLACBScredit-card delinquency rateLEU0252881600Qreal median weekly earningsJTSHIRhires rateJTSQURquits rateLNS14024887youth unemployment rate, ages 16-24U6RATEbroad underemployment / labor underutilizationLNS12026620multiple jobholders as a share of employedUSLAHleisure and hospitality employmentJTUJORjob openings rate
- HOSI is experimental. It is not an official government statistic.
- Higher values mean more stress, not “better performance.”
- Service-capacity pressure currently uses labor-market proxies, not direct operational wait-time or availability data.
- Housing affordability currently uses the official
MDSPproxy because the FRED-hosted NAR fixed HAI history is too short for a reproducible automated2019 = 100workflow. - Quarterly series are carried into monthly output so the dashboard can present a unified monthly view.
cd backend
uv venv
. .venv/bin/activate
uv pip install -e .[dev]
python -m etl.build_hosi
uvicorn app.main:app --reloadcd frontend
npm install
VITE_API_BASE=http://127.0.0.1:8000 npm run devcd backend
. .venv/bin/activate
pytestcd frontend
npm run test:unit
npm run test:stories
npm run test:e2e:smokeGET /api/hosi/latestGET /api/hosi/timeseriesGET /api/componentsGET /api/sourcesGET /api/methodology
Configure a Railway service with:
- source repo:
bcorfman/hosi-dashboard - branch:
main - root directory:
/backend - config file: backend/railway.toml
- public networking port:
8000 - wait for CI: enabled
Once deployed, verify:
/health/api/hosi/latest
Set the repository variable VITE_API_BASE to the Railway backend URL, then deploy the Pages workflow from main.
The Pages job is intentionally skipped until VITE_API_BASE exists so the site does not publish with a dead API target.
The current registry is in backend/app/services/methodology.py.
That makes HOSI easy to extend with future indicators like:
- internship pay
- entry-level hiring friction
- time-to-first-job
- customer wait times
- service availability
- household confidence behaviors
If unemployment mostly measures retention, HOSI is an attempt to measure mobility, resilience, strain, and real-world economic capacity.