BH Exterior & Design Logo

Utah's Stucco Experts

Welcome to BH Exterior & Design, your premier partner for stucco repairs. With years of experience in stucco repair, we provide high-quality services to maintain and enhance your home's exterior. Serving areas including Salt Lake City, Provo, Santaquin, and more, we specialize in addressing cracks, holes, and cosmetic repairs to ensure your stucco looks and performs its best.

Mike Butler and Spencer Townsend

Decades of Experience

Utah's Best Stucco Repair Team

Our years of experience in stucco repair equip us with a deep understanding of how to maintain and enhance the durability and beauty of your home. Whether you're dealing with cracks, holes, or need a complete stucco overhaul, our dedicated team combines the latest technology with time-tested craftsmanship to deliver top-notch results.

Mike Butler

Lead Contractor

Spencer Townsend

General Contractor

Our Work

Exterior Design Project 1

Modern Facade

Complete exterior renovation

Exterior Design Project 2

Elegant Entrance

Custom door and siding installation

Exterior Design Project 3

Rustic Charm

Stone veneer and timber accents

Before & After

Before and After - Draper Stucco Restoration

Why Choose BH Exterior & Design?

Decades of Experience

Trust our deep knowledge as stucco contractors.

Advanced Techniques

We use the latest methods to ensure long-lasting repairs.

Comprehensive Solutions

From minor cracks to major repairs, we handle it all.

Boost Home Value

Enhance your property's curb appeal with professional stucco repairs.

Serving the Following Areas

Our Services

Stucco Repair

Expert repair of cracks, holes, and other stucco damages.

Stucco Installation

High-quality stucco installation for repairs, renovations, or remodels.

Exterior Stucco Painting

Professional stucco painting to revitalize your home's exterior.

Stucco Crack Repair

Addressing and repairing cracks to maintain structural integrity.

Stucco Maintenance

Routine maintenance to keep your stucco in top condition.

Stucco Contractors

Licensed and experienced contractors for all your stucco needs.

385-526-2015 Book Bid

Not Sure Where to Start? We're Here to Guide You

Feeling overwhelmed about your home's stucco repairs? You're not alone. Many homeowners call us saying:

"I don't know where to start."

"I'm not sure what needs to be done."

"I have no idea about the costs involved."

That's where our expertise comes in. We're not just contractors – we're your consultants and advisors throughout the entire process.

Initial Consultation

We listen to your needs and concerns, providing expert advice on where to start.

3D Visualization

Using just a few smartphone photos, we create a scaled 3D model of your home.

Interactive Design Process

Experiment with colors, textures, and materials in real-time.

The BH Exterior & Design Difference

Trusted Expertise

Lean on our years of experience in stucco fixing and repairing.

Tailored Solutions

We understand that every home and homeowner is unique.

Avoid Costly Mistakes

Our thorough planning process ensures satisfaction with the end result.

Boost Home Value

Make informed decisions that enhance your property's curb appeal and value.

Ready to Start Your Home's Stucco Repair?

Don't let uncertainty hold you back. With BH Exterior & Design, you have a partner you can trust from start to finish.

Book Bid

Client Testimonials

"

BH Exterior and Design helped us with every step of our stucco repair in Draper & exceeded our expectations. The process seemed very daunting when trying to figure out the order of repairs. They consulted with us on the timeline, were there to answer questions, and made sure we were happy all along the way. The repair was meticulously done and aesthetically appealing as all the pieces came together.

★★★★★

A. Baker, Draper

★★★★★

"I recommend BH Exterior and Design 100%. I used them for stucco repairs in Lehi. They did a great job on our exterior and were honest, did great work, and delivered on time. Hands down, the best contractor I've worked with. I'll definitely use them again for my next project."

- Chris, Lehi

★★★★★

"BH Exterior and Design did an amazing job on my stucco repair. I am so pleased with their work. They helped me with the remodel and addition on my home in Lehi. They are also my go-to for any exterior needs. The staff is friendly and respectful. Highly recommended! You will not be disappointed with their work."

- Clinton Noyes, Lehi

<script> (function() { // ============================================================================ // LEO Page Builder - Iframe Communication Script // ============================================================================ // This script handles postMessage communication for the LEO page builder system. // // IMPORTANT: Origin-Based Message Routing // ======================================== // There are TWO iframe communication systems in LlamaPress that both use // { source: 'leonardo' } messages: // // 1. LEONARDO (Full App Builder) - localhost:8000 -> localhost:3000 // - Parent: LlamaBot/FastAPI at localhost:8000 // - Child: Rails app at localhost:3000 // - message_handler.js handles these (cross-origin) // // 2. LEO (Page Builder) - localhost:3000 -> localhost:3000 // - Parent: /pages/:id/chat at localhost:3000 // - Child: /pages/:id/preview at localhost:3000 (THIS PAGE) // - THIS SCRIPT handles these messages (same-origin) // // We distinguish between them by checking event.origin: // - Same-origin (localhost:3000) = Leo -> respond HERE // - Cross-origin (localhost:8000) = Leonardo -> ignore here, let message_handler.js handle it // ============================================================================ // DEBUG: Log when this script runs console.log("[page.html.erb] Script starting, will set view_path to: app/views/pages/home.html.erb"); // Wrap in IIFE to avoid global scope pollution and redeclaration errors if (window.leonardoScriptLoaded) { console.log("[page.html.erb] Already loaded, skipping"); return; } window.leonardoScriptLoaded = true; // Set page metadata from server-side variables (injected above) // These come from Rails @view_path which contains the actual view file path window.page_loaded_at = 1790031249.8983111; window.request_path = "/"; window.view_path = "app/views/pages/home.html.erb"; console.log("[page.html.erb] Set window.view_path =", window.view_path); // Initialize full_html on DOMContentLoaded window.addEventListener('DOMContentLoaded', () => { window.full_html = document.documentElement.outerHTML; console.log("[page.html.erb] Page metadata initialized:", { request_path: window.request_path, view_path: window.view_path, page_loaded_at: window.page_loaded_at }); }); // Also set full_html immediately if DOM is already loaded if (document.readyState === 'loading') { // DOMContentLoaded hasn't fired yet, wait for it } else { // DOM is already loaded window.full_html = document.documentElement.outerHTML; console.log("[page.html.erb] Page metadata initialized (DOM already loaded):", { request_path: window.request_path, view_path: window.view_path, page_loaded_at: window.page_loaded_at }); } window.addEventListener("message", (event) => { // Only process messages with source 'leonardo' if (event.data.source !== 'leonardo') { return; } // CRITICAL: Only respond to SAME-ORIGIN messages (from Leo chat at localhost:3000) // Cross-origin messages (from Leonardo at localhost:8000) are handled by // message_handler.js (loaded via importmap in application.js), not here. // This prevents duplicate responses and ensures correct view_path values. if (event.origin !== window.location.origin) { console.log("[page.html.erb] Ignoring cross-origin message (handled by message_handler.js):", event.origin); return; } console.log("[page.html.erb] Processing same-origin message from Leo:", event.data); // Handle element selector commands if (event.data.type === 'enable-element-selector') { window.enableElementSelector(); return; } if (event.data.type === 'disable-element-selector') { window.disableElementSelector(); return; } // Handle debug info request (this is the main message type Leonardo sends) if (event.data.type === 'get_debug_info') { // Ensure we have the most up-to-date HTML content window.full_html = document.documentElement.outerHTML; console.log("Sending debug info back to Leonardo:", { request_path: window.request_path, view_path: window.view_path, page_loaded_at: window.page_loaded_at }); // Validate that we have current data if (!window.request_path || !window.view_path) { console.warn("Missing request_path or view_path - page may not be fully loaded"); } event.source.postMessage({ source: 'llamapress', full_html: window.full_html, request_path: window.request_path, view_path: window.view_path, page_loaded_at: window.page_loaded_at }, event.origin); return; } console.log("Unhandled message type:", event.data.type); }); // Element Selector functionality let elementSelectorEnabled = false; let elementSelectorStyles = null; let currentHighlightedElement = null; window.enableElementSelector = function() { if (elementSelectorEnabled) return; elementSelectorEnabled = true; console.log('Element selector enabled'); // Inject styles for hover highlighting elementSelectorStyles = document.createElement('style'); elementSelectorStyles.id = 'element-selector-styles'; elementSelectorStyles.textContent = ` .element-selector-highlight { outline: 2px solid #4CAF50 !important; outline-offset: 2px !important; background-color: rgba(76, 175, 80, 0.1) !important; cursor: crosshair !important; } .element-selector-active * { cursor: crosshair !important; } `; document.head.appendChild(elementSelectorStyles); // Mark body as active document.body.classList.add('element-selector-active'); // Add event listeners document.addEventListener('mousemove', handleElementSelectorMouseMove, true); document.addEventListener('click', handleElementSelectorClick, true); }; window.disableElementSelector = function() { if (!elementSelectorEnabled) return; elementSelectorEnabled = false; console.log('Element selector disabled'); // Remove styles if (elementSelectorStyles) { elementSelectorStyles.remove(); elementSelectorStyles = null; } // Remove body class document.body.classList.remove('element-selector-active'); // Remove highlight from current element if (currentHighlightedElement) { currentHighlightedElement.classList.remove('element-selector-highlight'); currentHighlightedElement = null; } // Remove event listeners document.removeEventListener('mousemove', handleElementSelectorMouseMove, true); document.removeEventListener('click', handleElementSelectorClick, true); }; function handleElementSelectorMouseMove(event) { const target = event.target; if (!target || target.tagName === 'HTML' || target.tagName === 'BODY') { return; } // Remove highlight from previous element if (currentHighlightedElement && currentHighlightedElement !== target) { currentHighlightedElement.classList.remove('element-selector-highlight'); } // Add highlight to current target target.classList.add('element-selector-highlight'); currentHighlightedElement = target; } function handleElementSelectorClick(event) { event.preventDefault(); event.stopPropagation(); const target = event.target; if (!target || target.tagName === 'HTML' || target.tagName === 'BODY') { return; } // Extract text content for display let textContent = extractElementText(target); // Get the outerHTML for the LLM let outerHTML = target.outerHTML; // Send selected element data to parent window.parent.postMessage({ source: 'element-selector', type: 'element-selected', text: textContent, html: outerHTML }, '*'); // Visual feedback showSelectionFeedback(target); } function extractElementText(element) { // Get text content and clean it up let text = element.textContent || element.innerText || ''; text = text.trim(); // If text is too long, truncate it if (text.length > 200) { text = text.substring(0, 200) + '...'; } // If element has no text, try to describe it if (!text) { const tagName = element.tagName.toLowerCase(); const className = element.className ? `.${element.className.split(' ')[0]}` : ''; const id = element.id ? `#${element.id}` : ''; text = `${tagName}${id}${className} element`; } return text; } function showSelectionFeedback(element) { const originalOutline = element.style.outline; const originalBackground = element.style.backgroundColor; element.style.outline = '3px solid #4CAF50'; element.style.backgroundColor = 'rgba(76, 175, 80, 0.3)'; setTimeout(() => { element.style.outline = originalOutline; element.style.backgroundColor = originalBackground; }, 300); } console.log("[page.html.erb] Leo iframe communication script loaded!"); })(); </script> </body>