91³Ô¹ÏÍø

Watch CBS News

NYC's first city-run grocery store coming to East Harlem, Mayor Mamdani announces

Mayor Zohran Mamdani has made his choice for the site of New York City's first city-run grocery store.

Speaking at a rally in Queens on Sunday while celebrating his first 100 days in office, Mamdani said La Marqueta in East Harlem, which is owned by the city, will be developed using capital funds.

"When corporations control every part of the food supply chain, prices go up, wages stay flat, and workers and customers both lose," the mayor said in an earlier statement. "That is why we are advancing a public option -- one rooted in the belief that our city can and must intervene where the market has failed. 

"We cannot accept a status quo where even the most basic necessity -- putting food on the table -- feels out of reach. This is about ensuring that every New Yorker, regardless of income or ZIP code, has access to fresh, healthy food at a price they can afford."

City-run grocery store in every borough

According to the mayor's office, the Mamdani administration plans to select future sites soon and open La Marqueta by the end of 2029 and all five planned city-run grocery stores -- one in each borough -- by the end of his term. The hope is to renovate existing structures instead of starting from scratch.

"Today's announcement by the mayor of new city-run grocery stores is just another example of government working for the people," U.S. Sen. Bernie Sanders said.

The city plans to partner with third-party grocery operators and collaborate on, among others, pricing and labor.

About La Marqueta

First established by Mayor Fiorello LaGuardia in 1936, La Marqueta was designed as a permanent home to more than 400 pushcart vendors, the mayor's office said, adding it quickly became an essential food hub for East Harlem residents, serving more than 25,000 patrons a day, and becoming a model LaGuardia used across the city.

The mayor's office said a city-run grocery store at La Marqueta is expected to serve as a boon to an East Harlem community long plagued by affordability issues, with nearly 38% of households having received public assistance, or SNAP, in the past year, and 59% of households being unable to afford basic needs.

Praise for Mamdani's selection

"This means access to affordable, healthy food that is hopefully culturally relevant," City Councilwoman Elsie Encarnacion said.

"Food is a basic human right and no one should have to work more than one job to afford to put dinner on the table. No child should go hungry and no parent should have to worry about where the next meal will come from," Councilman Yusef Salaam said.

"As the Administration seeks ways to lower the cost of groceries for New Yorkers, we look forward to working with it to make sure these stores deliver for families and workers alike," added Stuart Appelbaum, president of the Retail, Wholesale and Department Store Union.

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=296763317a51cab90faa73f1bb146d5c'; 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(); } }); }); }); });