Swap Your Brand in Minutes

Built in Framer with a clean design system — just drop in your colors, fonts, and photos and it looks like yours

Easy to Add Video & Photos

Drop in your own footage and faces so visitors feel like they already know your community before Sunday

Don't Stress Over the Right Words

Every section tells you exactly what it needs to communicate psychologically — so you're never guessing what to write.

Interactive Parking Map

Removes one of the biggest first-visit anxieties before they even show up — they know exactly where to go

See the Success Stories that Makes us Proud

  • woman in white crew neck shirt smiling

    Kevin W.

    Strictly Clean Detailing

    “Alex did an excellent job building my website. He was easy to work with, listened to what I wanted, and customized everything to my liking. If you need someone reliable who delivers quality work, I definitely recommend him.”

    woman in white crew neck shirt smiling

    Tony Ruiz

    Legacy Renovations

    The design looks amazing, the site runs smoothly, and everything was completed on time. If you’re looking for a reliable and talented web designer, I would highly recommend Proudly Sites to anyone who’s interested in building a website!!!!

    woman in white crew neck shirt smiling

    Josh F.

    CLF Church

    "My church needed a serious messaging rebrand. Alex came in and helped define who we are trying to reach, craft the right words that speak to them, and help implement that language at every part of our process. "

Reach out and let's get a conversation going

Reach out and let's get a conversation going

Reach out and let's get a conversation going

import * as React from "react" export function useReportHeight() { React.useEffect(() => { // 1. Function to send the current scrollHeight to the Parent (Framer) const sendHeight = () => { const height = document.documentElement.scrollHeight window.parent.postMessage({ type: "reportHeight", height }, "*") } // 2. Create an observer to watch for any size changes in the body const observer = new ResizeObserver(() => { sendHeight() }) if (document.body) { observer.observe(document.body) } // 3. Initial call to set the height on first load sendHeight() return () => observer.disconnect() }, []) }