viewof selectedWinters = {
const allSeasons = [
"2020-21","2021-22","2022-23","2023-24","2024-25","2025-26"
];
const selected = new Set(allSeasons);
// Inject custom checkbox styles once — guarded so OJS re-runs don't duplicate
if (!document.getElementById("bq-season-cb-style")) {
const s = document.createElement("style");
s.id = "bq-season-cb-style";
s.textContent = `
.bq-season-cb {
appearance: none;
-webkit-appearance: none;
width: 14px;
height: 14px;
border-radius: 2px;
margin: 0;
border: 1.5px solid #888;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: transparent;
}
.bq-season-cb:checked {
background-color: var(--season-color);
border-color: var(--season-color);
}
.bq-season-cb:checked::after {
content: "✓";
color: #fff;
font-size: 10px;
font-weight: 700;
line-height: 1;
}
.bq-season-cb:hover {
transform: scale(1.15);
box-shadow: 0 0 0 2px rgba(0,0,0,0.15);
}
.bq-season-lbl {
display: inline-flex;
align-items: center;
gap: 8px;
cursor: pointer;
user-select: none;
}
`;
document.head.appendChild(s);
}
const root = document.createElement("div");
root.style.cssText = "font-family:var(--sans-serif,sans-serif);font-size:13.5px;";
const labelEl = document.createElement("div");
labelEl.textContent = "Seasons shown";
labelEl.style.cssText = "font-weight:600;margin-bottom:3px;";
const hint = document.createElement("div");
hint.textContent = "Click a season to show or hide it";
hint.style.cssText =
"font-size:11.5px;font-weight:400;color:var(--bq-fg-faint);margin-bottom:6px;";
const row = document.createElement("div");
row.style.cssText =
"display:flex;flex-wrap:wrap;gap:6px 20px;align-items:center;";
for (const season of allSeasons) {
const color = seasonColorMap.get(season);
const cb = document.createElement("input");
cb.type = "checkbox"; cb.value = season; cb.checked = true;
cb.className = "bq-season-cb";
cb.style.setProperty("--season-color", color);
const txt = document.createElement("span");
txt.textContent = season;
const lbl = document.createElement("label");
lbl.className = "bq-season-lbl";
lbl.append(cb, txt);
row.append(lbl);
cb.addEventListener("change", () => {
if (cb.checked) selected.add(season); else selected.delete(season);
root.value = [...selected];
root.dispatchEvent(new Event("input"));
});
}
root.append(labelEl, hint, row);
root.value = allSeasons;
return root;
}Left in the Cold: Toronto Shelter Access
People still without shelter at 4 a.m. on cold nights, and what changed across six winters
Toronto cold-weather shelter data for people who need a safe, warm place, including people who are housing insecure, unhoused, or experiencing homelessness.
People still without shelter at 4 a.m.
Toronto’s Central Intake counts how many people or couples who asked through its system had not been connected to a shelter space by 4 a.m. We call this still without a place at 4 a.m. It does not count everyone outside or people turned away at a shelter door.
Across six winters, at least one person or couple was still without a place at 4 a.m. on 257 of 268 nights at or below −5 °C. People turned away at a door are not counted.
Access improved in 2023–24 to 2025–26. Even so, cold-weather spaces were almost completely full on 64 of 137 nights at or below −5 °C. These numbers show both the improvement and the space still missing. They do not show every person outside or explain why each operating decision was made.
The chart below shows every one of those nights.
Note
Reading the chart. The chart shows data from up to six cold seasons (November 15 to April 15), colour-coded by winter year. The vertical lines across the background act as a temperature rug — each line marks one night’s recorded overnight minimum temperature, coloured to match its season. Where these lines cluster together, data is plentiful; where they thin out (below about −15 °C), individual nights carry more weight. Use the checkboxes above to show or hide individual seasons.
This is a choice, and the choice is being made right now
The number is not fixed. As recently as the winters of 2020–21 and 2021–22, the overnight queue averaged about 35 people a night. By 2022–23 it had tripled, to over a hundred, and stayed there for three winters. Then, this past winter, it fell back to roughly 34.
Table 1. Average number of people (singles and couples) left unplaced at 4 a.m., December through February, Toronto shelter system (2020–21 through 2025–26).
| Cold season | Mean unplaced per night |
|---|---|
| 2020–21 | 37.6 |
| 2021–22 | 34.7 |
| 2022–23 | 100.3 |
| 2023–24 | 155.5 |
| 2024–25 | 101.4 |
| 2025–26 | 34.2 |
Note. Values are nightly means of people (singles and couples) still unmatched to a bed at the 4 a.m. Central Intake closeout, averaged across December, January, and February. The increase between 2021–22 and 2022–23 reflects a structural change in the series; the two periods should not be averaged together. Source: Toronto Central Intake (SMIS), BonQuery analysis.
So what was different in the winters when the number was low? Not the cold — those winters were no milder. And not emergency warming centres, which were at their largest ever this past winter. The difference was that the regular shelter system had room to breathe: it ran near 97% full, instead of jammed against 99% or more as in the worst years. When the everyday system isn’t already at capacity, a cold snap doesn’t have to end with people on the street.
The reserve the City did not plan for
The City announced how many spaces it would activate, but not the operating reserve required to admit the next person. Its 2023–24 plan conditionally activated 170 warming-centre spaces while reporting approximately 275 people unmatched for shelter each night and acknowledging that the plan might not be sufficient. This was not a plan that unexpectedly encountered unmet demand. It was adopted with unmet demand already documented.
The analysis below asks a deliberately narrow question: among people who were already admitted to the warming-centre and surge layer, how many additional spaces would have been required to preserve a small operating reserve on nights at or below −5 °C? A reserve is not waste. It is the room needed to admit the next person without first waiting for someone else to leave.
This is a lower bound, not an estimate of total need. Toronto does not count everyone turned away from a full walk-in site. The separate Central Intake queue is not added here because it uses a different access route. Every number below is calculated only from people the active walk-in layer had already admitted.
Table 2. Minimum additional walk-in capacity required under four operating reserve scenarios on nights at or below −5 °C, 2023–24 through 2025–26.
Note. “Additional spaces” is the minimum active capacity required to keep the selected percentage of beds free after accommodating the people already inside. It does not include unrecorded walk-in turnaways or unmatched Central Intake callers. The 2% row reproduces the manuscript’s locked saturation result: 64/137 nights (46.7%) were at least 98% full.
At a modest 10% reserve, the active layer fell short on 121/137 nights (88.3%). It would have needed a median of 21 additional spaces per cold night, with a maximum of 37. Those figures are not a generous surplus. They are the minimum breathing room calculated from people already admitted.
The City also paid for capacity it did not make available. During 2023–24 deactivation periods, warming centres stopped admitting new clients while funded beds remained vacant. The Auditor General counted 4,331 vacant bed-nights over 94 nights, about 46 beds per night. The City paid third-party operators the maximum $12.5 million contribution based on full-capacity budgets; operators later reported $9.7 million in costs, and nearly $2.9 million in surplus remained unrecovered as of October 2024. The audit also found that the City’s cost review lacked supporting records and did not properly adjust for how long sites were actually open (Auditor General, pp. 22–23 and 35–37).
Public money paid for capacity. Administrative rules kept that capacity from people who needed it. Because local evidence shows that cold injury and death occur well above −15 °C, deactivation did not mark the end of danger. It marked the point at which the City chose to stop admitting people despite available funding, physical beds, and continuing demand.
That is the whole lever. And it is pulled in the summer — now — when the fall budget decides how many beds will exist on the first freezing night of November. By the time the cold arrives, the decision has already been made.
The goal should be zero people left without shelter below freezing. Moving toward that goal does not require a new type of program. It requires funding enough standing shelter capacity to preserve breathing room before the first freezing night, not adding temporary capacity only after demand has exceeded what is available. The City has already shown that the overnight queue can fall sharply. The question is whether it will preserve that capacity through the next winter.
Data: Toronto Central Intake call records (SMIS), six cold seasons November 15–April 15, 2020–21 through 2025–26. Analysis by BonQuery. Weather: Environment and Climate Change Canada hourly records, Toronto station, retrieved via the weathercan R package.
Contains information licensed under the Open Government Licence – Toronto.