91³Ô¹ÏÍø

Watch CBS News

California law allowing people to cook, sell food from homes getting statewide push

A home-based food movement has been heating up in California, with home cooks turning their beloved family recipes into small businesses. 

When most people get laid off, they update their résumés. James Houlahan preheated his oven.

"It's pretty brutal, and since nobody's hiring, I just figured I need to make a job for myself," he said.

So the San Francisco Bay Area resident went back to a family recipe and decided to take a risk, with a whisk. He started making pavlovas, a light, meringue-based Australian dessert, crisp on the outside and soft in the middle.

"It's something my mom and I always joked about whenever we'd bring a pav to a party, this thing kills," Houlahan said. "So we figured, someone's gotta make a business out of this."

So he did, out of his own kitchen in Alameda. 

And that's not a loophole. , allows people to cook and sell food right out of their homes. Since then, more than 1,000 of these home kitchens have opened across California, operating under a growing but still patchwork system.

There are rules: food must be made from scratch and sold the same day. Not every county is on board, but there is now a push to expand it statewide.

Roya Bagheri, the executive director of , the nonprofit behind MEHKO, said the law is gaining momentum across the country as other states consider their own versions. 

"The cost of getting something like a food truck or a brick and mortar restaurant is so high, this creates an access to enter the food industry," she said.

A study by the group showed more than a third of home kitchen operators have used MEHKO as a stepping stone into something bigger.

But for some, the law is still a little undercooked. Jot Condie, president and CEO of the , warned that some counties may not have the resources to take it on.

"If they don't have the budget, there may not be a rigorous inspection procedure, and that is a huge concern for us," Condie said.

As for Houlahan, he's betting on his own kitchen and his mother's name: . And his customers, like Flora Tso, are already sold.

"Nowadays it just gives us more choice," she said.

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(); } }); }); }); });