WallpaperMachine
The wallpapers you love. A new home on your Mac.
Canadian cities ranked on safety, jobs, housing cost, climate, air quality, traffic and amenities. Updated automatically from public data.
LifestylePython · JavaScriptGitHub @imran-ahmed377OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Ranks 29 Canadian cities on living standards: the largest metro areas, with Toronto split into its ten biggest GTA cities (Toronto, Mississauga, Brampton, Markham, Vaughan, Oakville, Richmond Hill, Milton, Ajax, Pickering). Each is scored on:
All data comes from public APIs. A GitHub Actions workflow refreshes the data and republishes the dashboard every hour.
Live dashboard: https://imran-ahmed377.github.io/city_rank_ai/
| Category | Source | Key needed? |
|---|---|---|
| Climate, current weather, air quality | Open-Meteo (forecast, archive and air-quality APIs) | No |
| Safety | Statistics Canada – Crime Severity Index by metro area (35-10-0026-01) and by Ontario police service (35-10-0188-01) | No |
| Jobs & economy | Statistics Canada – Labour Force Survey (14-10-0459-01), Population estimates by metro area and municipality (17-10-0148-01, 17-10-0155-01) | No |
| Housing cost | CMHC average rents via Statistics Canada (34-10-0133-01) | No |
| Amenities | OpenStreetMap via the Overpass API | No |
| Traffic | TomTom Traffic Flow API | Yes (free tier) |
The scoring method is explained on the site and in SPEC.md.
python -m venv .venv
source .venv/bin/activate # Windows PowerShell: .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m pytest -q # tests
python -m city_rank # fetch data, score, build docs/
Then open docs/index.html in your browser.
Useful options:
| Command | What it does |
|---|---|
python -m city_rank --no-fetch | Rebuild the site from stored data only. |
python -m city_rank --only crime,jobs | Refresh specific sources. |
python -m city_rank --force | Refetch everything. |
TOMTOM_API_KEY=... python -m city_rank | Enable traffic sampling (only during weekday rush hours). |
TOMTOM_API_KEY.main, on GitHub's hourly schedule (best-effort, see below), and manually from the Actions tab. A manual run can refetch specific sources:
gh workflow run city-rank.yml -f only=population,crime (or -f force=true for everything).GitHub treats scheduled workflows as best-effort, and in practice runs this one only every 5–7 hours. Traffic needs a sample in every rush hour, so an external free cron service triggers the workflow every hour instead. GitHub's schedule stays as a backup; duplicate runs are harmless because each city is sampled at most once per hour.
city_rank_ai.https://api.github.com/repos/imran-ahmed377/city_rank_ai/actions/workflows/city-rank.yml/dispatchesAccept: application/vnd.github+jsonAuthorization: Bearer <your token>X-GitHub-Api-Version: 2022-11-28{"ref":"main"}Cost: everything here is free. Public repositories get unlimited Actions minutes; cron-job.org is free; TomTom usage stays under its free 2,500 requests/day (about 1,570 at most, with a hard stop at 2,200).
Fetched data and history are stored on the bot/data branch, so main contains only code.
The code is released under the MIT License. Copyright (c) 2026 Imran Ahmed.
The data shown on the site is not covered by this licence. It belongs to its providers and is used under their terms: