91³Ô¹ÏÍø

Watch CBS News

Denver seeks zoning changes to address "missing middle housing"

Denver's Community Planning and Development Agency just wrapped up a series of public informational meetings on its plans to make changes to the city's zoning rules to address what they call "missing middle housing."

"That basically means anything with more units than a single-unit home, but smaller than an apartment building," Rob Haigh, a senior city planner, explained.

denver-housing-changes-10pkg-transfer-frame-1324.jpg
A home under construction in Denver. CBS

Haigh is overseeing the initiative called . 

"The purpose of this is to increase options for people who have different housing needs in some of Denver's more desirable, quieter, slower residential neighborhoods, for people who might not currently be able to afford to live there," he added."

The changes, if adopted by the city council, will affect all of Denver's single-unit and two-unit zone districts in three ways, including placing size limits on new single-family homes. 

"We've seen that speculative redevelopment, or people move in, they scrape a small, more moderately sized, more affordable bungalow or starter home and build a multi-million-dollar house," said Haigh. "So, in order to prevent that, that trend that we've been seeing that has really resulted in a loss of Denver's kind of starter home inventory, we are going to, or we are going to impose a limit on the maximum floor area for above-grade housing."

Secondly, a property owner will be able to build additional housing units on their property, such as a duplex.

denver-housing-changes-10pkg-transfer-frame-742.jpg
Denver from above. CBS

The last situation would allow for the complete scrape and rebuilding of a property only when an affordable housing unit is provided as part of the new structure. 

"The benefit of that is it helps to preserve the existing qualities of neighborhoods," said Haigh.

But some residents believe there will be unintended consequences as a result of broad-sweeping changes. 

"I'm afraid that they're not targeting it well enough," said Bill Killam, who's involved with the Berkeley Regis neighborhood association as the chairman of the zoning and planning committee. 

Killam has lived in Denver's Berkeley neighborhood for four decades and has seen it drastically change in the last 15 years.

"Just look at Tennyson, there are 200 of them just built last year and developed," said Killam. "Let's have rental units available as well, but let's not kill the neighborhood that people find desirable to live in."

Traveling through the neighborhood, new multi-unit housing is abundant. 

"All the old bungalows, all the little houses, 90% of them are gone, and you have new three-story duplexes that are now going for between $1.2 and $1.4 million a side," said Killam. "You almost doubled the density for four blocks. But did you make it more affordable?"

He also raises concerns about the affordability of building additional units. 

denver-housing-changes-10pkg-transfer-frame-3420.jpg
Homes in a Denver neighborhood.  CBS

"Homeowners have had the ability to build ADUs on single-family zoned properties for several years now," said Killam. "There's very little of that that's actually being constructed, because it's so expensive."

The proposal is set to go before the city council by the end of the year,  but Killam is hoping more residents will speak up before then. 

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=fd53910ecf4604072044ab7c46d9b028'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });