QueerNomads is a queer-first analytics product demo for digital nomads choosing where to live, work, and belong.
It combines:
- structured city scoring (across six dimensions),
- preset ranking modes for different priorities,
- side-by-side comparison, and
- community perspective from lived-experience stories.
The goal is practical: help users make better relocation and travel decisions with clear tradeoffs, not vague hype.
Most “best city” lists flatten complex decisions into a single score. For queer travelers, the real decision surface includes safety, social belonging, and local community context alongside affordability and remote-work quality.
QueerNomads is built to show that decision process explicitly:
- transparent dimensions,
- adjustable preset priorities,
- readable strengths/tradeoffs,
- and methodology disclosures.
/— landing page + featured cities + guided demo flows/cities— ranked city discovery with filters and presets/cities/<slug>— city intelligence brief with radar chart + evidence bars/compare— compare 2–4 cities with row-level winners/methodology— model explanation, caveats, and confidence framing/community— qualitative stories linked to places
/compare?city=berlin&city=lisbon/cities?preset=best_for_community/cities?preset=balanced&cost_level=medium&sort=score_desc
These routes are intentionally prefilled so reviewers can understand the product in under a minute.
- City intelligence model across six dimensions:
- affordability
- safety
- inclusivity
- internet quality
- livability
- community potential
- Preset ranking modes:
- balanced
- best_for_remote_work
- best_for_community
- Snapshot/read model for fast ranked list rendering
- Visual decision support:
- radar chart on detail pages
- score bars + comparison table bars
- Community context layer with story linking to city briefs
- Premium dark UI tuned for portfolio/demo quality
Add current screenshots here (recommended names):
docs/screenshots/homepage.pngdocs/screenshots/cities.pngdocs/screenshots/city-detail-radar.pngdocs/screenshots/compare.pngdocs/screenshots/methodology.png
The app includes guided scenarios and visual analytics intended to be shown in sequence during demos.
Dimension scores live in seeded data and are weighted by preset definitions.
At runtime:
- base dimension scores are loaded per city,
- preset weights are applied,
- weighted values are normalized to 0–100,
- strengths/tradeoffs are derived from top/bottom dimension signals,
- results are materialized into
city_snapshotsfor read performance.
This keeps ranking logic deterministic and auditable while preserving fast page loads.
app/routes/*— Flask blueprints and route handlersapp/repositories/*— data access + read shapingapp/services/*— business logic (scoring, presets, filters, comparison, snapshots)app/templates/*— server-rendered Jinja viewsapp/static/style.css— premium UI theme
- SQL migrations apply schema changes.
- Seed payloads load city/dimension score data.
- Snapshot service recalculates preset scores + strengths/tradeoffs.
- Routes query repositories that read from city + snapshot tables.
Primary tables:
citiesscore_dimensionscity_scorescity_snapshots(read model)methodology_notesstoriesusersschema_migrations
The city_snapshots table stores computed preset outputs to keep ranked list and card rendering simple and fast.
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
python run.pyApp runs on http://127.0.0.1:5000 by default.
Environment-driven config is defined in app/config.py.
Common vars:
SECRET_KEYDATABASE_PATHFLASK_ENV
If .env is absent, development-safe defaults are used.
- SQL migrations:
migrations/*.sql - Applied migration tracking:
schema_migrations - Initialization automatically performs:
- migration apply,
- seed upsert,
- snapshot rebuild.
Manual command:
flask --app run.py migratepytestCurrent tests cover:
- core route rendering,
- filtering/preset behavior,
- compare input normalization,
- migration application,
- snapshot population.
- user-adjustable custom weighting UI (beyond fixed presets)
- richer confidence and recency metadata per dimension
- locale-aware cost and visa overlays
- saved comparison briefs for signed-in users
- lightweight chart image export for sharing
QueerNomads is designed to demonstrate:
- pragmatic Flask architecture,
- data modeling + migration discipline,
- analytics UX clarity,
- and product storytelling tuned for real reviewer walkthroughs.