diff --git a/next.config.ts b/next.config.ts index aa1c5aa..5562fdb 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,14 +1,34 @@ import type { NextConfig } from "next"; +// The marketing landing is served as static files from /public (ported verbatim +// from lynkeduppro-landing). These rewrites reproduce the landing's vercel.json +// clean-URL routing: "/" is the React marketing home, "/1".."/19" are the static +// pages under /public/page. `beforeFiles` lets them override the app router's "/" +// (which otherwise redirects to /portal/login). +const landingRewrites: { source: string; destination: string }[] = [ + { source: "/", destination: "/index.html" }, + { source: "/thanks", destination: "/thanks.html" }, + { source: "/1", destination: "/page/index.html" }, + // "/2".."/19" -> /public/page/.html + ...Array.from({ length: 18 }, (_, i) => i + 2).map((n) => ({ + source: `/${n}`, + destination: `/page/${n}.html`, + })), +]; + const nextConfig: NextConfig = { // The SDK ships ESM/TS; let Next transpile it. transpilePackages: ["@abe-kap/appshell-sdk"], - // The browser calls the Shell BFF same-origin under /shell (so the HttpOnly - // session cookie flows). We deliberately use /shell (NOT /api) to avoid - // clobbering the existing /api/geo route. Point BFF_ORIGIN at the deployed BFF. async rewrites() { + // The browser calls the Shell BFF same-origin under /shell (so the HttpOnly + // session cookie flows). We deliberately use /shell (NOT /api) to avoid + // clobbering the /api/* route handlers (geo, and the founder checkout). const bff = process.env.BFF_ORIGIN ?? "http://localhost:4000"; - return [{ source: "/shell/:path*", destination: `${bff}/api/:path*` }]; + return { + beforeFiles: landingRewrites, + afterFiles: [{ source: "/shell/:path*", destination: `${bff}/api/:path*` }], + fallback: [], + }; }, }; diff --git a/public/app.jsx b/public/app.jsx new file mode 100644 index 0000000..8c9de00 --- /dev/null +++ b/public/app.jsx @@ -0,0 +1,93 @@ +/* global React, ReactDOM, Nav, Hero, Manifesto, TrustMarquee, LiveMetrics, SpecSheet, CoreFeatures, ConnectedOps, MobileSection, Analytics, FieldIntelligence, Testimonials, Pricing, FinalCTA, Footer */ + +const { useEffect, useRef, useState } = React; + +function App() { + const glowRef = useRef(null); + const progressRef = useRef(null); + + useEffect(() => { + // Cursor glow follower + const onMove = (e) => { + if (glowRef.current) { + glowRef.current.style.left = e.clientX + "px"; + glowRef.current.style.top = e.clientY + "px"; + } + }; + window.addEventListener("mousemove", onMove); + + // Scroll progress + const onScroll = () => { + if (progressRef.current) { + const h = document.documentElement.scrollHeight - window.innerHeight; + const pct = h > 0 ? (window.scrollY / h) * 100 : 0; + progressRef.current.style.width = pct + "%"; + } + }; + window.addEventListener("scroll", onScroll, { passive: true }); + + return () => { + window.removeEventListener("mousemove", onMove); + window.removeEventListener("scroll", onScroll); + }; + }, []); + + // Build particle set once + const particles = React.useMemo(() => { + return Array.from({ length: 26 }, (_, i) => ({ + id: i, + left: Math.random() * 100, + delay: Math.random() * 18, + dur: 18 + Math.random() * 22, + size: 1 + Math.random() * 2.5, + opacity: 0.3 + Math.random() * 0.6, + })); + }, []); + + return ( +
+
+
+
+ {particles.map(p => ( + + ))} +
+
+
+ +
+ ); +} + +ReactDOM.createRoot(document.getElementById("root")).render(); diff --git a/public/features.jsx b/public/features.jsx new file mode 100644 index 0000000..9d241da --- /dev/null +++ b/public/features.jsx @@ -0,0 +1,649 @@ +/* global React, Reveal, GlowCard, Icon, Sparkline, DonutChart, BlueprintHouse, Counter */ +// Features, Connected Operations, Mobile + +const FEATURES = [ + { code: "M.01", name: "AI Copilot", icon: "ai", color: "var(--cyan)", + desc: "An intelligent operator that thinks ahead, rerouting crews, flagging risk, and surfacing next best actions in real time.", + tag: "ALWAYS ON" }, + { code: "M.02", name: "Smart Scheduling", icon: "calendar", color: "var(--orange)", + desc: "Auto-organizes routes, weather, conflicts and dependencies. Suggests the perfect time, every time.", + tag: "ADAPTIVE" }, + { code: "M.03", name: "Crew Automation", icon: "crew", color: "var(--green)", + desc: "Dispatch, check-ins, and timecards run themselves. Field teams stay aligned without the chatter.", + tag: "HANDS-FREE" }, + { code: "M.04", name: "GPS Fleet Tracking", icon: "fleet", color: "var(--violet)", + desc: "Live vehicle telemetry, geofenced job zones, ETA forecasting, and route optimization at a glance.", + tag: "REAL-TIME" }, + { code: "M.05", name: "Budget Intelligence", icon: "budget", color: "var(--cyan)", + desc: "Predictive margins, automated cost capture, and instant variance alerts before they bite.", + tag: "PREDICTIVE" }, + { code: "M.06", name: "Real-time Reporting", icon: "report", color: "var(--orange)", + desc: "Production, profit, and performance, generated continuously from connected operations data.", + tag: "LIVE" }, + { code: "M.07", name: "Client Communication", icon: "chat", color: "var(--green)", + desc: "Branded portal, automated touchpoints, and a single thread per project. Nothing falls through.", + tag: "BRANDED" }, + { code: "M.08", name: "Field Intelligence", icon: "field", color: "var(--violet)", + desc: "AI-powered measurements, photo evidence, claim-ready reports and on-site decisions in minutes.", + tag: "AI VISION" }, +]; + +// ============ SPEC SHEET - six-system architecture ============= +function SpecSheet() { + const systems = [ + { code: "S.01", name: "CRM", icon: "lead", color: "var(--cyan)", desc: "Pipeline, leads & relationships" }, + { code: "S.02", name: "Canvas", icon: "doc", color: "var(--orange)", desc: "Business development" }, + { code: "S.03", name: "Measurements",icon: "target", color: "var(--green)", desc: "AI roof & site dimensions" }, + { code: "S.04", name: "Client", icon: "chat", color: "var(--violet)", desc: "Branded portals & comms" }, + { code: "S.05", name: "Billing", icon: "money", color: "var(--cyan)", desc: "Invoicing, payments, AR" }, + { code: "S.06", name: "Estimating", icon: "report", color: "var(--orange)", desc: "Proposals that close" }, + ]; + return ( +
+
+
+ +
+
+ + §04 + SPEC SHEET · CORE STACK + +

+ Six systems.
+ One intelligent CRM/ERP. +

+
+
+ // ALL CONNECTED + // ALL AUTOMATED + // BUILT TO PERFORM +
+
+
+ + +
+ + + + + + {/* Spec header bar */} +
+ LYNKEDUP PRO · TECHNICAL SPECIFICATION + SHEET 04 / 10 +
+ +
+ {systems.map((s, i) => ( + +
{ + e.currentTarget.style.transform = "translateY(-4px)"; + e.currentTarget.style.boxShadow = `0 18px 40px -16px ${s.color}99`; + }} + onMouseLeave={e => { + e.currentTarget.style.transform = "none"; + e.currentTarget.style.boxShadow = "none"; + }} + > +
+ +
+
{s.code} /
+
{s.name}
+
{s.desc}
+
+
+ ))} +
+ + {/* spec footer */} +
+ {[ + { l: "SEAMLESS COLLABORATION", d: "Office, sales reps, crews & subs aligned", c: "var(--cyan)" }, + { l: "SMARTER DECISIONS", d: "AI insights you can act on", c: "var(--orange)" }, + { l: "PROFITABLE GROWTH", d: "Close more, margin up", c: "var(--green)" }, + { l: "ZERO HANDOFF LOSS", d: "Same data layer end-to-end", c: "var(--violet)" }, + ].map(f => ( +
+
● {f.l}
+
{f.d}
+
+ ))} +
+
+
+
+
+ ); +} + +function CoreFeatures() { + return ( +
+
+
+ +
+
+ + §05 + PLATFORM CAPABILITIES + +

+ Eight modules.
+ One operating brain. +

+

+ Every module shares the same connected data layer, + so insight in one corner of the business becomes action everywhere else. +

+
+ // MODULES 01-08 +
+
+ +
+ {FEATURES.map((f, i) => ( + + +
+
+
+ +
+ {f.code} / +
+
+

{f.name}

+ {f.tag} +
+

{f.desc}

+
+
+
+ + + ))} +
+
+
+ ); +} + +// ---------------- Connected Operations ----------------- +function ConnectedOps() { + // workflow nodes positioned around central blueprint + const nodes = [ + { x: 12, y: 14, label: "Leads", icon: "lead", sub: "Auto-qualified" }, + { x: 12, y: 38, label: "Schedule", icon: "calendar", sub: "Adapts in real time" }, + { x: 12, y: 62, label: "Inspections",icon: "doc", sub: "Field-captured" }, + { x: 88, y: 14, label: "Estimates", icon: "money", sub: "Create faster" }, + { x: 88, y: 38, label: "Jobs", icon: "hammer", sub: "Every step tracked" }, + { x: 88, y: 62, label: "Invoices", icon: "report", sub: "Paid faster" }, + ]; + return ( +
+
+
+ +
+
+ + §06 + CONNECTED OPERATIONS + +

+ All your work.
+ Connected. All in one place. +

+

+ From leads to final invoice, every operational detail flows + through the same nervous system. Nothing slips through the cracks. +

+
+ // ONE SOURCE OF TRUTH +
+
+ + + +
+ {/* SVG connection lines */} + + + + + + + + + {nodes.map((n, i) => { + const cx = 50, cy = 50; + return ( + + + + + + + ); + })} + + + {/* Central wireframe house */} +
+ +
+ + {/* Central hex logo overlay */} +
+ LynkedUp Pro +
+ + {/* Workflow nodes */} + {nodes.map((n, i) => ( +
+
+
+ + {n.label} +
+
{n.sub}
+
+
+ ))} + + {/* Footer ribbon */} +
+
+ + + ONE SYSTEM · ONE SOURCE OF TRUTH + +
+
+ events / hr + · + sync + · + ● HEALTHY +
+
+
+
+
+ + {/* Outcome bar */} +
+ {[ + { icon: "clock", color: "var(--cyan)", title: "Save time", desc: "Automate the busy work and focus on what matters." }, + { icon: "target", color: "var(--orange)", title: "Reduce errors", desc: "Connected data means fewer mistakes." }, + { icon: "growth", color: "var(--green)", title: "Grow faster", desc: "Better systems. Better decisions. Bigger results." }, + ].map((o, i) => ( + +
+
+ +
+
+
{o.title}
+
{o.desc}
+
+
+
+ ))} +
+
+
+ ); +} + +// --------------- Mobile Experience ---------------- +function MobilePhone() { + return ( +
+ {/* Phone frame */} +
+
+ {/* Notch */} +
+ {/* Status bar */} +
+ 9:41 + . + ●●●● 5G +
+ + {/* App content */} +
+
+ June 23, 2026 + +
+
TODAY · 3 SCHEDULED
+ + {/* Schedule cards */} + {[ + { t: "10:00 AM", title: "Roof Inspection", sub: "123 Maple St", active: true }, + { t: "1:30 PM", title: "Estimate Review", sub: "456 Oak Ave" }, + { t: "11:00 AM", title: "Material Order", sub: "789 Pine Rd" }, + ].map((s, i) => ( +
+
{s.t}
+
{s.title}
+
{s.sub}
+
+ ))} + + {/* Bottom tabs */} +
+ {["calendar","sync","bell","pin"].map((ic, i) => ( +
+ +
+ ))} +
+
+
+
+ + {/* Side notification glows */} +
+
+
+ + NEW ALERT +
+
Diego's crew clocked in
+
456 Oak Ave · 3 min ago
+
+
+ +
+
+
+ + AI REMINDER +
+
Leave by 9:42 AM
+
Traffic on Maple St, moderate
+
+
+ +
+
+
+ + DAILY REPORT +
+
3 jobs · $12.4K
+
Generated · 4:55 PM
+
+
+ + {/* Ambient glow behind phone */} +
+
+ ); +} + +function MobileSection() { + return ( +
+
+
+
+ + + §07 + FIELD MOBILE + + + +

+ Never miss what matters.
+ Stay ahead every day. +

+
+ +

+ The LynkedUp Pro mobile companion turns your phone into a field + command center. Smart scheduling, real-time alerts, and AI reminders + keep your day on track, and your business moving forward. +

+
+ +
+ {[ + { icon: "calendar", title: "Smart scheduling", sub: "Automatically organize and adapt.", color: "var(--cyan)" }, + { icon: "bell", title: "Real-time alerts", sub: "Know what's next. Always.", color: "var(--orange)" }, + { icon: "pin", title: "Location ready", sub: "Get directions and job details in one tap.", color: "var(--green)" }, + { icon: "sync", title: "Sync everywhere", sub: "Stay aligned across your entire team.", color: "var(--violet)" }, + ].map(m => ( +
{ + e.currentTarget.style.borderColor = "var(--border-strong)"; + e.currentTarget.style.transform = "translateX(6px)"; + }} + onMouseLeave={e => { + e.currentTarget.style.borderColor = "var(--border)"; + e.currentTarget.style.transform = "none"; + }} + > +
+ +
+
+
{m.title}
+
{m.sub}
+
+
+ ))} +
+
+
+
+ + LynkedUp Pro mobile app + +
+
+
+ ); +} + +Object.assign(window, { CoreFeatures, ConnectedOps, MobileSection, SpecSheet }); diff --git a/public/hero.jsx b/public/hero.jsx new file mode 100644 index 0000000..48aeee9 --- /dev/null +++ b/public/hero.jsx @@ -0,0 +1,1091 @@ +/* global React, Logo, Counter, Reveal, GlowCard, BlueprintHouse, Sparkline, DonutChart, Icon, DimCorner */ +// Hero, Nav, Marquee, Metrics - v2 editorial / blueprint + +const { useEffect, useState } = React; + +function Nav() { + const [scrolled, setScrolled] = useState(false); + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 20); + window.addEventListener("scroll", onScroll, { passive: true }); + return () => window.removeEventListener("scroll", onScroll); + }, []); + return ( + + ); +} + +// ------------ Floating dashboard mockup ---------------- +function HeroDashboard() { + return ( +
+
+
+ +
+ +
+ +
+ +
+
+
+ + + +
+ OWNERS BOX · LIVE +
+
+ + OPS ONLINE +
+
+ +
+
+
+
GOOD MORNING, JUSTIN
+
Today's command view
+
+ This week +
+ +
+ {[ + { label: "Active Jobs", v: 27, accent: "var(--cyan)", icon: "calendar" }, + { label: "Crews Live", v: 18, accent: "var(--orange)", icon: "crew" }, + { label: "Estimates", v: 14, accent: "var(--green)", icon: "doc" }, + { label: "Revenue", v: "200K", accent: "var(--violet)", icon: "money", prefix: "$" }, + ].map(k => ( +
+
+ {k.label} + +
+
+ {k.prefix}{k.v} +
+
+ ))} +
+ +
+
+
+ SCHEDULE + TODAY +
+ {[ + { t: "10 AM", title: "Roof Inspection", sub: "123 Maple St", c: "var(--orange)" }, + { t: "11 AM", title: "Estimate Review", sub: "456 Oak Ave", c: "var(--cyan)" }, + { t: "1 PM", title: "Material Delivery", sub: "789 Pine Rd", c: "var(--green)" }, + { t: "3 PM", title: "Project Walkthrough", sub: "321 Cedar Ln", c: "var(--violet)" }, + ].map((r, i) => ( +
+ {r.t} + +
+
{r.title}
+
{r.sub}
+
+
+ ))} +
+ +
+
+
+ +
+
27
+
TOTAL
+
+
+
+
9 In progress
+
6 Scheduled
+
5 Completed
+
7 Pending
+
+
+
+
REVENUE · 7D
+ +
+
+
+
+
+
+ + +
+ + AI COPILOT +
+
Suggested action
+
+ Reroute Diego's crew to 456 Oak Ave, saves 38 min. +
+
+ + +
+ + ON TRACK +
+
+ 95.7% +
+
Workflow accuracy
+
+ + +
+ + UP NEXT · 10:00 AM +
+
Roof Inspection
+
123 Maple St · 12 min away
+
+ LIVE + CREW A +
+
+ + +
FORECAST
+
+ + +
+ +
+
+ ); +} + +function FloatingCard({ children, style = {}, size = "md" }) { + const pad = size === "sm" ? 12 : size === "lg" ? 16 : 14; + const w = size === "sm" ? 150 : size === "lg" ? 220 : 180; + return ( +
+ + + + + {children} +
+ ); +} + +// ============== COMMAND STRIP - live ops ticker ============== +function CommandStrip() { + return ( +
+
+ + OPS ONLINE + / + MK.07 · 2026.Q2 +
+
+
+ {[ + ["CREW A", "→ 123 MAPLE ST", "var(--cyan)"], + ["NEXT JOB", "10:00 AM · ROOF INSPECTION", "var(--orange)"], + ["AI COPILOT", "REROUTE DIEGO'S CREW → SAVES 38 MIN", "var(--cyan)"], + ["PAYMENT", "+$8,250 · MAPLE PROJECT", "var(--green)"], + ["ESTIMATE", "ACCEPTED · $14,800", "var(--cyan)"], + ["WEATHER", "CLEAR · 72°F · WIND 4MPH", "var(--ink-2)"], + ["18 CREWS ACTIVE", "· 27 JOBS LIVE", "var(--orange)"], + ["UPTIME", "99.99% · 142MS SYNC", "var(--green)"], + ].concat([ + ["CREW A", "→ 123 MAPLE ST", "var(--cyan)"], + ["NEXT JOB", "10:00 AM · ROOF INSPECTION", "var(--orange)"], + ["AI COPILOT", "REROUTE DIEGO'S CREW → SAVES 38 MIN", "var(--cyan)"], + ["PAYMENT", "+$8,250 · MAPLE PROJECT", "var(--green)"], + ["ESTIMATE", "ACCEPTED · $14,800", "var(--cyan)"], + ["WEATHER", "CLEAR · 72°F · WIND 4MPH", "var(--ink-2)"], + ]).map((it, i) => ( + + {it[0]} + {it[1]} + + ))} +
+
+
+ EVENTS · 2,847/HR + / + SYS · GREEN +
+
+ ); +} + +// ============== PRODUCT WINDOW - clean, detailed Owners Box ============== +function HeroProduct() { + return ( +
+ {/* Title bar */} +
+
+
+ + + +
+ + lynkeduppro.app / owners-box + +
+
+ ● SYNCED +
+
+ + {/* Body: sidebar + main */} +
+ {/* Sidebar */} +
+ {/* mini logo */} +
+ + + + + + LynkedUp Pro + +
+ {[ + { l: "Owners Box", i: "field", active: true }, + { l: "Dashboard", i: "growth" }, + { l: "Projects", i: "doc" }, + { l: "Leads", i: "lead" }, + { l: "Pipeline", i: "calendar" }, + { l: "LynkDispatch", i: "fleet" }, + { l: "Canvas", i: "spark" }, + { l: "Measurements", i: "target" }, + { l: "AI Assistant", i: "ai" }, + { l: "Settings", i: "shield" }, + ].map(it => ( +
+ + {it.l} +
+ ))} +
+ + {/* Main */} +
+ {/* Top bar */} +
+
+
OWNERS BOX
+
+ Good morning, Justin +
+
+
+ This week +
J
+
+
+ + {/* KPI strip */} +
+ {[ + { l: "Appointments", v: "18", s: "Today", c: "var(--cyan)", i: "calendar" }, + { l: "Projects", v: "27", s: "In progress", c: "var(--orange)", i: "hammer" }, + { l: "Estimates", v: "14", s: "Sent", c: "var(--green)", i: "doc" }, + { l: "Revenue", v: "$200K", s: "This week", c: "var(--violet)", i: "money" }, + ].map(k => ( +
+
+ + {k.l.toUpperCase()} +
+
{k.v}
+
{k.s}
+
+ ))} +
+ + {/* Body: schedule + right column */} +
+ {/* Schedule */} +
+
+ SCHEDULE · TODAY + 4 ITEMS +
+ {[ + { t: "10 AM", title: "Roof Inspection", sub: "123 Maple St · Justin J.", c: "var(--orange)" }, + { t: "11 AM", title: "Estimate Review", sub: "456 Oak Ave · Sarah M.", c: "var(--cyan)" }, + { t: "1 PM", title: "Material Delivery", sub: "789 Pine Rd · Mike T.", c: "var(--green)" }, + { t: "3 PM", title: "Project Walkthrough", sub: "321 Cedar Ln · Justin J.", c: "var(--violet)" }, + ].map((r, i) => ( +
+ {r.t} + +
+
{r.title}
+
{r.sub}
+
+
+ ))} +
+ + {/* Right column: donut + activity + map */} +
+
+
+ +
+
27
+
+
+
+
+ In progress + 9 +
+
+ Scheduled + 6 +
+
+ Completed + 5 +
+
+ Pending + 7 +
+
+
+ +
+
+ RECENT ACTIVITY + LIVE +
+ {[ + { c: "var(--cyan)", t: "New lead added", s: "John Smith · 34m" }, + { c: "var(--orange)", t: "Estimate sent", s: "456 Oak · 1h" }, + { c: "var(--green)", t: "Payment received", s: "$8.2K · 3h" }, + ].map((a, i) => ( +
+ + {a.t} + {a.s} +
+ ))} +
+
+
+
+
+
+ ); +} + +// AI Copilot overlay - single confident card +function CopilotOverlay() { + return ( +
+ + + + +
+
+ +
+
+
AI COPILOT
+
Suggested action · 2s ago
+
+
+
+ Traffic on Maple St is moderate. Suggest leaving by 9:42 AM for your 10:00 AM inspection. +
+
+ + +
+
+ ); +} + +function UpNextOverlay() { + return ( +
+ + + + +
+ + UP NEXT · 10:00 AM +
+
Roof Inspection
+
123 Maple St · 12 min away
+
+ ● LIVE + CREW A + RES. +
+
+ ); +} + +// ============== HERO v3 - Confident Editorial ============== +function Hero() { + return ( +
+
+
+ + + + + + + +
+ {/* Section meta strip */} + +
+ + §01 + FIELD OPERATING SYSTEM + +
+ BUILD MK.07 + SOC 2 TYPE II + + 99.99% UPTIME + +
+
+
+ +
+ {/* LEFT - editorial column */} +
+ + + AI CONSTRUCTION OPERATING SYSTEM + + + + +

+ One platform.
+ Every job.
+ + Zero + + drag. + + + +

+
+ + +

+ The AI command center for modern construction. Connect crews, + projects, scheduling, budgets, the customer portal, and field + intelligence in a single seamless ecosystem. It's your assistant + that never sleeps or takes a day off. +

+
+ + + +
+ 4.9★ · 248 reviews +
+
+
+ + {/* RIGHT - product stage */} +
+ {/* Ambient glows */} +
+
+ + {/* Half wireframe house behind */} +
+ +
+ + {/* Floor reflection plate */} +
+ + +
+ LynkedUp Pro dashboard + + + + {/* Stage signature plate */} +
+ OWNERS BOX · v7.1 +
+ + {/* Vertical mono rail beside the product */} +
+ {["▴","|","|","◆","|","|","▾"].map((c, i) => ( + {c} + ))} +
+
+
+
+
+ + {/* Bottom stat strip */} + +
+ {[ + { v: "2,000+", l: "Operators on platform", c: "var(--cyan)" }, + { v: "98.7%", l: "Workflow accuracy", c: "var(--green)" }, + { v: "65%", l: "Faster delivery", c: "var(--orange)" }, + { v: "24/7", l: "AI ops monitoring", c: "var(--violet)" }, + ].map((s, i) => ( +
+
{s.v}
+
{s.l}
+
+ ))} +
+
+
+
+
+
+ ); +} + +// ============== MANIFESTO ============== +function Manifesto() { + return ( +
+
+ +
+
+ + §02 + THESIS + +
+ WHY LYNKEDUP PRO +
+
+
+
+

+ Construction runs on five tools,{" "} + four spreadsheets,
+ and a whiteboard. We replaced all of it with{" "} + one operating brain. +

+
+ {[ + { n: "01", t: "Connected by design", d: "Every action across CRM, jobs, billing and field flows through the same data layer in real time." }, + { n: "02", t: "Intelligent by default", d: "The AI Copilot watches every workflow and suggests the next best action, before you know you need it." }, + { n: "03", t: "Built for the field", d: "Engineered with the operators using it. Roofers, contractors, infrastructure teams, not desk-bound PMs." }, + ].map(p => ( +
+ {p.n} / +
{p.t}
+
{p.d}
+
+ ))} +
+
+
+ +
+
+ ); +} + +// ============== BLUEPRINT MARQUEE - uses dim tags ============== +function TrustMarquee() { + const items = [ + { t: "BUILT FOR ROOFING", d: "18′-7″" }, + { t: "ENTERPRISE GRADE", d: "12′-3″" }, + { t: "AI-POWERED OPS", d: "MK.07" }, + { t: "SOC 2 TYPE II", d: "CERT.04" }, + { t: "REAL-TIME SYNC", d: "142 MS" }, + { t: "4,000+ PROJECTS", d: "Q2.26" }, + { t: "TRUSTED BY FIELD TEAMS", d: "v7.1" }, + { t: "ZERO DOWNTIME", d: "99.99%" }, + { t: "BUILT BY ROOFERS", d: "EST.21" }, + ]; + return ( +
+
+ {[...items, ...items, ...items].map((it, i) => ( + + + {it.t} + {it.d} + + + + ))} +
+
+ ); +} + +// ============== LIVE METRICS v2 ============== +function LiveMetrics() { + // Projects-managed counter: starts at 3,000 on launch and ticks up 1 per day. + const LAUNCH_MS = Date.UTC(2026, 6, 7); // 2026-07-07 + const projectsManaged = 3000 + Math.max(0, Math.floor((Date.now() - LAUNCH_MS) / 86400000)); + const metrics = [ + { v: projectsManaged, suffix: "+", label: "PROJECTS MANAGED", sub: "Across enterprise contractors, and growing", icon: "shield", color: "var(--cyan)", code: "M.01" }, + { v: 98.7, suffix: "%", decimals: 1, label: "WORKFLOW ACCURACY", sub: "Connected data, fewer errors", icon: "target", color: "var(--green)", code: "M.02" }, + { v: 65, suffix: "%", label: "FASTER JOB DELIVERY", sub: "Vs. legacy spreadsheets & CRMs", icon: "growth", color: "var(--orange)", code: "M.03" }, + { v: 24, suffix: "/7", label: "AI OPS MONITORING", sub: "Always-on field intelligence", icon: "ai", color: "var(--violet)", code: "M.04" }, + ]; + return ( +
+
+
+ +
+
+ + §03 + LIVE METRICS · STREAMING + +

+ Field teams choose precision. +

+
+ + STREAM · 142 MS + +
+
+
+ {metrics.map((m, i) => ( + + +
+
+ {m.code} / + +
+
+ +
+
{m.label}
+
{m.sub}
+
+
+ + + ))} +
+
+
+ ); +} + +Object.assign(window, { Nav, Hero, Manifesto, TrustMarquee, LiveMetrics }); diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..bfcb285 --- /dev/null +++ b/public/index.html @@ -0,0 +1,99 @@ + + + + + +LynkedUp Pro - AI Construction Operating System + + + + + + + + + + + +
+ + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + + + + + + + + + + + diff --git a/public/page/10.html b/public/page/10.html new file mode 100644 index 0000000..435eec0 --- /dev/null +++ b/public/page/10.html @@ -0,0 +1,543 @@ + + +LynkedUp Pro - Know Exactly Where Every Job Stands, Right Now + + + + + + +
+
+
+
+
Projects · Stages · Estimates · Budget
+

Right Now, One Job
Is Over Budget.
Do You Know Which?

+

Which jobs are stalled at estimate? Which ones are bleeding margin? Without a live projects view, you find out too late, after the job closes and the money's already gone. LynkedUp Pro is your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews +
+
+ Full stage pipeline + Live budget per job + Estimate status tracking +
+
+
6
Pipeline stages tracked
+
4
Estimate statuses (live)
+
Live
Budget vs actual per job
+
1-click
PDF estimate download
+
+
+ +
+
+
+
+
The Problem
+

The Margin Was Gone
Before the Job Was Even Finished.

+

Most roofing software shows you a pipeline. LynkedUp Pro shows you the full financial picture of every job in real time, so problems surface before they cost you.

+
+
🗂️

Estimates Stalling Invisibly

A rep sent a draft 5 days ago. Has the homeowner seen it? Approved it? Rejected it? Without status tracking you find out when it's too late.

Cost: Jobs lost to follow-up gaps
+
💸

Jobs Going Over Budget Silently

Team cost, commissions, and material spend accumulate with no warning. By the time you notice the margin is gone, the job is already complete.

Cost: Margin erosion per job
+
📋

Stage Confusion Across the Team

Your sales rep thinks the job is at "appointment scheduled." Your manager thinks it's at "estimate sent." Your admin thinks it's still a lead. No one knows what's actually happening.

Cost: Coordination overhead daily
+
+
+
+ + +
+
+
+
+
+
+ + Every day without live tracking is a day you're flying blind +
+

Your Jobs Are Running.
Are You Running Them
or Are They Running You?

+

Right now, somewhere in your active jobs, a material order just pushed a budget over the edge. An estimate has been sitting unread for 4 days. A stage hasn't moved in a week. You don't know - but you should.

+ +
+
+
3-5
+
Jobs over budget unnoticed / month
+
+
+
4 days
+
Avg estimate sitting unread
+
+
+
$0
+
Margin warning without LynkedUp
+
+
+ +
+ Free 30-min demo + No credit card + Live in 24 hrs +
+
+
+ +
+
+
+
+
The Fix
+

Catch Overruns Live.
Close Estimates Faster.
Know Every Stage.

+
+
+

LynkedUp Pro's Projects module tracks every job through a defined stage pipeline with live estimate status and a real-time budget breakdown, so you always know exactly where you stand.

+
    +
  • 🔄6-stage pipeline - Contacted → Appointment Scheduled → Estimate Sent → Approved → Job Active → Invoiced. Every stage visible to every stakeholder.
  • +
  • 📄4 estimate statuses - Draft, Sent, Approved, Rejected. One-click PDF download. Customer signs digitally on the spot.
  • +
  • 💰Live budget per job - team cost, commission, actor cost, material cost all tracked in real time against project budget. Margin warning before it's gone.
  • +
  • 👤Role-based visibility - reps see their jobs, managers see their team, owners see everything. Right data to the right person.
  • +
+
+
6
Defined pipeline stages
+
4
Live estimate statuses
+
Live
Budget vs spend tracking
+
PDF
One-click estimate export
+
+ +
+ +
+ LynkedUp Pro Overview Dashboard +
+
+
+
+ + +
+
+
+
+
+
+ + Your margin doesn't vanish overnight - it leaks $50 at a time +
+

See the Leak Before
It Becomes a Loss.

+

LynkedUp Pro flags budget overruns the moment your material spend hits 80% of budget, not after the job closes. Three caught overruns a month is thousands back in your pocket.

+ +
+
+
Without LynkedUp
+
After close
+
When you find out the job lost money
+
+
vs
+
+
With LynkedUp Pro
+
Live alert
+
At 80% budget - while you can still act
+
+
+ +
+ Live budget alerts + All 6 pipeline stages + Free onboarding +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ +
+
+
+
+
Real Impact
+

He Caught 3 Overruns
in One Month. That's Real
Money Back.

+
+
/bin/sh
Budget Surprises
+
★★★★★
+

"Before LynkedUp Pro I was finding out jobs went over budget after they were done. Now the system flags it live. The minute our material spend hits 80% of budget I get a notification. We caught three jobs in the last month before they went negative. That's real money."

+
+
JR
+
Jason Rodriguez
Owner · Plano, TX
+
+ * +
+
+
+ +
+
+
+
+
📊 Every job. Every stage. Every dollar. Live.
+

Every Job on Your Board
Deserves a Live Number.
Not a Gut Feeling.

+

See the full Projects module - stages, estimate tracking, and live budget breakdown - in a free 30-minute demo.

+ +
✅ No credit card✅ 30-day guarantee✅ Free onboarding
+
+
+

© 2026 LynkedUp Pro · Full Platform →

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/11.html b/public/page/11.html new file mode 100644 index 0000000..700c7de --- /dev/null +++ b/public/page/11.html @@ -0,0 +1,560 @@ + + + + + + + + +LynkedUp Pro - Stop Losing Jobs to Double-Bookings and No-Shows + + + +
+
+
+
+
Smart Calendar · AI Scheduling · Field Intelligence
+

The Appointment
Was There. Your Rep
Wasn't. Job Gone.

+

Double-bookings. Late arrivals. Reps walking in blind. Every scheduling failure hands a job to your competitor, and the homeowner never calls you back. It's your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews +
+
+ Syncs iOS, Google, Calendly + AI suggests best times + 98% on-track rate +
+
+
98%
On-track rate this week
+
3
Calendars synced in real-time
+
0
Double-bookings since launch
+
AI
Suggests optimal windows
+
+
+
+
+
+
+
The Problem
+

2-3 Lost Jobs a Month.
Same Cause Every Time.

+

It's never the product. It's never the price. It's the rep who was late, double-booked, or walked in with nothing to say. Scheduling failures are silent revenue killers, and they're completely preventable.

+
+
📅

Double-Bookings

Rep A and Rep B both confirm the same homeowner for different times. The homeowner gets two calls, loses confidence in your operation, and calls someone else.

Cost: 1-2 leads lost per week
+
👻

No-Shows and Late Arrivals

Rep doesn't check traffic, gets stuck, shows up 30 minutes late with no warning. Homeowner already moved on. You don't find out until the job's gone.

Cost: Referral reputation damage
+
🗒️

Reps Without Context

Rep shows up to a homeowner meeting with no notes on the property, the previous conversation, or the damage assessment. Starts from scratch in front of the customer.

Cost: Lower close rate on every visit
+
+
+
+ +
+
+
+
+
+
+ + Every missed appointment has a price tag +
+

That Missed Appointment
You Didn't Follow Up On?
It Was Worth $12,000.

+

At an average job size of $12,000, losing 2-3 appointments a month isn't a scheduling inconvenience. It's $24,000-$36,000 in annual revenue walking out the door. Let's close that gap in one demo.

+ +
+
+
2-3
+
Jobs lost per month to scheduling
+
+
+
$12K
+
Avg roofing job value
+
+
+
$36K
+
Lost revenue per year
+
+
+ +
+ Free 30-min demo + No credit card + Set up same day +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ +
+
+
+
+
The Fix
+

On Time. Every Time.
With Everything
They Need to Close.

+
+
+

LynkedUp Pro's smart calendar syncs your whole team, prevents conflicts automatically, and nudges reps with AI suggestions, traffic, timing, job context, before they even ask.

+
    +
  • 🔄Real-time two-way sync - iOS Calendar, Google Calendar, and Calendly all stay in sync automatically. One source of truth for your entire team.
  • +
  • 🧠AI-suggested windows - suggests optimal times, avoids back-to-back gaps, and checks traffic before recommending when your rep should leave.
  • +
  • 📋Full context per appointment - every rep sees the homeowner notes, damage photos, previous conversations, and property details before they arrive.
  • +
  • 🛡️You stay in control - every AI suggestion is a nudge, not an override. You approve every change. No automation you didn't ask for.
  • +
+
+
98%
On-track rate in beta
+
3
Calendar integrations
+
AI
Traffic-aware suggestions
+
0
Double-bookings
+
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+ +
+
+
+
+
+
+ + The rep who shows up prepared wins the job +
+

Context Closes.
Showing Up Blind
Doesn't.

+

LynkedUp Pro feeds every rep the homeowner's damage history, previous conversations, and property notes before they knock. When your rep walks in knowing more than the homeowner expects, they close.

+ +
+
+
Without LynkedUp
+
Walks in blind
+
No notes. Starts from scratch.
Homeowner senses it.
+
+
vs
+
+
With LynkedUp Pro
+
Walks in ready
+
Full context. Feels like a
trusted advisor. Closes.
+
+
+ +
+ iOS, Google & Calendly sync + AI-suggested windows + Full context per appointment +
+
+
+ +
+
+
+
+
Real Result
+

His Reps Stopped
Missing Appointments.
Close Rate Up 43%.

+
+
+43%
Close Rate
+
★★★★★
+

"The AI calendar suggestions changed everything for my team. Reps never miss appointments, they always show up with context about the property, and the route nudges actually help them plan smarter days. Within 60 days our close rate jumped 43%. The calendar alone drove most of that."

+
+
JR
+
Jason Rodriguez
Owner · Dallas, TX · 14-person crew
+
+ * +
+
+
+
+
+
+
+
📅 The average roofing crew loses 2-3 jobs/month to scheduling failures
+

Your Next Missed
Appointment Is Already
On the Calendar.

+

See the smart calendar in action - synced, AI-powered, and built to stop your best leads from signing with someone else first.

+ +
✅ No credit card✅ 30-day guarantee✅ Works with your existing calendar
+
+
+
+

© 2026 LynkedUp Pro See Full Platform Privacy  ·  Terms

+

$349/mo flat rate · No credit card required · 30-day money-back guarantee · Built for roofing

+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/12.html b/public/page/12.html new file mode 100644 index 0000000..bc891c9 --- /dev/null +++ b/public/page/12.html @@ -0,0 +1,635 @@ + + + + + + + + +LynkedUp Pro - Stop Losing Jobs When Hail Hits + + + + + + +
+
+
+
+
+
+
+
Storm Intelligence · Real-Time Hail Alerts
+

While You Check
the Weather App,
They Sign Contracts.

+

By the time you hear about a hail event, the best crews in your market have knocked 40 doors and signed 10 contracts. LynkedUp Pro puts you there first - your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews +
+
+ Sub-hour hail alerts + 🗺️ AI address scoring + 30-day guarantee +
+
+
17 min
Storm alert → reps on doors
+
89
Addresses scored per event
+
11
Contracts signed same day
+
1st
On scene before competition
+
+
+ + +
+
+
+
+
The Problem
+

Second Place
After a Storm Is
Worth $0.

+

It's not about effort. It's about intelligence. The crews winning after every storm have one thing you don't. They know about it first.

+
+
+
🌩️
+

You Hear About It Late

+

Weather apps, neighbor texts, news alerts. By the time you piece it together, the storm swath is already being worked. You're not slow, you're uninformed.

+ Cost: 3-5 lost jobs per storm +
+
+
🗺️
+

No Map, No Priority

+

Even when you know it hailed, which street do you hit first? Without damage scoring, your reps knock random doors while competitors work the worst-hit blocks.

+ Cost: Wasted canvassing hours +
+
+
🚗
+

Reps Route Themselves

+

No dispatch. No territory assignment. Reps show up wherever they feel like, overlap each other, miss entire neighborhoods, and leave money on the ground.

+ Cost: Hundreds of doors unmissed +
+
+
+
+ + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + +
+
+
+
+
+
+ + Right now, somewhere in your territory +
+

Hail Fell.
Is Anyone
Moving?

+

A competitor using LynkedUp Pro already has the swath mapped, the top addresses scored, and three reps auto-routed to the highest-damage doors. The window to be first is 17 minutes. Not hours.

+
<1hr
Alert to reps deployed
17 min
Avg storm → dispatch
11
Contracts same day
89
Addresses scored
+ +
+ No credit card + Free 30-min demo + 30-day guarantee +
+
+
+ +
+
+
+
+
The Fix
+

17 Minutes.
Reps Deployed.
Doors Getting Knocked.

+
+
+

LynkedUp Pro pulls storm data from HailTrace and HailWatch the moment a hail event is detected. Every address in the impact zone gets an AI damage score. Your reps get their route.

+
    +
  • 📡Dual-source hail data. HailTrace + HailWatch fusion means you never miss an event in your territory, day or night.
  • +
  • 🎯AI address scoring. Every home ranked HIGH / MED / LOW by hail severity. Your reps hit the best doors first, every time.
  • +
  • 📲Auto-dispatch to field. Optimized canvassing routes pushed directly to your reps' phones within minutes of a storm ending.
  • +
  • 📎LiDAR scan on arrival. Rep deploys drone, AI builds digital twin and flags every impact zone in under 4 minutes. Proposal ready before competitors arrive.
  • +
+
+
<1 hr
Alert to reps deployed
+
89
Addresses scored per storm
+
2
Storm data sources fused
+
$0
Extra cost for hail intel
+
+
+ +
+ LynkedUp Pro Overview Dashboard +
+
+
+
+ + +
+
+
+
+
Real Result
+

Alert at 2:14PM.
11 Contracts
Before Dark.

+
+
17 min
Storm→Doors
+
★★★★★
+

"Alert fired at 2:14 PM. My three reps were knocking doors by 2:31. By end of day we had 11 signed contracts. Our closest competitor showed up the next morning. That is literally the difference this makes, and that was week one."

+
+
SA
+
Sarah Alonzo
Operations Manager · Houston, TX
+
+ * +
+
+
+ + +
+
+
+
+
⚡ The next storm in your territory could hit today
+

The Next Storm
Could Hit Today.
Will You Be First?

+

Stop losing jobs to crews who just got lucky with timing. LynkedUp Pro makes luck irrelevant.

+ +
+ ✅ No credit card✅ 30-day money-back guarantee✅ Free onboarding +
+
+
+ +
+

© 2026 LynkedUp Pro See Full Platform →Privacy  ·  Terms

+

$2000/mo flat rate · No credit card required · 30-day money-back guarantee · Built for roofing

+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/13.html b/public/page/13.html new file mode 100644 index 0000000..b39978d --- /dev/null +++ b/public/page/13.html @@ -0,0 +1,2194 @@ + + + + + +LynkedUp Pro - The #1 Roofing CRM/ERP | Storm to Signed Contract in One Platform + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

🔥  Only a Few Founding Member Spots Remaining  -  Lock in $2000/mo forever before we raise prices   + + 02: + 14: + 37: + 44 + +  Claim Your Spot → +

+
+ + +
+
+
+ +
Trusted by 500+ Texas Roofers · Built by Roofers, For Roofers
+

You Run 5 Apps.
They Run One.
That's the Gap.

+

LynkedUp Pro replaces EagleView, JobNimbus, SalesRabbit, and 2 others with one AI-powered roofing platform at a flat $2000/mo. It's your assistant that never sleeps or takes a day off. No per-report fees. No per-user charges. No excuses.

+ +
+ ✅ Free onboarding included + ✅ Cancel anytime +
+
+
$2.1M
Claims processed via platform
+
4 min
Avg scan to adjuster report
+
11
Pilot crews across Texas
+
$0
Per-report fee. Ever.
+
+
+
+
J
+
M
+
S
+
+8
+
+
4.9★ · 248 reviews
+
+
+ + +
+
+
500+Roofs Scanned
in Beta
+
11Pilot Crews
Across Texas
+
$2.1MClaims Processed
via Platform
+
4 minAvg Scan
to Report
+
$2000Flat Rate
Per Month
+
+
+ + +
+
+ Replaces & Integrates With +
+
+ QuickBooks + iOS + Android + Google Calendar + Calendly + Xactimate + EagleView + DJI Drones + HailTrace + HailWatch +
+
+
+ + +
+
+
+
+ +

3-5 Jobs Lost
Per Storm Season.
Same Reason. Every Time.

+

The average Texas roofer loses 3-5 jobs per storm season to competitors who showed up faster, scanned quicker, and filed cleaner claims. Here's why.

+
+
🌩️

Storms Don't Wait

By the time you hear about a hail event, competitors have already knocked 40 doors. Speed wins - you need alerts before the rain stops.

+
📋

EagleView Costs a Fortune

$15-$87 per report. 48-hour turnaround. Homeowners won't wait - they sign with whoever shows up with numbers first. That's revenue walking out the door.

+
🗂️

Claims Get Underpaid

Insurance adjusters reject vague reports. Without AI-annotated hail impact documentation, you're leaving tens of thousands on the table per job.

+
📅

Your Calendar Is Chaos

Double-bookings, no-shows, reps without context. Every scheduling failure is a homeowner who goes with someone else before you can get back to them.

+
+
+
+ + +
+
+
+
+
+
+ + Happening right now in your territory +
+

Hail Just Fell.
Is Anyone
Moving?

+

Right now, in a neighborhood you know, hail is on the ground. A LynkedUp Pro user already has that swath mapped, the top 89 addresses scored, and three reps auto-routed. You have 17 minutes before the window closes.

+
+
<1hr
Alert to reps in field
+
17min
Storm → dispatch time
+
11
Contracts same day
+
$2000
Flat. All in. One bill.
+
+
+ Book a demo + +
+
+ No per-report fees ever + Founders pricing locked in +
+
+
+ + +
+
+
+
+
+
+ +

6 Weapons.
One Bill.
Zero Gaps.

+

All connected. All automated. All built to perform. From the first lead to the final invoice, nothing falls through the cracks.

+
    +
  • Pipeline automations and AI insights built in from day one
  • +
  • Seamless collaboration across office, sales reps, and field crews
  • +
  • One subscription - no per-user fees, no per-report surprises
  • +
  • Built for roofing by roofers - not adapted from generic software
  • +
+ +
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+
👥

CRM

High-output CRM with pipeline automations, AI insights, and team performance tracking built for maximum results.

Pipeline · AI Insights
+
🎨

Canvas

Your all-in-one sales toolbox. Create estimates, professional proposals, and close more jobs from anywhere.

Estimates · Proposals
+
📐

Measurements

AI-powered roof measurements - accurate, fast, and claim-ready. Measure once, use everywhere across every job.

AI · LiDAR · Instant
+

Client Experience

Automated follow-ups, digital contracts, and client portals that build trust and drive referrals on autopilot.

Portals · Reviews
+
💳

Billing

Get paid faster. Invoicing, payment processing, and cash flow management that keeps every job profitable.

Invoices · Payments
+
🧮

Estimating

Material pricing, labor, margins - all pre-loaded for roofing. Turn measurements into winning proposals in minutes.

Auto-Pricing · Templates
+
+
+
+ + +
+
+
+
+ +

Stop Juggling Apps
That Don't Know
What Each Other Did.

+

From leads to final invoice, every detail connected so nothing slips through the cracks. One source of truth for your entire operation.

+
+
👤

Leads

Capture and qualify leads automatically.

+
📅

Schedule

Smart scheduling that adapts.

+
🔍

Inspections

Collect, document, and move forward.

+
💰

Estimates

Create faster. Win more.

+
📄

Proposals

Professional proposals that close.

+
🔨

Jobs

Stay on track. Every step.

+
📸

Photos

Everything in one place.

+
🧾

Invoices

Get paid faster. Keep cash flow strong.

+
+
+
⏱️

Save Time

Automate the busy work. Less admin, more productive hours out in the field where it counts.

+
🎯

Reduce Errors

Connected data means fewer mistakes. The right info at the right time, every time.

+
📈

Grow Faster

Better systems, better decisions, bigger results. Close more jobs and increase your margins.

+
+
+
+ + + +
+
+
+
+ +

Your Rep Was Late.
The Job Is Gone.
Fix It Now.

+

An optimized calendar that learns, syncs, and suggests - while you stay in control. Never miss what matters. Always know what's next.

+
+
+
+
🔄

Sync Everywhere

Real-time two-way sync with iOS, Google Calendar, and Calendly. Your whole team stays aligned without the extra effort.

+
🧠

AI Suggests Best Times

Smartly suggests optimal scheduling windows, avoids conflicts, and even checks traffic to recommend when you should leave.

+
🛡️

You Stay In Control

Nothing changes without your approval. Every suggestion is a nudge - you always make the final call, every time.

+
📍

Location Ready

Directions and job details in one tap. Real-time alerts keep field reps on track and informed all day long.

+
+
+
📱 iOS Calendar
+
📆 Google Calendar
+
🔗 Calendly
+
+
+
3
Scheduled Today
+
1
In Progress
+
98%
On Track
+
+
+
+
+ June 23, 2026 +
+ + +
+
+
+
Sun
Mon
Tue
Wed
Thu
Fri
Sat
+
+
+
1
2
3
4
5
6
7
+
8
9
10
11
10AM Inspection
12
1:30PM Estimate
13
14
+
15
16
17
18
19
20
21
+
22
+
23
10AM Roof Insp.
1:30PM Estimate
+
24
10AM Material
25
26
27
28
+
29
30
1
2
3
4
5
+
+
+
+
+
Suggested Action: Traffic is moderate. Leave now for your 10:00 AM Roof Inspection at 123 Maple St.
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Measurement Summary - Project #1286 + AI-POWERED +
+
+ + + + + + 27'-6" + + 18'-7" + + TOTAL ROOF AREA + 2,347 sq ft + 23.47 SQUARES + + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3289 SQ FT + PLANE 4256 SQ FT + PLANE 5+1,015 SQ FT + +
+
+
Planes Measured14
+
Photos Attached24
+
Scan Time3.8 min
+
Total Roof Area2,347.18 sq ft
+
+ Book a demo +
+
+ +

4 Minutes.
$0 Per Report.
Every Single Time.

+

AI-powered measurements that are accurate, fast, and claim-ready. Stop paying $15-$87 per third-party report.

+
    +
  • 🎯AI Measurements - Measure any roof in minutes with AI & LiDAR precision you can trust and take to the adjuster.
  • +
  • 📋Claim Ready - Xactimate®-style reports with full photo evidence. Adjusters accept them the first time.
  • +
  • ☁️Sync Anywhere - Access on any device, anytime. Your whole team works from the same data.
  • +
  • Instant Estimates - Turn measurements directly into accurate material estimates in seconds.
  • +
+
+
10×*
Faster than manual
+
98.6%*
AI + LiDAR accurate
+
$0
Per-report fee
+
3.8
Min avg scan time
+
+
+
+
+
+ + +
+
+
+
+ +

Every Advantage
Your Competitor
Doesn't Have Yet.

+

From the first hail alert to the signed contract and submitted claim, all in one workflow.

+
+
+
+ + AI Diagnostics +

LiDAR-Powered Digital Twin

+

Deploy a drone, walk the property - LynkedUp Pro auto-generates a centimeter-accurate 3D model of every roof in under 4 minutes. AI flags hail impacts, ridge damage, and granule loss automatically.

+
    +
  • Auto-annotated hail impact zones for adjuster reports
  • +
  • 3D measurements fed directly into estimates
  • +
  • Faster than EagleView - no 48-hour wait, no per-report fees
  • +
  • Photogrammetry + LiDAR fusion for insurance-grade accuracy
  • +
+
+
+ + Field Intelligence +

Geospatial Canvassing & Territory Maps

+

See every home in your territory on a live map - enriched with homeowner data, damage probability scores, and real-time rep tracking. Like SalesRabbit's DataGrid, but storm-aware.

+
    +
  • Live hail swath overlays on canvassing maps
  • +
  • Rep GPS tracking and territory assignment
  • +
  • Homeowner contact data enrichment per address
  • +
  • Damage probability scoring auto-updated after every storm
  • +
+
+
+
+
+ + Storm Intelligence +

Real-Time Hail & Storm Alerts

+

Get notified the moment a hail event drops in your county. Automatic territory prioritization and canvassing routes pushed to every rep's phone - before competitors even open their weather app.

+
    +
  • Sub-hour storm event notifications by county and zip
  • +
  • HailTrace and HailWatch dual-source data fusion
  • +
  • Auto-generated storm damage canvassing zones
  • +
  • Historical hail overlay for insurance documentation
  • +
+
+
+ + CRM + Estimates +

Roofing CRM with Instant Proposals

+

Manage every lead, job, and claim from one screen. AI-powered proposals with live material pricing generated on-site from your digital twin data. No copy-paste between tools.

+
    +
  • Satellite-to-proposal in under 5 minutes
  • +
  • Live material pricing with supplier integrations
  • +
  • Insurance supplement workflow built-in
  • +
  • Full pipeline from lead → signed contract → payment
  • +
+
+
+
+ Insurance Workflow +

Adjuster-Ready Reports in One Click

+

The most expensive gap in roofing software: you do the work, but the claim gets underpaid. LynkedUp Pro auto-generates adjuster reports that combine your LiDAR digital twin, AI-annotated hail impacts, and historical storm data into a single PDF - exactly what adjusters need, wired directly into your CRM and canvassing workflow.

+
+
100%*
Insurance-accepted report format
+
Auto
Hail impact annotation from AI scan
+
1-Click
Generate & send to adjuster
+
0 hrs
Manual report documentation time
+
+
+
+
+
+ + + +
+
+
+
+ +

Storm Hits.
Alert Fires.
You Win First.

+

Know about hail events before your phone rings. Hit the neighborhood while competitors are still checking the weather app.

+
+
+
+ ⚡ Storm Territory Map + 🚨 ACTIVE HAIL EVENT +
+
+
Live Storm Map - DFW Metro
+
+
+
+
+
+
+
+
+
+
⚡ New hail event detected - 3 reps notified
+
+
+ Severe hail (>1.5") + Moderate hail + Light hail + Your reps +
+
+
Addresses in storm zone247 homes
+
High-probability leads89 flagged
+
Reps auto-routed2 active
+
+
Priority Address Queue
+
📍 123 Maple St, Anytown
HIGH 94
+
📍 456 Oak Ave, Anytown
HIGH 88
+
📍 789 Pine Rd, Anytown
MED 71
+
📍 321 Cedar Ln, Anytown
LOW 42
+
+
+
+
    +
  • Real-Time Hail Alerts - Storm events fire instant notifications with impact zones mapped to your canvassing territory before competitors even open their weather app.
  • +
  • 🗺️Territory Intelligence - Every address scored by impact severity. Your reps go straight to the highest-value doors, auto-routed within minutes of a storm.
  • +
  • 🤖AI Damage Diagnosis - LiDAR drone scans build a 3D digital twin and AI-flags every hail impact in under 4 minutes - on-site, included in your subscription.
  • +
  • 📎Adjuster-Ready Reports - Auto-generated reports with full storm documentation sent directly to insurance - job done, first submission.
  • +
  • 📡HailTrace + HailWatch - Dual-source storm data fusion plus NOAA for maximum coverage. Never miss an event in your market.
  • +
+
+
4 min
AI Scan to Report
+
<1 hr
Alert to Reps in Field
+
+ +
+
+
+
+ + +
+
+
+
+ +

2:14PM Storm.
2:31PM Reps Out.
5PM: 11 Contracts.

+
+
01

Storm Detected

Hail event fires a real-time alert. Territory map auto-highlights the impact zone and scores every address by priority.

+
02

Reps Dispatched

Field reps receive optimized canvassing routes on their phone with homeowner data pre-loaded per address.

+
03

AI Scan + Measure

Rep deploys drone. LynkedUp Pro builds a digital twin and AI-flags every hail impact in under 4 minutes.

+
04

Instant Proposal

Measurements feed directly into an on-site proposal with live material pricing. Customer signs on the spot.

+
05

Claim Filed

Auto-generated adjuster report with full documentation sent to insurance. Pipeline updated. Done.

+
+
+
+ + +
+
+
+
+
+
+ + Storm to signed contract - one tool, one afternoon +
+

Your Crew Can
Do This. The Only
Missing Piece Is the Software.

+

You already have the crew, the skills, and the territory. LynkedUp Pro gives you the hail alerts, the AI scans, the instant proposals, and the adjuster reports - all connected, all on one screen, all for $2000 flat.

+
+
4 min
Scan to full report
+
$0
Per-report cost. Ever.
+
100%*
First-submission claim rate
+
5
Tools this replaces
+
+ +
+ Works on iOS & Android + Free onboarding call + Up & running in 24 hrs +
+
+
+ + +
+
+ +

Watch a Texas Crew
Go Storm to Contract
in 90 Seconds.

+

Watch how a Texas crew goes from hail alert to filed insurance claim - in one afternoon, on one platform.

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
Watch 90-Second Demo
+
Storm alert → contract signed
+
+
+
+
+
0:00
Storm alert fires
+
0:18
Rep dispatched
+
0:35
Drone scan + AI
+
1:02
Proposal signed
+
1:28
Claim filed
+
+
+
+ Book a demo → +

30-minute walkthrough with a real roofing workflow · No sales pressure

+
+
+
+ + +
+
+
+
+ +

The Real Dashboard.
Your Whole Business,
One Screen.

+

Every screen your reps, managers, and office team will use - designed for speed in the field and clarity in the office.

+
+
+
+
LynkedUp Pro
+
Owners Box
Dashboard
Projects
+
+
+
🔔
+
J
+
+
+
+
+
🏠Owners Box
+
📊Dashboard
+
🗂️Projects
+
👤Leads
+
🔀Pipeline
+
📡LynkDispatch
+
🗺️Territory Map
+
🎨Canvas
+
📐Measurements
+
💰Estimates
+
Client Experience
+
💳Billing
+
📋Team Schedule
+
📈Reports
+
🤖AI Assistant
+
⚙️Settings
+
+
+
Good morning, Justin 👋 - Here's what's happening today.
+
Owners Box
+
+
📅Appointments
18
Today
+
🏗️Projects
27
In Progress
+
📤Estimates
14
Sent
+
💵Revenue
$48,750
This Week ↑
+
+
+
+
Today's Schedule
+
10 AM
Roof Inspection
123 Maple St · Justin J.
📍
+
11 AM
Estimate Review
456 Oak Ave · Sarah M.
📍
+
1 PM
Material Delivery
789 Pine Rd · Mike T.
📍
+
2 PM
Project Walkthrough
321 Cedar Ln · Justin J.
📍
+
+
+
Recent Activity
+
New Lead Added - John Smith
34m ago
+
Estimate Sent - 456 Oak Ave
1h ago
+
Project Updated - 789 Pine Rd
2h ago
+
Payment Received - 123 Maple St
3h ago
+
⚡ Hail Event Detected - TX-Tarrant Co.
5h ago
+
+
+
+
+
+
+
+ + + +
+
+
+
+ +

Every Screen Your
Reps Use All Day.
All From One Login.

+

CRM pipeline, LiDAR scanning, mobile rep app, and adjuster reports - all from one platform on any device.

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + CRM PIPELINE - 24 ACTIVE LEADS + +
+
CRM Dashboard
Pipeline kanban, lead tracking, and real-time metrics in one view
+
+ +
+
+ + + + + + + + + + + + + + + 44.7 ft + + AI SCAN COMPLETE · 5 ZONES · 19 IMPACTS → GENERATE REPORT + + LIDAR SCAN · 3.8 MIN + +
+
LiDAR Scan + AI
3D digital twin with AI-annotated hail impact zones and measurements
+
+ +
+
+ + + + + + + + + + + + + ✓ INSURANCE APPROVED + First submission · No callback + + SEND TO ADJUSTER → + +
+
Adjuster Report
One-click insurance-grade report with AI impact zones and storm data
+
+
+
+
+ + +
+
+
+
+ +

11 Contracts.
Same Day.
Zero Competition.

+

See how LynkedUp Pro performs in the field - from post-storm canvassing runs to adjuster-ready digital twin reports.

+
+ + + +
+ + +
+
+
+ + + + + + + + + 42.3 ft + + LiDAR SCAN ✓ + +
+
+ LiDAR Digital Twin +

Denton, TX - Post-Hailstorm Roof Assessment

+

Crew deployed LynkedUp Pro after the May hailstorm hit Denton. Drone scan on 14 properties in a single afternoon. AI flagged 312 individual hail impact zones. Every adjuster report auto-generated and filed same day.

+
+
14
Roofs scanned
+
312
Hail impacts flagged
+
3.8 min
Avg. scan time
+
$0
Per-report cost
+
+
+
+
+
+ + + + + + + + + ⚡ STORM EVENT - HOUSTON NW + + 3 REPS AUTO-DISPATCHED + +
+
+ Storm Canvassing +

Houston NW - Same-Day Storm Response

+

Alert fired at 2:14 PM. Three reps were auto-routed into the storm swath by 2:31 PM. By end of day, 11 contracts signed - all before a single competitor crew arrived the next morning.

+
+
17 min
Alert → reps deployed
+
11
Contracts signed
+
89
Homes scored
+
1st
On scene - zero competition
+
+
+
+
+ + +
+
+
+

❌ Before LynkedUp Pro

+
📋
Manual spreadsheets - Leads, jobs, follow-ups scattered across Excel, texts, and sticky notes.
+
⏱️
48-hour EagleView wait - $35-$87 per report, 1-2 day turnaround. Homeowners signed elsewhere.
+
📱
5+ disconnected apps - CRM, calendar, canvassing, measurements, billing - no sync, constant errors.
+
🌩️
Missed storm windows - Heard about hail from a neighbor. Competitors already had 20 contracts.
+
📄
Manual adjuster reports - Hours of documentation per job. Claims underpaid due to missing evidence.
+
+
+

✓ With LynkedUp Pro

+
🎯
Everything connected - One source of truth across your entire team from lead to final invoice.
+
4-minute AI scan - Drone deploys, LiDAR measures, AI annotates, report generated. On-site. Included.
+
📊
6 systems, one login - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - all in sync.
+
📡
First to the door - Sub-hour hail alerts auto-route reps to scored addresses before competitors check the news.
+
One-click adjuster reports - AI + LiDAR evidence packed into insurance-accepted PDFs. First submission gets approved.
+
+
+
+ + + +
+
+ + + +
+
+
+
+ +

5 Bills. 5 Logins.
Zero Storm
Intelligence.

+

The Texas roofing market has specialized tools - but no one has connected them. Until now.

+
+
vs. EagleView
01

Real-time vs. 48-hour wait

EagleView costs $15-$87 per report and takes up to 2 days. LynkedUp Pro's LiDAR drone scan delivers the same accuracy in under 4 minutes, on-site, included in your subscription.

+
vs. SalesRabbit
02

Storm-aware vs. generic canvassing

SalesRabbit's DataGrid shows homeowner data - but has no idea a hail event just happened two blocks over. LynkedUp Pro canvassing maps auto-reprioritize territories the moment a storm hits.

+
vs. JobNimbus / Roofr
03

Field-first vs. office-first

JobNimbus is a great office CRM. Roofr is a great measurement tool. Neither was built for a rep standing in a hail-damaged neighborhood needing a scan, estimate, and signed contract in 30 minutes.

+
vs. Loveland IMGING
04

Full workflow vs. inspection-only

Loveland/IMGING builds excellent drone digital twins for insurance inspections. But it stops there. LynkedUp Pro connects the drone scan directly into your CRM, canvassing, proposal, and claim workflow.

+
vs. RoofLink
05

AI-native vs. feature-patched

RoofLink is a solid Texas-based all-in-one. But it was built before LiDAR drones and storm-data APIs. LynkedUp Pro is architected from the ground up for AI diagnostics and geospatial intelligence.

+
vs. HailTrace
06

Intelligence + action, not just data

HailTrace gives you excellent hail maps. LynkedUp Pro takes that map and automatically routes your reps, scores every address, and triggers your canvassing workflow - no copy-paste required.

+
+
+
+ + +
+
+ +

Column by Column.
Win by Win.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp Pro ✦JobNimbusAccuLynxEagleViewRoofrSalesRabbit
Roofing-specific CRM~~
AI Roof Measurements (Built-In)~
Smart Calendar + AI Suggestions~~
Real-Time Hail Alerts~
LiDAR / Drone Digital Twin~
Adjuster-Ready Auto Reports~~
Storm Territory Canvassing Map~~~
Proposals + Digital Signatures
Owners Box Command Center
Flat-Rate Pricing (No Per-User Fees)~
Built Exclusively for Roofers~~~
+
+

✓ = Included    ~ = Partial or add-on cost    ✗ = Not available. Data based on publicly available information as of 2026. JobNimbus starts at $300/mo; AccuLynx estimated $60-$120/user/mo + $500-$5,000 onboarding fees. EagleView charges $15-$87 per report.

+
+
+ + +
+
+
+
+ +

Move the Sliders.
Watch $1,000+
Come Back.

+

Move the sliders and watch your current tool costs vs. LynkedUp Pro flat-rate pricing. The math usually surprises people.

+
+
+

Your Current Monthly Costs

+
Roof Reports / Month20 reports
+
Cost Per Report (EagleView avg)$35 / report
+
Current CRM Cost$300 / mo
+
Canvassing / Dispatch Tool$150 / mo
+
Field Team Size8 users
+
+
Your Current Monthly Stack
+
Report Fees (EagleView)$700
+
CRM Platform$300
+
Canvassing Tool$150
+
Per-User Tool Costs$200
+
Total Monthly Cost$1,350
+
+
+
+

With LynkedUp Pro at $2000/mo

+
+
$1,001
+
Monthly savings vs. your current stack
+
+
+
Annual Savings
$12,012
+
Payback Period
~9 days
+
3-Year Total Saved
$36,036
+
LynkedUp Pro Cost
$2000/mo
+
+
+ Lock In Your Savings → +

No contracts · Cancel anytime · Full onboarding included

+
+
+
+
+
+ +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+
+
+ +

+43% Close Rate.
$2,100 Saved.
11 Contracts in a Day.

+

Real crews. Real numbers. Real Texas storm seasons.

+
+ +
+ * +
$2.1K
Saved / Month
+
★★★★★
+
"I cut EagleView, JobNimbus, and SalesRabbit all in one move. LynkedUp Pro replaced all three for less money - and the measurements are actually better. Every insurance claim gets approved on the first submission now."
+
+
MT
+
+
Marcus Thompson
+
Operations Manager · Fort Worth, TX
+
+
+
+
+ * +
17 min
Storm → Reps Out
+
★★★★★
+
"The hail alert fired at 2:14 PM. By 2:31 PM my three reps were already on doors in the impact zone. By EOD we had 11 signed contracts. Our closest competitor showed up the next morning. That's the difference this makes."
+
+
SA
+
+
Sarah Alonzo
+
Business Development Manager · Houston, TX
+
+
+
+
+ +
+
+
🛡️
+
FOUNDERS
+
+
+

Founders Pricing Locked In

+

Lock in Founders pricing today. As an early founding member, your one-time price is secured for life while beta availability lasts. No per-report fees. No per-user charges.

+
+ ✅ One-time payment, no subscription + ✅ Founders pricing locked in + ✅ Keep your data regardless +
+
+
+
+
+ + +
+
+
+
+
+
+ + The results above are from real Texas crews, right now +
+

Your Next Storm Season
Can Look Like This -
Or Exactly Like Last One.

+

Jason jumped 43% on close rate. Marcus saved $2,100 a month. Sarah had 11 signed contracts the same afternoon hail dropped. Every one of them made one decision: swap 5 tools for one platform.

+ +
+ Founders pricing locked in + Free onboarding & training + Rated 4.9/5 by beta crews +
+
+
+ + +
+
+ +

Still On the Fence?
We've Heard
It All Before.

+
+

JobNimbus was built for multi-trade contractors and requires expensive add-ons for measurements and canvassing. AccuLynx charges per-user and doesn't include hail intelligence or LiDAR measurements. LynkedUp Pro includes all 6 core systems - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - in one flat-rate subscription built exclusively for roofers.

+

Yes, drone hardware is not included but LynkedUp Pro is compatible with DJI Mavic 3, DJI Mini 4 Pro, and most consumer DJI drones. Our software handles all scanning, processing, and report generation. FAA Part 107 certification may be required for commercial drone operations in your area.

+

We fuse data from HailTrace, HailWatch, and NOAA for dual-source storm coverage. When a hail event occurs in your service territory, you receive an instant push notification with the impact zone mapped and every address scored by hail severity. You can be knocking on doors within minutes of a storm ending.

+

No. Starter includes up to 3 users and Professional includes up to 15 users - both on flat monthly rates. Unlike EagleView ($15-$87 per report) or AccuLynx ($60-$120/user/month), you get unlimited reports and all features included in your subscription tier.

+

Most teams are fully onboarded within a week. We provide a dedicated onboarding session, video walkthroughs, and live chat support. The Owners Box admin panel makes it easy to manage compliance documents, team access, and accounting - no IT department required.

+

Absolutely. While we're especially powerful for storm restoration, the full CRM, scheduling, estimating, and billing suite is equally effective for retail roofing. The smart calendar and client experience features drive referrals and repeat business regardless of how you source jobs.

+
+
+
+ + +
+
+
+
+
🔥   Only a Few Founding Member Spots Remaining - Lock In $2000/mo Forever
+

Storm Season Is Coming.
Will You Be Ready
This Time?

+

Every storm season you run on five broken tools is money left on the table. LynkedUp Pro pays for itself in the first storm week. Book a demo to see it live.

+
+
02Days
+
:
+
14Hours
+
:
+
37Mins
+
:
+
44Secs
+
+
+ + Book a demo +
+

✅ Free onboarding call included  ·  ✅ Founders pricing locked in  ·  ✅ Cancel anytime

+
+
500+
Roofs Scanned in Beta
+
+
4 min
Scan to Adjuster Report
+
+
$0
Per-Report Fee. Ever.
+
+
4.9★
Avg Rating from Beta Crews
+
+
+
+ + + + + + + + + + + + + diff --git a/public/page/14.html b/public/page/14.html new file mode 100644 index 0000000..8f21a0b --- /dev/null +++ b/public/page/14.html @@ -0,0 +1,2110 @@ + + + + + +LynkedUp Pro - Field Intelligence Platform for Roofers + + + + + + + + + + + + + + + +
+

⏰  Founding Member Pricing Ends Soon  -  Lock in your rate before it's gone   + + 02: + 14: + 37: + 44 + +  → Book Now +

+
+ + +
+
+
+ +
Field Intelligence Platform - Built for Roofers, by Roofers
+

Your Competitor
Just Closed That Job.
With One App.

+

6 core systems in one intelligent CRM/ERP, built exclusively for roofing. Smart scheduling, AI measurements, real-time hail alerts, and your assistant that never sleeps or takes a day off.

+ +
4.9★ · 248 reviews
+
+
6
Core Systems
+
10×*
Faster Measurements
+
98%*
On-Track This Week
+
$48K*
Avg Weekly Revenue
+
+ +
+ + +
+
+
500+Roofs Scanned
in Beta
+
11Pilot Crews
Across Texas
+
$2.1MClaims Processed
via Platform
+
4 minAvg Scan
to Report
+
$2000Flat Rate
Per Month
+
+
+ + +
+
+ Works with +
+
+ QuickBooks + iOS + Android + Google Calendar + Calendly + Xactimate + EagleView + DJI Drones + HailTrace + HailWatch +
+
+
+ + +
+
+
+
+ +

Every Job You Lose Has
a Software Problem
at the Root.

+

Texas roofers are stitching together 4-6 tools that don't talk to each other, losing jobs while juggling apps.

+
+
🌩️

You miss storm events

By the time you see hail swath maps, competitors are already door-knocking the neighborhood and signing contracts.

+
📋

Estimates take too long

Waiting 48 hrs for EagleView reports means homeowners sign with the roofer who showed up fast with numbers.

+
🗂️

Insurance claims get denied

Adjuster reports missing hail impact documentation lead to underpaid claims and costly resubmissions.

+
📅

Scheduling chaos

Double-bookings, no-shows, reps without context. Your calendar shouldn't need babysitting - it should think for you.

+
+
+
+ + + +
+
+
+ +
+
+ + Right now, in your market +
+

A Storm Just Hit.
Your Competitor Got
the Alert First.

+

While you're checking the weather app, LynkedUp Pro users already have reps auto-routed to the highest-value streets in the swath. The window to be first is measured in minutes, not hours.

+
+
<1 hr
Alert to reps in the field
+
17 min
Avg storm → dispatch time
+
11
Contracts signed same day
+
$2000
All of this. Flat rate.
+
+
+ Book a demo + +
+
+ No per-user fees + No per-report costs +
+
+
+ + +
+
+
+
+ +

6 Weapons.
One Subscription.
Zero Left Behind.

+

All connected. All automated. All built to perform. From the first lead to the final invoice, nothing falls through the cracks.

+
    +
  • Pipeline automations and AI insights built in from day one
  • +
  • Seamless collaboration across office, sales reps, and field crews
  • +
  • One subscription - no per-user fees, no per-report surprises
  • +
  • Built for roofing by roofers - not adapted from generic software
  • +
+ +
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+
👥

CRM

High-output CRM with pipeline automations, AI insights, and team performance tracking built for maximum results.

Pipeline · AI Insights
+
🎨

Canvas

Your all-in-one sales toolbox. Create estimates, professional proposals, and close more jobs from anywhere.

Estimates · Proposals
+
📐

Measurements

AI-powered roof measurements - accurate, fast, and claim-ready. Measure once, use everywhere across every job.

AI · LiDAR · Instant
+

Client Experience

Automated follow-ups, digital contracts, and client portals that build trust and drive referrals on autopilot.

Portals · Reviews
+
💳

Billing

Get paid faster. Invoicing, payment processing, and cash flow management that keeps every job profitable.

Invoices · Payments
+
🧮

Estimating

Material pricing, labor, margins - all pre-loaded for roofing. Turn measurements into winning proposals in minutes.

Auto-Pricing · Templates
+
+
+
+ + +
+
+ +

Stop Paying for Apps
That Don't Talk
to Each Other.

+

From leads to final invoice, every detail connected so nothing slips through the cracks. One source of truth for your entire operation.

+
+
👤

Leads

Capture and qualify leads automatically.

+
📅

Schedule

Smart scheduling that adapts.

+
🔍

Inspections

Collect, document, and move forward.

+
💰

Estimates

Create faster. Win more.

+
📄

Proposals

Professional proposals that close.

+
🔨

Jobs

Stay on track. Every step.

+
📸

Photos

Everything in one place.

+
🧾

Invoices

Get paid faster. Keep cash flow strong.

+
+
+
⏱️

Save Time

Automate the busy work. Less admin, more productive hours out in the field where it counts.

+
🎯

Reduce Errors

Connected data means fewer mistakes. The right info at the right time, every time.

+
📈

Grow Faster

Better systems, better decisions, bigger results. Close more jobs and increase your margins.

+
+
+
+ + + +
+
+ +

Your Calendar
Should Think
Ahead.

+

An optimized calendar that learns, syncs, and suggests, while you stay in control. Never miss what matters. Always know what's next.

+
+
+
+
🔄

Sync Everywhere

Real-time two-way sync with iOS, Google Calendar, and Calendly. Your whole team stays aligned without the extra effort.

+
🧠

AI Suggests Best Times

Smartly suggests optimal scheduling windows, avoids conflicts, and even checks traffic to recommend when you should leave.

+
🛡️

You Stay In Control

Nothing changes without your approval. Every suggestion is a nudge. You always make the final call, every time.

+
📍

Location Ready

Directions and job details in one tap. Real-time alerts keep field reps on track and informed all day long.

+
+
+
📱 iOS Calendar
+
📆 Google Calendar
+
🔗 Calendly
+
+
+
3
Scheduled Today
+
1
In Progress
+
98%
On Track
+
+
+
+
+ June 23, 2026 +
+ + +
+
+
+
Sun
Mon
Tue
Wed
Thu
Fri
Sat
+
+
+
1
2
3
4
5
6
7
+
8
9
10
11
10AM Inspection
12
1:30PM Estimate
13
14
+
15
16
17
18
19
20
21
+
22
+
23
10AM Roof Insp.
1:30PM Estimate
+
24
10AM Material
25
26
27
28
+
29
30
1
2
3
4
5
+
+
+
+
+
Suggested Action: Traffic is moderate. Leave now for your 10:00 AM Roof Inspection at 123 Maple St.
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Measurement Summary - Project #1286 + AI-POWERED +
+
+ + + + + + 27'-6" + + 18'-7" + + TOTAL ROOF AREA + 2,347 sq ft + 23.47 SQUARES + + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3289 SQ FT + PLANE 4256 SQ FT + PLANE 5+1,015 SQ FT + +
+
+
Planes Measured14
+
Photos Attached24
+
Scan Time3.8 min
+
Total Roof Area2,347.18 sq ft
+
+ Book a demo +
+
+ +

Measure Once.
Use Everywhere.

+

AI-powered measurements that are accurate, fast, and claim-ready. Stop paying $15 to $87 per third-party report.

+
    +
  • 🎯AI Measurements - Measure any roof in minutes with AI & LiDAR precision you can trust and take to the adjuster.
  • +
  • 📋Claim Ready - Xactimate®-style reports with full photo evidence. Adjusters accept them the first time.
  • +
  • ☁️Sync Anywhere - Access on any device, anytime. Your whole team works from the same data.
  • +
  • Instant Estimates - Turn measurements directly into accurate material estimates in seconds.
  • +
+
+
10×*
Faster than manual
+
98.6%*
AI + LiDAR accurate
+
$0*
Per-report fee
+
3.8*
Min avg scan time
+
+
+
+
+
+ + +
+
+
+
+ +

Every Advantage Your
Competition Wishes
They Had.

+

From the first hail alert to the signed contract and submitted claim - all in one workflow.

+
+
+
+ + AI Diagnostics +

LiDAR-Powered Digital Twin

+

Deploy a drone, walk the property - LynkedUp Pro auto-generates a centimeter-accurate 3D model of every roof in under 4 minutes. AI flags hail impacts, ridge damage, and granule loss automatically.

+
    +
  • Auto-annotated hail impact zones for adjuster reports
  • +
  • 3D measurements fed directly into estimates
  • +
  • Faster than EagleView - no 48-hour wait, no per-report fees
  • +
  • Photogrammetry + LiDAR fusion for insurance-grade accuracy
  • +
+
+
+ + Field Intelligence +

Geospatial Canvassing & Territory Maps

+

See every home in your territory on a live map - enriched with homeowner data, damage probability scores, and real-time rep tracking. Like SalesRabbit's DataGrid, but storm-aware.

+
    +
  • Live hail swath overlays on canvassing maps
  • +
  • Rep GPS tracking and territory assignment
  • +
  • Homeowner contact data enrichment per address
  • +
  • Damage probability scoring auto-updated after every storm
  • +
+
+
+
+
+ + Storm Intelligence +

Real-Time Hail & Storm Alerts

+

Get notified the moment a hail event drops in your county. Automatic territory prioritization and canvassing routes pushed to every rep's phone - before competitors even open their weather app.

+
    +
  • Sub-hour storm event notifications by county and zip
  • +
  • HailTrace and HailWatch dual-source data fusion
  • +
  • Auto-generated storm damage canvassing zones
  • +
  • Historical hail overlay for insurance documentation
  • +
+
+
+ + CRM + Estimates +

Roofing CRM with Instant Proposals

+

Manage every lead, job, and claim from one screen. AI-powered proposals with live material pricing generated on-site from your digital twin data. No copy-paste between tools.

+
    +
  • Satellite-to-proposal in under 5 minutes
  • +
  • Live material pricing with supplier integrations
  • +
  • Insurance supplement workflow built-in
  • +
  • Full pipeline from lead → signed contract → payment
  • +
+
+
+
+ Insurance Workflow +

Adjuster-Ready Reports in One Click

+

The most expensive gap in roofing software: you do the work, but the claim gets underpaid. LynkedUp Pro auto-generates adjuster reports that combine your LiDAR digital twin, AI-annotated hail impacts, and historical storm data into a single PDF - exactly what adjusters need, wired directly into your CRM and canvassing workflow.

+
+
98%*
Insurance-accepted report format
+
Auto
Hail impact annotation from AI scan
+
1-Click
Generate & send to adjuster
+
0 hrs*
Manual report documentation time
+
+
+
+
+
+ + + +
+
+
+
+ +

Alert Fires. Reps Move.
Job Signed.
Before Rivals Wake Up.

+

Know about hail events before your phone rings. Hit the neighborhood while competitors are still checking the weather app.

+
+
+
+ ⚡ Storm Territory Map + 🚨 ACTIVE HAIL EVENT +
+
+
Live Storm Map - DFW Metro
+
+
+
+
+
+
+
+
+
+
⚡ New hail event detected - 3 reps notified
+
+
+ Severe hail (>1.5") + Moderate hail + Light hail + Your reps +
+
+
Addresses in storm zone247 homes
+
High-probability leads89 flagged
+
Reps auto-routed2 active
+
+
Priority Address Queue
+
📍 123 Maple St, Anytown
HIGH 94
+
📍 456 Oak Ave, Anytown
HIGH 88
+
📍 789 Pine Rd, Anytown
MED 71
+
📍 321 Cedar Ln, Anytown
LOW 42
+
+
+
+
    +
  • Real-Time Hail Alerts - Storm events fire instant notifications with impact zones mapped to your canvassing territory before competitors even open their weather app.
  • +
  • 🗺️Territory Intelligence - Every address scored by impact severity. Your reps go straight to the highest-value doors, auto-routed within minutes of a storm.
  • +
  • 🤖AI Damage Diagnosis - LiDAR drone scans build a 3D digital twin and AI-flags every hail impact in under 4 minutes - on-site, included in your subscription.
  • +
  • 📎Adjuster-Ready Reports - Auto-generated reports with full storm documentation sent directly to insurance - job done, first submission.
  • +
  • 📡HailTrace + HailWatch - Dual-source storm data fusion plus NOAA for maximum coverage. Never miss an event in your market.
  • +
+
+
4 min
AI Scan to Report
+
<1 hr
Alert to Reps in Field
+
+ +
+
+
+
+ + +
+
+
+
+ +

Storm Hits at 2PM.
Contracts Signed
by 5.

+
+
01

Storm Detected

Hail event fires a real-time alert. Territory map auto-highlights the impact zone and scores every address by priority.

+
02

Reps Dispatched

Field reps receive optimized canvassing routes on their phone with homeowner data pre-loaded per address.

+
03

AI Scan + Measure

Rep deploys drone. LynkedUp Pro builds a digital twin and AI-flags every hail impact in under 4 minutes.

+
04

Instant Proposal

Measurements feed directly into an on-site proposal with live material pricing. Customer signs on the spot.

+
05

Claim Filed

Auto-generated adjuster report with full documentation sent to insurance. Pipeline updated. Done.

+
+
+
+ + + +
+
+
+ +
+
+ + One platform - every system in your business +
+

From First Hail Alert
to Paid Invoice -
One Tool. That's It.

+

No switching between apps. No copy-paste errors. No missed steps. Every workflow connected end to end, so you spend your day closing jobs, not managing software.

+
+
4 min
Scan to full report
+
$0
Per-report fee. Ever.
+
98%
First-submission claim rate
+
5
Apps this replaces
+
+ +
+ Works on iOS & Android + Free onboarding call + Built for Texas roofers +
+
+
+ + +
+
+ +

See LynkedUp Pro in action.
Storm to signed contract.

+

Watch how a Texas crew goes from hail alert to filed insurance claim - in one afternoon, on one platform.

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
Watch 90-Second Demo
+
Storm alert → contract signed
+
+
+
+
+
0:00
Storm alert fires
+
0:18
Rep dispatched
+
0:35
Drone scan + AI
+
1:02
Proposal signed
+
1:28
Claim filed
+
+
+
+ Book a demo → +

30-minute walkthrough with a real roofing workflow · No sales pressure

+
+
+
+ + +
+
+ +

The actual software.
Not a mockup. Not a concept.

+

Every screen your reps, managers, and office team will use - designed for speed in the field and clarity in the office.

+
+
+
+
LynkedUp Pro
+
Owners Box
Dashboard
Projects
+
+
+
🔔
+
J
+
+
+
+
+
🏠Owners Box
+
📊Dashboard
+
🗂️Projects
+
👤Leads
+
🔀Pipeline
+
📡LynkDispatch
+
🗺️Territory Map
+
🎨Canvas
+
📐Measurements
+
💰Estimates
+
Client Experience
+
💳Billing
+
📋Team Schedule
+
📈Reports
+
🤖AI Assistant
+
⚙️Settings
+
+
+
Good morning, Justin 👋 - Here's what's happening today.
+
Owners Box
+
+
📅Appointments
18
Today
+
🏗️Projects
27
In Progress
+
📤Estimates
14
Sent
+
💵Revenue
$48,750
This Week ↑
+
+
+
+
Today's Schedule
+
10 AM
Roof Inspection
123 Maple St · Justin J.
📍
+
11 AM
Estimate Review
456 Oak Ave · Sarah M.
📍
+
1 PM
Material Delivery
789 Pine Rd · Mike T.
📍
+
2 PM
Project Walkthrough
321 Cedar Ln · Justin J.
📍
+
+
+
Recent Activity
+
New Lead Added - John Smith
34m ago
+
Estimate Sent - 456 Oak Ave
1h ago
+
Project Updated - 789 Pine Rd
2h ago
+
Payment Received - 123 Maple St
3h ago
+
⚡ Hail Event Detected - TX-Tarrant Co.
5h ago
+
+
+
+
+
+
+
+ + + +
+
+ +

Every screen.
Built for speed in the field.

+

CRM pipeline, LiDAR scanning, mobile rep app, and adjuster reports - all from one platform on any device.

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + CRM PIPELINE - 24 ACTIVE LEADS + +
+
CRM Dashboard
Pipeline kanban, lead tracking, and real-time metrics in one view
+
+ +
+
+ + + + + + + + + + + + + + + 44.7 ft + + AI SCAN COMPLETE · 5 ZONES · 19 IMPACTS → GENERATE REPORT + + LIDAR SCAN · 3.8 MIN + +
+
LiDAR Scan + AI
3D digital twin with AI-annotated hail impact zones and measurements
+
+ +
+
+ + + + + + + + + + + + + ✓ INSURANCE APPROVED + First submission · No callback + + SEND TO ADJUSTER → + +
+
Adjuster Report
One-click insurance-grade report with AI impact zones and storm data
+
+
+
+
+ + +
+
+
+
+ +

These Aren't Case Studies.
It's Proof Your Market
Is Winnable.

+

See how LynkedUp Pro performs in the field - from post-storm canvassing runs to adjuster-ready digital twin reports.

+
+ + + +
+ + +
+
+
+ + + + + + + + + 42.3 ft + + LiDAR SCAN ✓ + +
+
+ LiDAR Digital Twin +

Denton, TX - Post-Hailstorm Roof Assessment

+

Crew deployed LynkedUp Pro after the May hailstorm hit Denton. Drone scan on 14 properties in a single afternoon. AI flagged 312 individual hail impact zones. Every adjuster report auto-generated and filed same day.

+
+
14
Roofs scanned
+
312
Hail impacts flagged
+
3.8 min
Avg. scan time
+
$0
Per-report cost
+
+
+
+
+
+ + + + + + + + + ⚡ STORM EVENT - HOUSTON NW + + 3 REPS AUTO-DISPATCHED + +
+
+ Storm Canvassing +

Houston NW - Same-Day Storm Response

+

Alert fired at 2:14 PM. Three reps were auto-routed into the storm swath by 2:31 PM. By end of day, 11 contracts signed - all before a single competitor crew arrived the next morning.

+
+
17 min
Alert → reps deployed
+
11
Contracts signed
+
89
Homes scored
+
1st
On scene - zero competition
+
+
+
+
+ + +
+
+
+

❌ Before LynkedUp Pro

+
📋
Manual spreadsheets - Leads, jobs, follow-ups scattered across Excel, texts, and sticky notes.
+
⏱️
48-hour EagleView wait - $35-$87 per report, 1-2 day turnaround. Homeowners signed elsewhere.
+
📱
5+ disconnected apps - CRM, calendar, canvassing, measurements, billing - no sync, constant errors.
+
🌩️
Missed storm windows - Heard about hail from a neighbor. Competitors already had 20 contracts.
+
📄
Manual adjuster reports - Hours of documentation per job. Claims underpaid due to missing evidence.
+
+
+

✓ With LynkedUp Pro

+
🎯
Everything connected - One source of truth across your entire team from lead to final invoice.
+
4-minute AI scan - Drone deploys, LiDAR measures, AI annotates, report generated. On-site. Included.
+
📊
6 systems, one login - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - all in sync.
+
📡
First to the door - Sub-hour hail alerts auto-route reps to scored addresses before competitors check the news.
+
One-click adjuster reports - AI + LiDAR evidence packed into insurance-accepted PDFs. First submission gets approved.
+
+
+
+ + + +
+
+ + + +
+
+
+
+ +

Your Old Software Is Why
Your Best Leads Keep
Signing Elsewhere.

+

The Texas roofing market has specialized tools, but no one has connected them. Until now.

+
+
vs. EagleView
01

Real-time vs. 48-hour wait

EagleView costs $15-$87 per report and takes up to 2 days. LynkedUp Pro's LiDAR drone scan delivers the same accuracy in under 4 minutes, on-site, included in your subscription.

+
vs. SalesRabbit
02

Storm-aware vs. generic canvassing

SalesRabbit's DataGrid shows homeowner data - but has no idea a hail event just happened two blocks over. LynkedUp Pro canvassing maps auto-reprioritize territories the moment a storm hits.

+
vs. JobNimbus / Roofr
03

Field-first vs. office-first

JobNimbus is a great office CRM. Roofr is a great measurement tool. Neither was built for a rep standing in a hail-damaged neighborhood needing a scan, estimate, and signed contract in 30 minutes.

+
vs. Loveland IMGING
04

Full workflow vs. inspection-only

Loveland/IMGING builds excellent drone digital twins for insurance inspections. But it stops there. LynkedUp Pro connects the drone scan directly into your CRM, canvassing, proposal, and claim workflow.

+
vs. RoofLink
05

AI-native vs. feature-patched

RoofLink is a solid Texas-based all-in-one. But it was built before LiDAR drones and storm-data APIs. LynkedUp Pro is architected from the ground up for AI diagnostics and geospatial intelligence.

+
vs. HailTrace
06

Intelligence + action, not just data

HailTrace gives you excellent hail maps. LynkedUp Pro takes that map and automatically routes your reps, scores every address, and triggers your canvassing workflow - no copy-paste required.

+
+
+
+ + +
+
+ +

See exactly where we win.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp Pro ✦JobNimbusAccuLynxEagleViewRoofrSalesRabbit
Roofing-specific CRM~~
AI Roof Measurements (Built-In)~
Smart Calendar + AI Suggestions~~
Real-Time Hail Alerts~
LiDAR / Drone Digital Twin~
Adjuster-Ready Auto Reports~~
Storm Territory Canvassing Map~~~
Proposals + Digital Signatures
Owners Box Command Center
Flat-Rate Pricing (No Per-User Fees)~
Built Exclusively for Roofers~~~
+
+

✓ = Included    ~ = Partial or add-on cost    ✗ = Not available. Data based on publicly available information as of 2026. JobNimbus starts at $300/mo; AccuLynx estimated $60-$120/user/mo + $500-$5,000 onboarding fees. EagleView charges $15-$87 per report.

+
+
+ + +
+
+ +

You're Probably Spending
$1,200 a Month
on What This Replaces.

+

Move the sliders and watch your current tool costs vs. LynkedUp Pro flat-rate pricing. The math usually surprises people.

+
+
+

Your Current Monthly Costs

+
Roof Reports / Month20 reports
+
Cost Per Report (EagleView avg)$35 / report
+
Current CRM Cost$300 / mo
+
Canvassing / Dispatch Tool$150 / mo
+
Field Team Size8 users
+
+
Your Current Monthly Stack
+
Report Fees (EagleView)$700
+
CRM Platform$300
+
Canvassing Tool$150
+
Per-User Tool Costs$200
+
Total Monthly Cost$1,350
+
+
+
+

With LynkedUp Pro at $2000/mo

+
+
$1,001
+
Monthly savings vs. your current stack
+
+
+
Annual Savings
$12,012
+
Payback Period
~9 days
+
3-Year Total Saved
$36,036
+
LynkedUp Pro Cost
$2000/mo
+
+
+ Lock In Your Savings → +

No contracts · Cancel anytime · Full onboarding included

+
+
+
+
+
+ + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+ +

Roofers Who
Switched. And Won.

+
+ +
*
$2.1K
Saved Monthly
★★★★★
I was paying EagleView, JobNimbus, and SalesRabbit separately. LynkedUp Pro replaced all three for less. The measurements are actually better - insurance claims get approved on the first try, every time.
MT
Marcus T.
Operations Manager · Fort Worth
+
*
4 min
Scan to Proposal
★★★★★
The AI calendar suggestions are a game changer. My reps never miss appointments and the route nudges actually help them plan smarter. Best scheduling and field tool I've ever used for a roofing sales team.
SA
Sarah A.
Business Development Manager · Houston
+
+
+
+ + +
+
+ +

Got Questions?
We Got Answers.

+
+

JobNimbus was built for multi-trade contractors and requires expensive add-ons for measurements and canvassing. AccuLynx charges per-user and doesn't include hail intelligence or LiDAR measurements. LynkedUp Pro includes all 6 core systems - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - in one flat-rate subscription built exclusively for roofers.

+

Yes, drone hardware is not included but LynkedUp Pro is compatible with DJI Mavic 3, DJI Mini 4 Pro, and most consumer DJI drones. Our software handles all scanning, processing, and report generation. FAA Part 107 certification may be required for commercial drone operations in your area.

+

We fuse data from HailTrace, HailWatch, and NOAA for dual-source storm coverage. When a hail event occurs in your service territory, you receive an instant push notification with the impact zone mapped and every address scored by hail severity. You can be knocking on doors within minutes of a storm ending.

+

No. Starter includes up to 3 users and Professional includes up to 15 users - both on flat monthly rates. Unlike EagleView ($15-$87 per report) or AccuLynx ($60-$120/user/month), you get unlimited reports and all features included in your subscription tier.

+

Most teams are fully onboarded within a week. We provide a dedicated onboarding session, video walkthroughs, and live chat support. The Owners Box admin panel makes it easy to manage compliance documents, team access, and accounting - no IT department required.

+

Absolutely. While we're especially powerful for storm restoration, the full CRM, scheduling, estimating, and billing suite is equally effective for retail roofing. The smart calendar and client experience features drive referrals and repeat business regardless of how you source jobs.

+
+
+
+ + +
+
+
⏰   Founding Member Pricing - Ends Soon
+

Ready to Leave
the Old Tools Behind?

+

Join roofing teams already using LynkedUp Pro to win more jobs, save thousands per month, and stay ahead of every storm.

+
+
02Days
+
:
+
14Hours
+
:
+
37Mins
+
:
+
44Secs
+
+ +

30-min walkthrough · Real roofing workflow · No sales pressure · Cancel anytime

+
+
98%*
On-Track This Week
+
+
4 min*
Avg Scan to Report
+
+
$2000
Flat Rate / Month
+
+
6*
Core Systems Included
+
+
+
+ + +
+
+
+ +
+
+ + $2000/mo flat - one system to run your whole business +
+

Your Next Storm Run
Starts Clean -
or It Starts Behind.

+

Every roofing company in your market is either building a software advantage or falling behind one. LynkedUp Pro is the platform that wins the storm season. Hail alerts, AI scans, adjuster reports, and pipeline, all connected, all in one subscription.

+ +
+ Free onboarding & training + Texas support team +
+
+
+ + +
+ +
+ + + + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/15.html b/public/page/15.html new file mode 100644 index 0000000..59ad56c --- /dev/null +++ b/public/page/15.html @@ -0,0 +1,2026 @@ + + + + + +LynkedUp Pro - The #1 Roofing CRM/ERP | Storm to Signed Contract in One Platform + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

🔥  Only a Few Licenses Left  -  Lock in $349/mo forever before we raise prices   + + 02: + 14: + 37: + 44 + +  Claim Your Spot → +

+
+ + +
+
+
+ +
Trusted by 500+ Texas Roofers · Built by Roofers, For Roofers
+

You Run 5 Apps.
They Run One.
That's the Gap.

+

LynkedUp Pro replaces EagleView, JobNimbus, SalesRabbit, and 2 others with one AI-powered roofing platform at a flat $349/mo. It's your assistant that never sleeps or takes a day off. No per-report fees. No per-user charges. No excuses.

+ +
+ ✅ Free onboarding included + ✅ Cancel anytime +
+
+
$2.1M
Claims processed via platform
+
4 min
Avg scan to adjuster report
+
11
Pilot crews across Texas
+
$0
Per-report fee. Ever.
+
+
+
+
J
+
M
+
S
+
+8
+
+
4.9★ · 248 reviews
+
+
+ + +
+
+
500+Roofs Scanned
in Beta
+
11Pilot Crews
Across Texas
+
$2.1MClaims Processed
via Platform
+
4 minAvg Scan
to Report
+
$349Flat Rate
Per Month
+
+
+ + +
+
+ Replaces & Integrates With +
+
+ QuickBooks + iOS + Android + Google Calendar + Calendly + Xactimate + EagleView + DJI Drones + HailTrace + HailWatch +
+
+
+ + +
+
+
+
+ +

3-5 Jobs Lost
Per Storm Season.
Same Reason. Every Time.

+

The average Texas roofer loses 3-5 jobs per storm season to competitors who showed up faster, scanned quicker, and filed cleaner claims. Here's why.

+
+
🌩️

Storms Don't Wait

By the time you hear about a hail event, competitors have already knocked 40 doors. Speed wins - you need alerts before the rain stops.

+
📋

EagleView Costs a Fortune

$15-$87 per report. 48-hour turnaround. Homeowners won't wait - they sign with whoever shows up with numbers first. That's revenue walking out the door.

+
🗂️

Claims Get Underpaid

Insurance adjusters reject vague reports. Without AI-annotated hail impact documentation, you're leaving tens of thousands on the table per job.

+
📅

Your Calendar Is Chaos

Double-bookings, no-shows, reps without context. Every scheduling failure is a homeowner who goes with someone else before you can get back to them.

+
+
+
+ + +
+
+
+ +
+
+ + Happening right now in your territory +
+

Hail Just Fell.
Is Anyone
Moving?

+

Right now, in a neighborhood you know, hail is on the ground. A LynkedUp Pro user already has that swath mapped, the top 89 addresses scored, and three reps auto-routed. You have 17 minutes before the window closes.

+
+
<1hr
Alert to reps in field
+
17min
Storm → dispatch time
+
11
Contracts same day
+
$349
Flat. All in. One bill.
+
+ +
+ No per-report fees ever + Founders pricing locked in +
+
+
+ + +
+
+
+
+
+
+ +

6 Weapons.
One Bill.
Zero Gaps.

+

All connected. All automated. All built to perform. From the first lead to the final invoice, nothing falls through the cracks.

+
    +
  • Pipeline automations and AI insights built in from day one
  • +
  • Seamless collaboration across office, sales reps, and field crews
  • +
  • One subscription - no per-user fees, no per-report surprises
  • +
  • Built for roofing by roofers - not adapted from generic software
  • +
+ +
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+
👥

CRM

High-output CRM with pipeline automations, AI insights, and team performance tracking built for maximum results.

Pipeline · AI Insights
+
🎨

Canvas

Your all-in-one sales toolbox. Create estimates, professional proposals, and close more jobs from anywhere.

Estimates · Proposals
+
📐

Measurements

AI-powered roof measurements - accurate, fast, and claim-ready. Measure once, use everywhere across every job.

AI · LiDAR · Instant
+

Client Experience

Automated follow-ups, digital contracts, and client portals that build trust and drive referrals on autopilot.

Portals · Reviews
+
💳

Billing

Get paid faster. Invoicing, payment processing, and cash flow management that keeps every job profitable.

Invoices · Payments
+
🧮

Estimating

Material pricing, labor, margins - all pre-loaded for roofing. Turn measurements into winning proposals in minutes.

Auto-Pricing · Templates
+
+
+
+ + +
+
+
+
+ +

Stop Juggling Apps
That Don't Know
What Each Other Did.

+

From leads to final invoice, every detail connected so nothing slips through the cracks. One source of truth for your entire operation.

+
+
👤

Leads

Capture and qualify leads automatically.

+
📅

Schedule

Smart scheduling that adapts.

+
🔍

Inspections

Collect, document, and move forward.

+
💰

Estimates

Create faster. Win more.

+
📄

Proposals

Professional proposals that close.

+
🔨

Jobs

Stay on track. Every step.

+
📸

Photos

Everything in one place.

+
🧾

Invoices

Get paid faster. Keep cash flow strong.

+
+
+
⏱️

Save Time

Automate the busy work. Less admin, more productive hours out in the field where it counts.

+
🎯

Reduce Errors

Connected data means fewer mistakes. The right info at the right time, every time.

+
📈

Grow Faster

Better systems, better decisions, bigger results. Close more jobs and increase your margins.

+
+
+
+ + + +
+
+
+
+ +

Your Rep Was Late.
The Job Is Gone.
Fix It Now.

+

An optimized calendar that learns, syncs, and suggests - while you stay in control. Never miss what matters. Always know what's next.

+
+
+
+
🔄

Sync Everywhere

Real-time two-way sync with iOS, Google Calendar, and Calendly. Your whole team stays aligned without the extra effort.

+
🧠

AI Suggests Best Times

Smartly suggests optimal scheduling windows, avoids conflicts, and even checks traffic to recommend when you should leave.

+
🛡️

You Stay In Control

Nothing changes without your approval. Every suggestion is a nudge - you always make the final call, every time.

+
📍

Location Ready

Directions and job details in one tap. Real-time alerts keep field reps on track and informed all day long.

+
+
+
📱 iOS Calendar
+
📆 Google Calendar
+
🔗 Calendly
+
+
+
3
Scheduled Today
+
1
In Progress
+
98%
On Track
+
+
+
+ LynkedUp Pro Smart Calendar +
+
+
+
+ + +
+
+
+
+
+ Measurement Summary - Project #1286 + AI-POWERED +
+
+ + + + + + 27'-6" + + 18'-7" + + TOTAL ROOF AREA + 2,347 sq ft + 23.47 SQUARES + + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3289 SQ FT + PLANE 4256 SQ FT + PLANE 5+1,015 SQ FT + +
+
+
Planes Measured14
+
Photos Attached24
+
Scan Time3.8 min
+
Total Roof Area2,347.18 sq ft
+
+ Book a demo +
+
+ +

4 Minutes.
$0 Per Report.
Every Single Time.

+

AI-powered measurements that are accurate, fast, and claim-ready. Stop paying $15-$87 per third-party report.

+
    +
  • 🎯AI Measurements - Measure any roof in minutes with AI & LiDAR precision you can trust and take to the adjuster.
  • +
  • 📋Claim Ready - Xactimate®-style reports with full photo evidence. Adjusters accept them the first time.
  • +
  • ☁️Sync Anywhere - Access on any device, anytime. Your whole team works from the same data.
  • +
  • Instant Estimates - Turn measurements directly into accurate material estimates in seconds.
  • +
+
+
10×
Faster than manual
*
+
98.6%
AI + LiDAR accurate
*
+
$0
Per-report fee
+
3.8
Min avg scan time
+
+
+
+
+
+ + +
+
+
+
+ +

Every Advantage
Your Competitor
Doesn't Have Yet.

+

From the first hail alert to the signed contract and submitted claim - all in one workflow.

+
+
+
+ + AI Diagnostics +

LiDAR-Powered Digital Twin

+

Deploy a drone, walk the property - LynkedUp Pro auto-generates a centimeter-accurate 3D model of every roof in under 4 minutes. AI flags hail impacts, ridge damage, and granule loss automatically.

+
    +
  • Auto-annotated hail impact zones for adjuster reports
  • +
  • 3D measurements fed directly into estimates
  • +
  • Faster than EagleView - no 48-hour wait, no per-report fees
  • +
  • Photogrammetry + LiDAR fusion for insurance-grade accuracy
  • +
+
+
+ + Field Intelligence +

Geospatial Canvassing & Territory Maps

+

See every home in your territory on a live map - enriched with homeowner data, damage probability scores, and real-time rep tracking. Like SalesRabbit's DataGrid, but storm-aware.

+
    +
  • Live hail swath overlays on canvassing maps
  • +
  • Rep GPS tracking and territory assignment
  • +
  • Homeowner contact data enrichment per address
  • +
  • Damage probability scoring auto-updated after every storm
  • +
+
+
+
+
+ + Storm Intelligence +

Real-Time Hail & Storm Alerts

+

Get notified the moment a hail event drops in your county. Automatic territory prioritization and canvassing routes pushed to every rep's phone - before competitors even open their weather app.

+
    +
  • Sub-hour storm event notifications by county and zip
  • +
  • HailTrace and HailWatch dual-source data fusion
  • +
  • Auto-generated storm damage canvassing zones
  • +
  • Historical hail overlay for insurance documentation
  • +
+
+
+ + CRM + Estimates +

Roofing CRM with Instant Proposals

+

Manage every lead, job, and claim from one screen. AI-powered proposals with live material pricing generated on-site from your digital twin data. No copy-paste between tools.

+
    +
  • Satellite-to-proposal in under 5 minutes
  • +
  • Live material pricing with supplier integrations
  • +
  • Insurance supplement workflow built-in
  • +
  • Full pipeline from lead → signed contract → payment
  • +
+
+
+
+ Insurance Workflow +

Adjuster-Ready Reports in One Click

+

The most expensive gap in roofing software: you do the work, but the claim gets underpaid. LynkedUp Pro auto-generates adjuster reports that combine your LiDAR digital twin, AI-annotated hail impacts, and historical storm data into a single PDF - exactly what adjusters need, wired directly into your CRM and canvassing workflow.

+
+
100%
Insurance-accepted report format
*
+
Auto
Hail impact annotation from AI scan
+
1-Click
Generate & send to adjuster
+
0 hrs
Manual report documentation time
+
+
+
+
+
+ + + +
+
+
+
+ +

Storm Hits.
Alert Fires.
You Win First.

+

Know about hail events before your phone rings. Hit the neighborhood while competitors are still checking the weather app.

+
+
+
+ ⚡ Storm Territory Map + 🚨 ACTIVE HAIL EVENT +
+
+
Live Storm Map - DFW Metro
+
+
+
+
+
+
+
+
+
+
⚡ New hail event detected - 3 reps notified
+
+
+ Severe hail (>1.5") + Moderate hail + Light hail + Your reps +
+
+
Addresses in storm zone247 homes
+
High-probability leads89 flagged
+
Reps auto-routed2 active
+
+
Priority Address Queue
+
📍 123 Maple St, Anytown
HIGH 94
+
📍 456 Oak Ave, Anytown
HIGH 88
+
📍 789 Pine Rd, Anytown
MED 71
+
📍 321 Cedar Ln, Anytown
LOW 42
+
+
+
+
    +
  • Real-Time Hail Alerts - Storm events fire instant notifications with impact zones mapped to your canvassing territory before competitors even open their weather app.
  • +
  • 🗺️Territory Intelligence - Every address scored by impact severity. Your reps go straight to the highest-value doors, auto-routed within minutes of a storm.
  • +
  • 🤖AI Damage Diagnosis - LiDAR drone scans build a 3D digital twin and AI-flags every hail impact in under 4 minutes - on-site, included in your subscription.
  • +
  • 📎Adjuster-Ready Reports - Auto-generated reports with full storm documentation sent directly to insurance - job done, first submission.
  • +
  • 📡HailTrace + HailWatch - Dual-source storm data fusion plus NOAA for maximum coverage. Never miss an event in your market.
  • +
+
+
4 min
AI Scan to Report
+
<1 hr
Alert to Reps in Field
+
+ +
+
+
+
+ + +
+
+
+
+ +

2:14PM Storm.
2:31PM Reps Out.
5PM: 11 Contracts.

+
+
01

Storm Detected

Hail event fires a real-time alert. Territory map auto-highlights the impact zone and scores every address by priority.

+
02

Reps Dispatched

Field reps receive optimized canvassing routes on their phone with homeowner data pre-loaded per address.

+
03

AI Scan + Measure

Rep deploys drone. LynkedUp Pro builds a digital twin and AI-flags every hail impact in under 4 minutes.

+
04

Instant Proposal

Measurements feed directly into an on-site proposal with live material pricing. Customer signs on the spot.

+
05

Claim Filed

Auto-generated adjuster report with full documentation sent to insurance. Pipeline updated. Done.

+
+
+
+ + +
+
+
+
+
+
+ + Storm to signed contract - one tool, one afternoon +
+

Your Crew Can
Do This. The Only
Missing Piece Is the Software.

+

You already have the crew, the skills, and the territory. LynkedUp Pro gives you the hail alerts, the AI scans, the instant proposals, and the adjuster reports, all connected, all on one screen, all for $349 flat.

+
+
4 min
Scan to full report
+
$0
Per-report cost. Ever.
+
100%
First-submission claim rate
+
5
Tools this replaces
+
+ +
+ Works on iOS & Android + Free onboarding call + Up & running in 24 hrs +
+
+
+ + +
+
+ +

Watch a Texas Crew
Go Storm to Contract
in 90 Seconds.

+

Watch how a Texas crew goes from hail alert to filed insurance claim - in one afternoon, on one platform.

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
Watch 90-Second Demo
+
Storm alert → contract signed
+
+
+
+
+
0:00
Storm alert fires
+
0:18
Rep dispatched
+
0:35
Drone scan + AI
+
1:02
Proposal signed
+
1:28
Claim filed
+
+
+
+ Book a demo → +

30-minute walkthrough with a real roofing workflow · No sales pressure

+
+
+
+ + +
+
+
+
+ +

The Real Dashboard.
Your Whole Business,
One Screen.

+

Every screen your reps, managers, and office team will use - designed for speed in the field and clarity in the office.

+
+
+
+
LynkedUp Pro
+
Owners Box
Dashboard
Projects
+
+
+
🔔
+
J
+
+
+
+
+
🏠Owners Box
+
📊Dashboard
+
🗂️Projects
+
👤Leads
+
🔀Pipeline
+
📡LynkDispatch
+
🗺️Territory Map
+
🎨Canvas
+
📐Measurements
+
💰Estimates
+
Client Experience
+
💳Billing
+
📋Team Schedule
+
📈Reports
+
🤖AI Assistant
+
⚙️Settings
+
+
+
Good morning, Justin 👋 Here's what's happening today.
+
Owners Box
+
+
📅Appointments
18
Today
+
🏗️Projects
27
In Progress
+
📤Estimates
14
Sent
+
💵Revenue
$48,750
This Week ↑
+
+
+
+
Today's Schedule
+
10 AM
Roof Inspection
123 Maple St · Justin J.
📍
+
11 AM
Estimate Review
456 Oak Ave · Sarah M.
📍
+
1 PM
Material Delivery
789 Pine Rd · Mike T.
📍
+
2 PM
Project Walkthrough
321 Cedar Ln · Justin J.
📍
+
+
+
Recent Activity
+
New Lead Added - John Smith
34m ago
+
Estimate Sent - 456 Oak Ave
1h ago
+
Project Updated - 789 Pine Rd
2h ago
+
Payment Received - 123 Maple St
3h ago
+
⚡ Hail Event Detected - TX-Tarrant Co.
5h ago
+
+
+
+
+
+
+
+ + + +
+
+
+
+ +

Every Screen Your
Reps Use All Day.
All From One Login.

+

CRM pipeline, LiDAR scanning, mobile rep app, and adjuster reports - all from one platform on any device.

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + CRM PIPELINE - 24 ACTIVE LEADS + +
+
CRM Dashboard
Pipeline kanban, lead tracking, and real-time metrics in one view
+
+ +
+
+ + + + + + + + + + + + + + + 44.7 ft + + AI SCAN COMPLETE · 5 ZONES · 19 IMPACTS → GENERATE REPORT + + LIDAR SCAN · 3.8 MIN + +
+
LiDAR Scan + AI
3D digital twin with AI-annotated hail impact zones and measurements
+
+ +
+
+ + + + + + + + + + + + + ✓ INSURANCE APPROVED + First submission · No callback + + SEND TO ADJUSTER → + +
+
Adjuster Report
One-click insurance-grade report with AI impact zones and storm data
+
+
+
+
+ + +
+
+
+
+ +

11 Contracts.
Same Day.
Zero Competition.

+

See how LynkedUp Pro performs in the field - from post-storm canvassing runs to adjuster-ready digital twin reports.

+
+ + + +
+ + +
+
+
+ + + + + + + + + 42.3 ft + + LiDAR SCAN ✓ + +
+
+ LiDAR Digital Twin +

Denton, TX - Post-Hailstorm Roof Assessment

+

Crew deployed LynkedUp Pro after the May hailstorm hit Denton. Drone scan on 14 properties in a single afternoon. AI flagged 312 individual hail impact zones. Every adjuster report auto-generated and filed same day.

+
+
14
Roofs scanned
+
312
Hail impacts flagged
+
3.8 min
Avg. scan time
+
$0
Per-report cost
+
+
+
+
+
+ + + + + + + + + ⚡ STORM EVENT - HOUSTON NW + + 3 REPS AUTO-DISPATCHED + +
+
+ Storm Canvassing +

Houston NW - Same-Day Storm Response

+

Alert fired at 2:14 PM. Three reps were auto-routed into the storm swath by 2:31 PM. By end of day, 11 contracts signed - all before a single competitor crew arrived the next morning.

+
+
17 min
Alert → reps deployed
+
11
Contracts signed
+
89
Homes scored
+
1st
On scene - zero competition
+
+
+
+
+ + +
+
+
+

❌ Before LynkedUp Pro

+
📋
Manual spreadsheets - Leads, jobs, follow-ups scattered across Excel, texts, and sticky notes.
+
⏱️
48-hour EagleView wait - $35-$87 per report, 1-2 day turnaround. Homeowners signed elsewhere.
+
📱
5+ disconnected apps - CRM, calendar, canvassing, measurements, billing - no sync, constant errors.
+
🌩️
Missed storm windows - Heard about hail from a neighbor. Competitors already had 20 contracts.
+
📄
Manual adjuster reports - Hours of documentation per job. Claims underpaid due to missing evidence.
+
+
+

✓ With LynkedUp Pro

+
🎯
Everything connected - One source of truth across your entire team from lead to final invoice.
+
4-minute AI scan - Drone deploys, LiDAR measures, AI annotates, report generated. On-site. Included.
+
📊
6 systems, one login - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - all in sync.
+
📡
First to the door - Sub-hour hail alerts auto-route reps to scored addresses before competitors check the news.
+
One-click adjuster reports - AI + LiDAR evidence packed into insurance-accepted PDFs. First submission gets approved.
+
+
+
+ + + +
+
+ + + +
+
+
+
+ +

5 Bills. 5 Logins.
Zero Storm
Intelligence.

+

The Texas roofing market has specialized tools - but no one has connected them. Until now.

+
+
vs. EagleView
01

Real-time vs. 48-hour wait

EagleView costs $15-$87 per report and takes up to 2 days. LynkedUp Pro's LiDAR drone scan delivers the same accuracy in under 4 minutes, on-site, included in your subscription.

+
vs. SalesRabbit
02

Storm-aware vs. generic canvassing

SalesRabbit's DataGrid shows homeowner data - but has no idea a hail event just happened two blocks over. LynkedUp Pro canvassing maps auto-reprioritize territories the moment a storm hits.

+
vs. JobNimbus / Roofr
03

Field-first vs. office-first

JobNimbus is a great office CRM. Roofr is a great measurement tool. Neither was built for a rep standing in a hail-damaged neighborhood needing a scan, estimate, and signed contract in 30 minutes.

+
vs. Loveland IMGING
04

Full workflow vs. inspection-only

Loveland/IMGING builds excellent drone digital twins for insurance inspections. But it stops there. LynkedUp Pro connects the drone scan directly into your CRM, canvassing, proposal, and claim workflow.

+
vs. RoofLink
05

AI-native vs. feature-patched

RoofLink is a solid Texas-based all-in-one. But it was built before LiDAR drones and storm-data APIs. LynkedUp Pro is architected from the ground up for AI diagnostics and geospatial intelligence.

+
vs. HailTrace
06

Intelligence + action, not just data

HailTrace gives you excellent hail maps. LynkedUp Pro takes that map and automatically routes your reps, scores every address, and triggers your canvassing workflow - no copy-paste required.

+
+
+
+ + +
+
+ +

Column by Column.
Win by Win.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp Pro ✦JobNimbusAccuLynxEagleViewRoofrSalesRabbit
Roofing-specific CRM~~
AI Roof Measurements (Built-In)~
Smart Calendar + AI Suggestions~~
Real-Time Hail Alerts~
LiDAR / Drone Digital Twin~
Adjuster-Ready Auto Reports~~
Storm Territory Canvassing Map~~~
Proposals + Digital Signatures
Owners Box Command Center
Flat-Rate Pricing (No Per-User Fees)~
Built Exclusively for Roofers~~~
+
+

✓ = Included    ~ = Partial or add-on cost    ✗ = Not available. Data based on publicly available information as of 2026. JobNimbus starts at $300/mo; AccuLynx estimated $60-$120/user/mo + $500-$5,000 onboarding fees. EagleView charges $15-$87 per report.

+
+
+ + +
+
+
+
+ +

Move the Sliders.
Watch $1,000+
Come Back.

+

Move the sliders and watch your current tool costs vs. LynkedUp Pro flat-rate pricing. The math usually surprises people.

+
+
+

Your Current Monthly Costs

+
Roof Reports / Month20 reports
+
Cost Per Report (EagleView avg)$35 / report
+
Current CRM Cost$300 / mo
+
Canvassing / Dispatch Tool$150 / mo
+
Field Team Size8 users
+
+
Your Current Monthly Stack
+
Report Fees (EagleView)$700
+
CRM Platform$300
+
Canvassing Tool$150
+
Per-User Tool Costs$200
+
Total Monthly Cost$1,350
+
+
+
+

With LynkedUp Pro at $349/mo

+
+
$1,001
+
Monthly savings vs. your current stack
+
+
+
Annual Savings
$12,012
+
Payback Period
~9 days
+
3-Year Total Saved
$36,036
+
LynkedUp Pro Cost
$349/mo
+
+
+ Lock In Your Savings → +

No contracts · Cancel anytime · Full onboarding included

+
+
+
+
+
+ + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+
+
+ +

+43% Close Rate.
$2,100 Saved.
11 Contracts in a Day.

+

Real crews. Real numbers. Real Texas storm seasons.

+
+ +
+
$2.1K
Saved / Month
+ * +
★★★★★
+
"I cut EagleView, JobNimbus, and SalesRabbit all in one move. LynkedUp Pro replaced all three for less money - and the measurements are actually better. Every insurance claim gets approved on the first submission now."
+
+
MT
+
+
Marcus Thompson
+
Operations Manager · Fort Worth, TX
+
+
+
+
+
17 min
Storm → Reps Out
+ * +
★★★★★
+
"The hail alert fired at 2:14 PM. By 2:31 PM my three reps were already on doors in the impact zone. By EOD we had 11 signed contracts. Our closest competitor showed up the next morning. That's the difference this makes."
+
+
SA
+
+
Sarah Alonzo
+
Business Development Manager · Houston, TX
+
+
+
+
+ +
+
+
🛡️
+
FOUNDERS
+
+
+

Founders Pricing Locked In

+

Lock in your Founders Lifetime rate today - one payment, no monthly fees, and no per-report charges. Your founding-member pricing is secured for as long as you use LynkedUp Pro.

+
+ ✅ Founders pricing locked in + ✅ One-time payment, no monthly fees + ✅ Keep your data regardless +
+
+
+
+
+ + +
+
+
+ +
+
+ + The results above are from real Texas crews, right now +
+

Your Next Storm Season
Can Look Like This -
Or Exactly Like Last One.

+

Jason jumped 43% on close rate. Marcus saved $2,100 a month. Sarah had 11 signed contracts the same afternoon hail dropped. Every one of them made one decision: swap 5 tools for one platform.

+
+ Book a demo + +
+
+ Founders pricing locked in + Free onboarding & training + Rated 4.9/5 by beta crews +
+
+
+ + +
+
+ +

Still On the Fence?
We've Heard
It All Before.

+
+

JobNimbus was built for multi-trade contractors and requires expensive add-ons for measurements and canvassing. AccuLynx charges per-user and doesn't include hail intelligence or LiDAR measurements. LynkedUp Pro includes all 6 core systems - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - in one flat-rate subscription built exclusively for roofers.

+

Yes, drone hardware is not included but LynkedUp Pro is compatible with DJI Mavic 3, DJI Mini 4 Pro, and most consumer DJI drones. Our software handles all scanning, processing, and report generation. FAA Part 107 certification may be required for commercial drone operations in your area.

+

We fuse data from HailTrace, HailWatch, and NOAA for dual-source storm coverage. When a hail event occurs in your service territory, you receive an instant push notification with the impact zone mapped and every address scored by hail severity. You can be knocking on doors within minutes of a storm ending.

+

No. Starter includes up to 3 users and Professional includes up to 15 users - both on flat monthly rates. Unlike EagleView ($15-$87 per report) or AccuLynx ($60-$120/user/month), you get unlimited reports and all features included in your subscription tier.

+

Most teams are fully onboarded within a week. We provide a dedicated onboarding session, video walkthroughs, and live chat support. The Owners Box admin panel makes it easy to manage compliance documents, team access, and accounting - no IT department required.

+

Absolutely. While we're especially powerful for storm restoration, the full CRM, scheduling, estimating, and billing suite is equally effective for retail roofing. The smart calendar and client experience features drive referrals and repeat business regardless of how you source jobs.

+
+
+
+ + +
+
+
+
+
🔥   Only a Few Licenses Left. Lock In $349/mo Forever
+

Storm Season Is Coming.
Will You Be Ready
This Time?

+

Every storm season you run on five broken tools is money left on the table. LynkedUp Pro pays for itself in the first storm week. Book a demo to see it in action.

+
+
02Days
+
:
+
14Hours
+
:
+
37Mins
+
:
+
44Secs
+
+ +

✅ Free onboarding call included  ·  ✅ Founders pricing locked in  ·  ✅ Cancel anytime

+
+
500+
Roofs Scanned in Beta
+
+
4 min
Scan to Adjuster Report
+
+
$0
Per-Report Fee. Ever.
+
+
4.9★
Avg Rating from Beta Crews
+
+
+
+ + +
+ +
+ + + + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/16.html b/public/page/16.html new file mode 100644 index 0000000..4c9c5bc --- /dev/null +++ b/public/page/16.html @@ -0,0 +1,1332 @@ + + + + + +LynkedUp Pro - Replace 5 Roofing Tools. One Flat $2000/mo. + + + + + + + + + + + + + + + + +
+

🔥  Only 12 Founding Member Spots Remaining  - Lock in $2000/mo forever   + + 02:14:37:44 + +  Claim Your Spot → +

+
+ + +
+
+
+ +
Trusted by 500+ Texas Roofers · Built by Roofers, For Roofers
+

Your Competitors
Run One Platform.
You Run Five.

+

LynkedUp Pro replaces EagleView, JobNimbus, SalesRabbit and more, one AI-powered platform at a flat $2000/mo. It's your assistant that never sleeps or takes a day off. No per-report fees. No per-user charges.

+ +
+ No credit card required + Free onboarding included + 30-day money-back guarantee +
+
+
$2.1M
Claims processed via platform
+
4 min
Avg scan to adjuster report
+
$0
Per-report fee. Ever.
+
4.9★
248 reviews
+
+ +
+ + +
+
+ Replaces & Integrates With +
+
+ EagleView + JobNimbus + SalesRabbit + QuickBooks + Google Calendar + Xactimate + DJI Drones + HailTrace +
+
+
+ + +
+
+
500+Roofs Scanned
in Beta
+
11Pilot Crews
Across Texas
+
$2.1MClaims Processed
via Platform
+
4 minScan to
Report
+
$2000Flat Rate
Per Month
+
+
+ + + +
+
+
The Problem
+

The Roofer Who
Wins the Storm Has
Software You Don't.

+

Texas roofers lose 3-5 jobs per storm season to competitors who showed up faster, scanned quicker, and filed cleaner claims.

+
+
+
🌩️
+

Storms Don't Wait

+

By the time you hear about a hail event, competitors have knocked 40 doors. You need alerts before the rain stops.

+ Costs: Jobs every storm +
+
+
📋
+

EagleView Bleeds You

+

$15-$87 per report. 48-hour wait. Homeowners sign with whoever shows up with numbers first.

+ Costs: $700-$2,000/mo +
+
+
🗂️
+

Claims Get Underpaid

+

Without AI-annotated hail impact documentation, adjusters reject or underpay. That's tens of thousands per job.

+ Costs: $10K-$50K per claim +
+
+
📅
+

Your Calendar Is Chaos

+

Double-bookings, no-shows, reps without context. Every miss is a homeowner who goes with someone else.

+ Costs: Lost referrals +
+
+
+
+ + + +
+
+
+
+
+
+ + Every storm season this gap costs you real jobs +
+

Hail Drops. Alert Fires.
Reps Move. Job Signed.
Before You Know It Rained.

+

LynkedUp Pro routes your team to the highest-damage doors within 17 minutes of a storm. AI scans the roof in 4 minutes. Proposal signed on-site. Adjuster report filed same day. All from one platform.

+
17 min
Storm → reps deployed
4 min
AI scan to report
$0
Per-report fee, ever
$2000
Flat rate, all in
+ +
+ No credit card + Free 30-min demo + 30-day guarantee +
+
+
+ + +
+
+
+
+
The Solution
+

6 Systems That
Actually Talk
to Each Other.

+

Everything from hail alert to signed invoice, all in one platform built exclusively for roofing.

+
    +
  • Replaces 5+ tools with one flat-rate subscription
  • +
  • No per-user fees, no per-report charges ever
  • +
  • Built exclusively for roofing, not adapted from generic CRM
  • +
  • Onboarded in under a week, full support included
  • +
+ +
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
👥

CRM

Pipeline automations, AI insights, and team performance tracking built for maximum close rates.

Pipeline · AI Insights
+
🎨

Canvas

Your sales toolbox: estimates, proposals, and digital signatures. Close jobs from anywhere.

Estimates · Proposals
+
📐

Measurements

AI + LiDAR roof measurements. Measure once, use everywhere. $0 per report, always.

AI · LiDAR · Instant
+

Client Experience

Automated follow-ups, digital contracts, and client portals that drive referrals on autopilot.

Portals · Reviews
+
💳

Billing

Invoicing, payment processing, and cash flow management that keeps every job profitable.

Invoices · Payments
+
🧮

Estimating

Material pricing, labor, margins, pre-loaded for roofing. Measurements to proposals in minutes.

Auto-Pricing · Templates
+
+
+
+ + +
+
+
Three Features That Change Everything
+

The Three Features
That Win Jobs While
Competitors Sleep.

+
+ + + +
+ + +
+
+
+ June 2026 +
+
+
Sun
Mon
Tue
Wed
Thu
Fri
Sat
+
+
1
2
3
4
5
6
7
+
8
9
10
11
10AM Insp.
12
1:30 Estim.
13
14
+
15
16
17
18
19
20
21
+
22
+
23
10AM Insp.
1:30 Estim.
+
24
10AM Delivery
25
26
27
28
+
29
30
1
2
3
4
5
+
+
+
+
+
AI Suggests: Traffic is moderate. Leave now for your 10:00 AM Roof Inspection at 123 Maple St.
+
+
+
+
+
+
Smart Scheduling
+

Your Calendar
Should Think Ahead.

+

Never miss what matters. Stay ahead every day. Your calendar syncs, suggests, and adapts, while you stay in control.

+
    +
  • 🔄Two-way sync with iOS Calendar, Google Calendar, and Calendly, so your whole team stays aligned automatically.
  • +
  • 🧠AI-suggested windows. Recommends optimal times, avoids conflicts, and checks traffic before nudging you to leave.
  • +
  • 🛡️You stay in control. Every suggestion is a nudge, not an override. You make the final call, always.
  • +
+
+
3
Calendars synced in real-time
+
98%
On-track rate this week
+
+
+
+ + +
+
+
+ Project #1286 - AI Measurement + AI-POWERED +
+
+ + + + + 27'-6" + + 18'-7" + + TOTAL ROOF AREA + 2,347 sq ft + 23.47 SQUARES + + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3289 SQ FT + TOTAL+2,347 SQ FT + +
+
+
Planes Measured14
+
Scan Time3.8 min
+
Total Area2,347.18 sq ft
+
+ Generate Xactimate-Style Report → +
+
+
AI Measurements
+

Measure Once.
Use Everywhere.

+

Stop paying EagleView $15-$87 per report and waiting 48 hours. LynkedUp Pro scans in minutes and generates insurance-grade reports instantly, included in your subscription.

+
    +
  • 🎯AI + LiDAR precision. Centimeter-accurate measurements on any roof in under 4 minutes, on-site.
  • +
  • 📋Xactimate-style reports, insurance adjusters accept them on the first submission.
  • +
  • Instant to estimate. Measurements feed directly into proposals. No re-entry, no errors.
  • +
+
+
10×
Faster than manual measurement
+
$0
Per-report fee. Flat rate only.
+
98.6%
AI + LiDAR accuracy
+
3.8
Minutes avg scan time
+
+
+
+ + +
+
+
+ ⚡ Storm Territory Map + 🚨 ACTIVE EVENT +
+
+
+
+
+
+
+
+
+
⚡ New event - 3 reps notified
+
+
+ Severe hail + Moderate hail + Your reps +
+
+
Priority Address Queue
+
📍 123 Maple StHIGH 94
+
📍 456 Oak AveHIGH 88
+
📍 789 Pine RdMED 71
+
📍 321 Cedar LnLOW 42
+
+
+
+
Hail Intelligence
+

First to the
Door. Every Storm.

+

Know about hail events before competitors check their weather app. Sub-hour alerts auto-route your reps to the highest-priority addresses within minutes of a storm.

+
    +
  • 📡HailTrace + HailWatch fusion. Dual-source storm data so you never miss an event in your territory.
  • +
  • 🗺️AI address scoring. Every home ranked by hail severity. Your reps hit the best doors first, automatically.
  • +
  • 📎Auto adjuster reports. LiDAR scan + storm data bundled into one insurance-accepted PDF, one click.
  • +
+
+
<1 hr
Alert to reps in the field
+
89
Addresses scored per storm event
+
+
+
+
+
+ + +
+
+
Competitive Edge
+

Column by Column.
Win by Win.

+

11 features. 6 platforms. The checkmarks tell the story.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp Pro ✦EagleViewJobNimbusAccuLynxSalesRabbitRoofr
AI Roof Measurements~
$0 Per-Report Fee~
Real-Time Hail Alerts~
Smart Calendar + AI~~
Roofing CRM Built-In~~
Adjuster-Ready Reports~~
Storm Canvassing Map~~
Proposals + E-Sign
Flat-Rate Pricing~~
Built Only for Roofing~~~
Owners Box Dashboard
+
+

✓ Full support  ·  ~ Partial/add-on  ·  ✗ Not available. Based on publicly available info, 2026.

+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + +
+
+
ROI Calculator
+

Move the Sliders.
Watch $1,000+
Come Back.

+

Move the sliders. Watch your current tool costs vs. one flat $2000/mo. The math usually surprises people.

+
+
+

Your Current Monthly Costs

+
+
Roof Reports / Month20 reports
+ +
+
+
Cost Per Report (EagleView avg)$35/report
+ +
+
+
CRM Tool Cost$300/mo
+ +
+
+
Canvassing Tool$150/mo
+ +
+
+
Field Team Size8 users
+ +
+
+
Cost Breakdown
+
Report Fees$700
+
CRM Platform$300
+
Canvassing Tool$150
+
Per-User Costs$200
+
Total Monthly$1,350
+
+
+
+

With LynkedUp Pro at $2000/mo

+
+
$1,001
+
Monthly savings vs. your current stack
+
+
+
Annual Savings
$12,012
+
Payback Period
~9 days
+
3-Year Total
$36,036
+
LynkedUp Cost
$2000/mo
+
+ Lock In My Savings → +

No contracts · Cancel anytime · Free onboarding

+
+
+
+
+ + + +
+
+
+
+
+
+ + One flat price replaces everything below +
+

Your Next Invoice
Could Be $2000.
Not $1,300.

+

EagleView. JobNimbus. SalesRabbit. A billing tool. A proposal tool. One by one they add up to $1,300+ a month, and none of them were designed for roofing. LynkedUp Pro replaces them all.

+
$1,300+
Current tool stack avg
$2000
LynkedUp Pro flat rate
$951
Monthly savings
30 days
Money-back guarantee
+ +
+ No credit card + Free 30-min demo + 30-day guarantee +
+
+
+ + + + +
+
+
Real Results
+

+43% Close Rate.
$2,100 Saved.
11 Contracts in a Day.

+
+ +
+
$2.1K
Saved/Month
+
★★★★★
+
"Cut EagleView, JobNimbus, and SalesRabbit in one move. LynkedUp Pro replaced all three for less, and every insurance claim gets approved on the first submission now."
+
+
MT
+
Marcus Thompson
Operations Manager · Fort Worth
+
+ * +
+
+
17 min
Storm→Doors
+
★★★★★
+
"Alert fired at 2:14 PM. Reps on doors by 2:31. By EOD we had 11 signed contracts. Our closest competitor showed up the next morning. That's the difference this makes."
+
+
SA
+
Sarah Alonzo
Business Development Manager · Houston, TX
+
+ * +
+
+
+
🛡️
GUARANTEED
+
+

30-Day Money-Back Guarantee

+

Try LynkedUp Pro for 30 days. If you don't save at least the cost of your subscription in report fees alone, we'll refund every cent. No questions. No hoops. No risk.

+
+ ✅ No credit card to start + ✅ Full refund, no questions asked + ✅ Keep your data regardless +
+
+
+
+
+ + +
+
+
Common Questions
+

Got Questions?

+
+
+ +

JobNimbus was built for multi-trade contractors and charges extra for measurements and canvassing. AccuLynx charges per-user with no hail intelligence or LiDAR. LynkedUp Pro includes all 6 core systems - CRM, Measurements, Hail Intelligence, Proposals, Billing, and Scheduling - in one flat-rate subscription built only for roofers.

+
+
+ +

Yes - drone hardware is not included but LynkedUp Pro works with DJI Mavic 3 and DJI Mini 4 Pro. Our software handles all scanning, processing, and report generation automatically. FAA Part 107 certification may be required for commercial drone use in your area.

+
+
+ +

None. Starter covers up to 3 users, Professional covers up to 15 - both flat monthly rates. Unlike EagleView ($15-$87 per report) or AccuLynx ($60-$120/user/month), you get unlimited reports and all features included in your tier. No surprises on your bill.

+
+
+ +

Most teams are fully onboarded and running within a week. Every plan includes a dedicated onboarding call, video walkthroughs, and live chat support. The Owners Box makes it easy to manage your whole team from day one - no IT required.

+
+
+
+
+ + +
+
+
+
+
🔥  Only 12 Founding Member Spots Remaining
+

Storm Season
Is Coming. Will You
Be Ready This Time?

+

Every storm season on five broken tools is money left on the table. LynkedUp Pro pays for itself in the first storm week.

+
+
02Days
+ : +
14Hours
+ : +
37Mins
+ : +
44Secs
+
+ +
+ ✅ No credit card + ✅ Free onboarding + ✅ 30-day guarantee + ✅ Cancel anytime +
+
+
$0
Per-Report Fee
+
+
4 min
Scan to Report
+
+
$2000
Flat Rate / Month
+
+
4.9★
Beta Crew Rating
+
+
+
+ + +
+ +
+ + + + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/17.html b/public/page/17.html new file mode 100644 index 0000000..45d4b1c --- /dev/null +++ b/public/page/17.html @@ -0,0 +1,426 @@ + + + + + + + + +LynkedUp Pro - Kill Your EagleView Bill. Scan in Minutes. + + + +
+
+
+
+
AI Measurements · LiDAR · $0/Report
+

While You Wait
48 Hours,
They Sign Someone Else.

+

EagleView makes you pay $15-$50 per report and wait two days. That's two days for a competitor to fly their own drone, hand the homeowner a quote, and close the job that was yours. LynkedUp Pro is your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews + $0 per report - always + Scan in minutes on-site + Insurance-grade accuracy +
+
+
$0
Per report fee. Ever.
+
10×
Faster than EagleView
+
$700+
Avg monthly EagleView bill
+
48 hrs
Wait time eliminated
+
+
+
+
+
+
+
The Problem
+

$700 a Month
to Lose Jobs Faster.
That's the EagleView Deal.

+

You're funding a per-report model built for a world before drones and AI existed. Every slow turnaround and every invoice is a self-inflicted wound on your close rate.

+
+
💸

$700+ a Month in Report Fees

20 reports at $35 each. 30 reports at $50 each. Active storm crews easily spend $700-$2,000 per month before any other software cost.

Cost: $8,400-$24,000/year
+

48-Hour Turnaround

You order the report, wait two days, then call the homeowner back. By then, two other roofers have already been on the roof and one has a signed contract.

Cost: 1 in 3 leads lost to speed
+
🔗

Disconnected from Your Workflow

EagleView report arrives as a PDF. You manually copy measurements into your estimate tool, then into your proposal. Three steps that should be zero.

Cost: 45+ min per job wasted
+
+
+
+ +
+
+
+
+
+
+ + Your money is leaving every time you order a report +
+

Every Job You Quote
Costs $35 Before You
Say a Word. Stop.

+

Run 20 jobs a month? That's $700 gone before a single shingle is sold. LynkedUp Pro scans the same roof in 4 minutes for exactly $0.00, and the report auto-fills your estimate.

+
+
+
$700+
+
EagleView / mo
+
+
+
+
$0.00
+
LynkedUp Pro / mo
+
+
=
+
+
$8.4K+
+
Back in your pocket / yr
+
+
+ +
+ No per-report fees ever + Free 30-min demo + Switch in one day +
+
+
+ +
+
+
+
+
The Fix
+

Scan It. Quote It.
Close It. Before You
Leave the Driveway.

+
+
+

LynkedUp Pro's AI measurement engine runs on your DJI drone. Fly the property, get centimeter-accurate measurements, and generate an insurance-grade report - all before you leave the driveway.

+
    +
  • 🎯Sub-centimeter precision - AI + LiDAR fusion delivers measurement accuracy insurance adjusters accept on first submission.
  • +
  • Minutes on-site, not 48 hours later - fly the drone, get the numbers, hand the homeowner a proposal while you're still standing there.
  • +
  • 🔄Auto-fills your estimate - measurements feed directly into Canvas proposals. No manual re-entry. No errors. No wasted hour.
  • +
  • 📎Xactimate-style output - reports formatted exactly how adjusters expect them, with full photo documentation and storm data included.
  • +
+
+
$0
Per-report cost
+
~4 min
Avg flight + scan time
+
10×
Faster than waiting on EagleView
+
1st
Submission approval rate
+
+
+
Your Monthly Savings
+
+
$700+
EagleView/mo
+
+
$0
LynkedUp Pro/mo
+
+
+
+
+
Project #1286 - AI MeasurementAI-POWERED
+
+ + + + + 27ft 6in + + TOTAL AREA + 2,347 sq ft + 23.47 SQUARES + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3+1,560 SQ FT + +
+
+
Scan Time~4 min
+
Planes Measured14
+
Report Cost$0.00
+
+ Generate Xactimate-Style Report → +
+
+
+
+ +
+
+
+
+
+
+ + The homeowner signs with whoever shows up first with numbers +
+

Your Competitor
Is Already On That Roof.
Are You?

+

The job doesn't go to the best roofer. It goes to the roofer who hands over a professional proposal while still standing in the driveway. That's LynkedUp Pro, on every single job.

+ +
+
+
EagleView
+
48 hrs
+
to get measurements
+
+
vs
+
+
LynkedUp Pro
+
4 min
+
on-site, before you leave
+
+
+ +
+ $0 per report + Insurance-grade accuracy + Live in 24 hrs +
+
+
+ +
+
+
+
+
Real Result
+

He Ditched EagleView
on a Tuesday. Saved
$2,100 by Friday.

+
+
$2.1K
Saved/Month
+
★★★★★
+

"Cut EagleView, JobNimbus, and SalesRabbit in one move. LynkedUp Pro replaced all three for less money - and the measurements are actually better. Every insurance claim gets approved on the first submission now. I don't know why I waited."

+
+
MT
+
Marcus Thompson
Operations Manager · Houston, TX
+
+ * +
+
+
+
+
+
+
+
💰 EagleView charges per report. We never do.
+

Your Next Report
Costs $0.
So Does Every One After.

+

One flat rate. Unlimited scans. See exactly how much you'd save - and how fast you'd close more jobs - in a free 30-minute demo.

+
+ + +
+
✅ No credit card✅ 30-day money-back guarantee✅ Free onboarding call
+
+
+ + +
+

© 2026 LynkedUp Pro  ·  See Full Platform →  ·  Privacy  ·  Terms

+

$349/mo flat rate · No credit card required · 30-day money-back guarantee · Built for roofing

+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + diff --git a/public/page/18.html b/public/page/18.html new file mode 100644 index 0000000..a62687d --- /dev/null +++ b/public/page/18.html @@ -0,0 +1,516 @@ + + + + + + + + +LynkedUp Pro - Replace 5 Roofing Tools With One $349/mo Platform + + + +
+
+
+
+
All-In-One Platform · Flat $349/mo · 6 Core Systems
+

Count Your
Subscriptions.
Now Cut Them.

+

EagleView. JobNimbus. SalesRabbit. A billing tool. A proposal tool. None of them talk to each other. LynkedUp Pro replaces all of them for $349/mo flat, and they all work together. It's your assistant that never sleeps or takes a day off.

+
+ Book a demo + +
+
+ 4.9★ · 248 reviews +
+
+ 6 core systems, one login + No per-user fees + No per-report charges +
+
+
$349
Flat rate - everything included
+
6
Core systems in one platform
+
$800+
Avg monthly savings vs. stack
+
1
Login. One source of truth.
+
+
+
+
+
+
+
The Real Cost
+

$1,300 a Month.
5 Logins. Zero
Working Together.

+

You're not just overpaying. You're also wasting hours every week copying data between tools that were never designed to work together.

+
+
What most Texas roofing crews pay right now
+
+
$700+
EagleView reports/mo
+
$300+
JobNimbus or AccuLynx
+
$200+
SalesRabbit canvassing
+
$100+
Billing + proposal tools
+
+
+
$1,300+
Total monthly tool stack
+
+
$349
LynkedUp Pro - all-in
+
$951
Saved every month
+
+
+
+
🔀

Data Lives in 5 Places

Lead is in JobNimbus. Measurement is in EagleView. Route is in SalesRabbit. Invoice is in QuickBooks. Nothing syncs. Your team copies and pastes all day.

Cost: 2+ hours/day wasted
+
💳

Hidden Fees Everywhere

EagleView per report. JobNimbus per user. SalesRabbit per user. AccuLynx add-ons. Your "software budget" doubles every time you add a rep.

Cost: Unpredictable monthly bill
+
🧩

None of It Was Built for Roofing

JobNimbus serves landscapers, plumbers, HVAC. SalesRabbit serves solar and insurance. You're adapting general tools to a specialized trade. That's the real problem.

Cost: Constant workarounds
+
+
+
+ + +
+
+
+
+
+
+ + Your tool stack bill arrives again next month +
+

$951 Back
in Your Pocket.
Every. Single. Month.

+

The math is simple. You're paying over $1,300/mo for tools that were never designed to work together. LynkedUp Pro does all of it for $349 flat, and the data flows between every module automatically.

+
$1,300+
Current tool stack /mo
$349
LynkedUp Pro flat rate
$951
Monthly savings
$11.4K
Annual back in pocket
+ +
+ No credit card + Free 30-min demo + 30-day guarantee +
+
+
+ +
+
+
+
+
The Fix
+

Cancel 4 Bills.
Keep One.
Run It All Better.

+
+
+

Every tool your roofing business needs - built to work together from day one. One login, one source of truth, one flat price that doesn't change when you hire your next rep.

+
+
👥
CRM
Pipeline, leads, AI insights
+
🎨
Canvas
Estimates, proposals, e-sign
+
📐
Measurements
AI + LiDAR, $0/report
+
Client Experience
Portals, reviews, follow-ups
+
💳
Billing
Invoices, payments, cash flow
+
🧮
Estimating
Auto pricing, templates
+
+
+ Plus hail alerts, smart calendar, adjuster reports, LiDAR scanning, and GPS rep tracking. All included. No add-ons. No surprises. No per-user math. +
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+
+
+
+
+
Real Result
+

He Cut Three Tools
on a Tuesday. Saved
$2,100 by Friday.

+
+
$2.1K
Saved/Month
+
★★★★★
+

"Cut EagleView, JobNimbus, and SalesRabbit in one move. LynkedUp Pro replaced all three for less, and the data actually flows between them. My team doesn't copy and paste anything anymore. It's a completely different way of running the business."

+
+
MT
+
Marcus Thompson
Operations Manager · Houston, TX
+
+ * +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ +
+
+
+
+
💰 Most crews save $800-$1,100/mo by switching to LynkedUp Pro
+

Your Stack Bill
Is Due Next Month.
Make It the Last One.

+

Cancel your EagleView, JobNimbus, and SalesRabbit subscriptions. Book a 30-minute demo and we'll show you exactly how.

+
+ + Book a demo +
+
✅ No credit card✅ 30-day money-back guarantee✅ Free onboarding + data migration help
+
+
+
+

© 2026 LynkedUp Pro  ·  See Full Platform →  ·  Privacy  ·  Terms

+

$349/mo flat rate · No credit card required · 30-day money-back guarantee · Built for roofing

+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/19.html b/public/page/19.html new file mode 100644 index 0000000..9130142 --- /dev/null +++ b/public/page/19.html @@ -0,0 +1,2116 @@ + + + + + +LynkedUp Pro - Field Intelligence Platform for Roofers + + + + + + + + + + + + + + + +
+

⏰  Founding Member Pricing Ends Soon  -  Lock in your rate before it's gone   + + 02: + 14: + 37: + 44 + +  → Book Now +

+
+ + +
+
+
+ +
Field Intelligence Platform - Built for Roofers, by Roofers
+

Your Competitor
Just Closed That Job.
With One App.

+

6 core systems in one intelligent CRM/ERP, built exclusively for roofing. Smart scheduling, AI measurements, real-time hail alerts, and your assistant that never sleeps or takes a day off.

+ +
4.9★ · 248 reviews
+
+
6
Core Systems
+
10×*
Faster Measurements
+
98%*
On-Track This Week
+
$48K*
Avg Weekly Revenue
+
+ +
+ + +
+
+
500+Roofs Scanned
in Beta
+
11Pilot Crews
Across Texas
+
$2.1MClaims Processed
via Platform
+
4 minAvg Scan
to Report
+
$2000Flat Rate
Per Month
+
+
+ + +
+
+ Works with +
+
+ QuickBooks + iOS + Android + Google Calendar + Calendly + Xactimate + EagleView + DJI Drones + HailTrace + HailWatch +
+
+
+ + +
+
+
+
+ +

Every Job You Lose Has
a Software Problem
at the Root.

+

Texas roofers are stitching together 4-6 tools that don't talk to each other, losing jobs while juggling apps.

+
+
🌩️

You miss storm events

By the time you see hail swath maps, competitors are already door-knocking the neighborhood and signing contracts.

+
📋

Estimates take too long

Waiting 48 hrs for EagleView reports means homeowners sign with the roofer who showed up fast with numbers.

+
🗂️

Insurance claims get denied

Adjuster reports missing hail impact documentation lead to underpaid claims and costly resubmissions.

+
📅

Scheduling chaos

Double-bookings, no-shows, reps without context. Your calendar shouldn't need babysitting - it should think for you.

+
+
+
+ + + +
+
+
+ +
+
+ + Right now, in your market +
+

A Storm Just Hit.
Your Competitor Got
the Alert First.

+

While you're checking the weather app, LynkedUp Pro users already have reps auto-routed to the highest-value streets in the swath. The window to be first is measured in minutes, not hours.

+
+
<1 hr
Alert to reps in the field
+
17 min
Avg storm → dispatch time
+
11
Contracts signed same day
+
$2000
All of this. Flat rate.
+
+
+ Book a demo + +
+
+ No per-user fees + No per-report costs + Founders pricing locked in +
+
+
+ + +
+
+
+
+ +

6 Weapons.
One Subscription.
Zero Left Behind.

+

All connected. All automated. All built to perform. From the first lead to the final invoice, nothing falls through the cracks.

+
    +
  • Pipeline automations and AI insights built in from day one
  • +
  • Seamless collaboration across office, sales reps, and field crews
  • +
  • One subscription - no per-user fees, no per-report surprises
  • +
  • Built for roofing by roofers - not adapted from generic software
  • +
+ +
+
+
+ LynkedUp Pro Overview Dashboard +
+
+
+
+
👥

CRM

High-output CRM with pipeline automations, AI insights, and team performance tracking built for maximum results.

Pipeline · AI Insights
+
🎨

Canvas

Your all-in-one sales toolbox. Create estimates, professional proposals, and close more jobs from anywhere.

Estimates · Proposals
+
📐

Measurements

AI-powered roof measurements - accurate, fast, and claim-ready. Measure once, use everywhere across every job.

AI · LiDAR · Instant
+

Client Experience

Automated follow-ups, digital contracts, and client portals that build trust and drive referrals on autopilot.

Portals · Reviews
+
💳

Billing

Get paid faster. Invoicing, payment processing, and cash flow management that keeps every job profitable.

Invoices · Payments
+
🧮

Estimating

Material pricing, labor, margins - all pre-loaded for roofing. Turn measurements into winning proposals in minutes.

Auto-Pricing · Templates
+
+
+
+ + +
+
+ +

Stop Paying for Apps
That Don't Talk
to Each Other.

+

From leads to final invoice, every detail connected so nothing slips through the cracks. One source of truth for your entire operation.

+
+
👤

Leads

Capture and qualify leads automatically.

+
📅

Schedule

Smart scheduling that adapts.

+
🔍

Inspections

Collect, document, and move forward.

+
💰

Estimates

Create faster. Win more.

+
📄

Proposals

Professional proposals that close.

+
🔨

Jobs

Stay on track. Every step.

+
📸

Photos

Everything in one place.

+
🧾

Invoices

Get paid faster. Keep cash flow strong.

+
+
+
⏱️

Save Time

Automate the busy work. Less admin, more productive hours out in the field where it counts.

+
🎯

Reduce Errors

Connected data means fewer mistakes. The right info at the right time, every time.

+
📈

Grow Faster

Better systems, better decisions, bigger results. Close more jobs and increase your margins.

+
+
+
+ + + +
+
+ +

Your Calendar
Should Think
Ahead.

+

An optimized calendar that learns, syncs, and suggests, while you stay in control. Never miss what matters. Always know what's next.

+
+
+
+
🔄

Sync Everywhere

Real-time two-way sync with iOS, Google Calendar, and Calendly. Your whole team stays aligned without the extra effort.

+
🧠

AI Suggests Best Times

Smartly suggests optimal scheduling windows, avoids conflicts, and even checks traffic to recommend when you should leave.

+
🛡️

You Stay In Control

Nothing changes without your approval. Every suggestion is a nudge. You always make the final call, every time.

+
📍

Location Ready

Directions and job details in one tap. Real-time alerts keep field reps on track and informed all day long.

+
+
+
📱 iOS Calendar
+
📆 Google Calendar
+
🔗 Calendly
+
+
+
3
Scheduled Today
+
1
In Progress
+
98%
On Track
+
+
+
+
+ June 23, 2026 +
+ + +
+
+
+
Sun
Mon
Tue
Wed
Thu
Fri
Sat
+
+
+
1
2
3
4
5
6
7
+
8
9
10
11
10AM Inspection
12
1:30PM Estimate
13
14
+
15
16
17
18
19
20
21
+
22
+
23
10AM Roof Insp.
1:30PM Estimate
+
24
10AM Material
25
26
27
28
+
29
30
1
2
3
4
5
+
+
+
+
+
Suggested Action: Traffic is moderate. Leave now for your 10:00 AM Roof Inspection at 123 Maple St.
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Measurement Summary - Project #1286 + AI-POWERED +
+
+ + + + + + 27'-6" + + 18'-7" + + TOTAL ROOF AREA + 2,347 sq ft + 23.47 SQUARES + + PLANE 1425 SQ FT + PLANE 2362 SQ FT + PLANE 3289 SQ FT + PLANE 4256 SQ FT + PLANE 5+1,015 SQ FT + +
+
+
Planes Measured14
+
Photos Attached24
+
Scan Time3.8 min
+
Total Roof Area2,347.18 sq ft
+
+ Book a demo +
+
+ +

Measure Once.
Use Everywhere.

+

AI-powered measurements that are accurate, fast, and claim-ready. Stop paying $15 to $87 per third-party report.

+
    +
  • 🎯AI Measurements - Measure any roof in minutes with AI & LiDAR precision you can trust and take to the adjuster.
  • +
  • 📋Claim Ready - Xactimate®-style reports with full photo evidence. Adjusters accept them the first time.
  • +
  • ☁️Sync Anywhere - Access on any device, anytime. Your whole team works from the same data.
  • +
  • Instant Estimates - Turn measurements directly into accurate material estimates in seconds.
  • +
+
+
10×*
Faster than manual
+
98.6%*
AI + LiDAR accurate
+
$0
Per-report fee
+
3.8*
Min avg scan time
+
+
+
+
+
+ + +
+
+
+
+ +

Every Advantage Your
Competition Wishes
They Had.

+

From the first hail alert to the signed contract and submitted claim - all in one workflow.

+
+
+
+ + AI Diagnostics +

LiDAR-Powered Digital Twin

+

Deploy a drone, walk the property - LynkedUp Pro auto-generates a centimeter-accurate 3D model of every roof in under 4 minutes. AI flags hail impacts, ridge damage, and granule loss automatically.

+
    +
  • Auto-annotated hail impact zones for adjuster reports
  • +
  • 3D measurements fed directly into estimates
  • +
  • Faster than EagleView - no 48-hour wait, no per-report fees
  • +
  • Photogrammetry + LiDAR fusion for insurance-grade accuracy
  • +
+
+
+ + Field Intelligence +

Geospatial Canvassing & Territory Maps

+

See every home in your territory on a live map - enriched with homeowner data, damage probability scores, and real-time rep tracking. Like SalesRabbit's DataGrid, but storm-aware.

+
    +
  • Live hail swath overlays on canvassing maps
  • +
  • Rep GPS tracking and territory assignment
  • +
  • Homeowner contact data enrichment per address
  • +
  • Damage probability scoring auto-updated after every storm
  • +
+
+
+
+
+ + Storm Intelligence +

Real-Time Hail & Storm Alerts

+

Get notified the moment a hail event drops in your county. Automatic territory prioritization and canvassing routes pushed to every rep's phone - before competitors even open their weather app.

+
    +
  • Sub-hour storm event notifications by county and zip
  • +
  • HailTrace and HailWatch dual-source data fusion
  • +
  • Auto-generated storm damage canvassing zones
  • +
  • Historical hail overlay for insurance documentation
  • +
+
+
+ + CRM + Estimates +

Roofing CRM with Instant Proposals

+

Manage every lead, job, and claim from one dashboard. AI-powered proposals with live material pricing generated on-site from your digital twin data. No copy-paste between tools.

+
    +
  • Satellite-to-proposal in under 5 minutes
  • +
  • Live material pricing with supplier integrations
  • +
  • Insurance supplement workflow built-in
  • +
  • Full pipeline from lead → signed contract → payment
  • +
+
+
+
+ Insurance Workflow +

Adjuster-Ready Reports in One Click

+

The most expensive gap in roofing software: you do the work, but the claim gets underpaid. LynkedUp Pro auto-generates adjuster reports that combine your LiDAR digital twin, AI-annotated hail impacts, and historical storm data into a single PDF - exactly what adjusters need, wired directly into your CRM and canvassing workflow.

+
+
98%*
Insurance-accepted report format
+
Auto
Hail impact annotation from AI scan
+
1-Click
Generate & send to adjuster
+
0 hrs
Manual report documentation time
+
+
+
+
+
+ + + +
+
+
+
+ +

Alert Fires. Reps Move.
Job Signed.
Before Rivals Wake Up.

+

Know about hail events before your phone rings. Hit the neighborhood while competitors are still checking the weather app.

+
+
+
+ ⚡ Storm Territory Map + 🚨 ACTIVE HAIL EVENT +
+
+
Live Storm Map - DFW Metro
+
+
+
+
+
+
+
+
+
+
⚡ New hail event detected - 3 reps notified
+
+
+ Severe hail (>1.5") + Moderate hail + Light hail + Your reps +
+
+
Addresses in storm zone247 homes
+
High-probability leads89 flagged
+
Reps auto-routed2 active
+
+
Priority Address Queue
+
📍 123 Maple St, Anytown
HIGH 94
+
📍 456 Oak Ave, Anytown
HIGH 88
+
📍 789 Pine Rd, Anytown
MED 71
+
📍 321 Cedar Ln, Anytown
LOW 42
+
+
+
+
    +
  • Real-Time Hail Alerts - Storm events fire instant notifications with impact zones mapped to your canvassing territory before competitors even open their weather app.
  • +
  • 🗺️Territory Intelligence - Every address scored by impact severity. Your reps go straight to the highest-value doors, auto-routed within minutes of a storm.
  • +
  • 🤖AI Damage Diagnosis - LiDAR drone scans build a 3D digital twin and AI-flags every hail impact in under 4 minutes - on-site, included in your subscription.
  • +
  • 📎Adjuster-Ready Reports - Auto-generated reports with full storm documentation sent directly to insurance - job done, first submission.
  • +
  • 📡HailTrace + HailWatch - Dual-source storm data fusion plus NOAA for maximum coverage. Never miss an event in your market.
  • +
+
+
4 min
AI Scan to Report
+
<1 hr
Alert to Reps in Field
+
+ +
+
+
+
+ + +
+
+
+
+ +

Storm Hits at 2PM.
Contracts Signed
by 5.

+
+
01

Storm Detected

Hail event fires a real-time alert. Territory map auto-highlights the impact zone and scores every address by priority.

+
02

Reps Dispatched

Field reps receive optimized canvassing routes on their phone with homeowner data pre-loaded per address.

+
03

AI Scan + Measure

Rep deploys drone. LynkedUp Pro builds a digital twin and AI-flags every hail impact in under 4 minutes.

+
04

Instant Proposal

Measurements feed directly into an on-site proposal with live material pricing. Customer signs on the spot.

+
05

Claim Filed

Auto-generated adjuster report with full documentation sent to insurance. Pipeline updated. Done.

+
+
+
+ + + +
+
+
+ +
+
+ + One platform - every system in your business +
+

From First Hail Alert
to Paid Invoice -
One Tool. That's It.

+

No switching between apps. No copy-paste errors. No missed steps. Every workflow connected end to end, so you spend your day closing jobs, not managing software.

+
+
4 min
Scan to full report
+
$0
Per-report fee. Ever.
+
98%
First-submission claim rate
+
5
Apps this replaces
+
+ +
+ Works on iOS & Android + Free onboarding call + Built for Texas roofers +
+
+
+ + +
+
+ +

See LynkedUp Pro in action.
Storm to signed contract.

+

Watch how a Texas crew goes from hail alert to filed insurance claim - in one afternoon, on one platform.

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
Watch 90-Second Demo
+
Storm alert → contract signed
+
+
+
+
+
0:00
Storm alert fires
+
0:18
Rep dispatched
+
0:35
Drone scan + AI
+
1:02
Proposal signed
+
1:28
Claim filed
+
+
+
+ Book a demo → +

30-minute walkthrough with a real roofing workflow · No sales pressure

+
+
+
+ + +
+
+ +

The actual software.
Not a mockup. Not a concept.

+

Every screen your reps, managers, and office team will use - designed for speed in the field and clarity in the office.

+
+
+
+
LynkedUp Pro
+
Owners Box
Dashboard
Projects
+
+
+
🔔
+
J
+
+
+
+
+
🏠Owners Box
+
📊Dashboard
+
🗂️Projects
+
👤Leads
+
🔀Pipeline
+
📡LynkDispatch
+
🗺️Territory Map
+
🎨Canvas
+
📐Measurements
+
💰Estimates
+
Client Experience
+
💳Billing
+
📋Team Schedule
+
📈Reports
+
🤖AI Assistant
+
⚙️Settings
+
+
+
Good morning, Justin 👋 - Here's what's happening today.
+
Owners Box
+
+
📅Appointments
18
Today
+
🏗️Projects
27
In Progress
+
📤Estimates
14
Sent
+
💵Revenue
$48,750
This Week ↑
+
+
+
+
Today's Schedule
+
10 AM
Roof Inspection
123 Maple St · Justin J.
📍
+
11 AM
Estimate Review
456 Oak Ave · Sarah M.
📍
+
1 PM
Material Delivery
789 Pine Rd · Mike T.
📍
+
2 PM
Project Walkthrough
321 Cedar Ln · Justin J.
📍
+
+
+
Recent Activity
+
New Lead Added - John Smith
34m ago
+
Estimate Sent - 456 Oak Ave
1h ago
+
Project Updated - 789 Pine Rd
2h ago
+
Payment Received - 123 Maple St
3h ago
+
⚡ Hail Event Detected - TX-Tarrant Co.
5h ago
+
+
+
+
+
+
+
+ + + +
+
+ +

Every screen.
Built for speed in the field.

+

CRM pipeline, LiDAR scanning, mobile rep app, and adjuster reports - all from one platform on any device.

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + CRM PIPELINE - 24 ACTIVE LEADS + +
+
CRM Dashboard
Pipeline kanban, lead tracking, and real-time metrics in one view
+
+ +
+
+ + + + + + + + + + + + + + + 44.7 ft + + AI SCAN COMPLETE · 5 ZONES · 19 IMPACTS → GENERATE REPORT + + LIDAR SCAN · 3.8 MIN + +
+
LiDAR Scan + AI
3D digital twin with AI-annotated hail impact zones and measurements
+
+ +
+
+ + + + + + + + + + + + + ✓ INSURANCE APPROVED + First submission · No callback + + SEND TO ADJUSTER → + +
+
Adjuster Report
One-click insurance-grade report with AI impact zones and storm data
+
+
+
+
+ + +
+
+
+
+ +

These Aren't Case Studies.
It's Proof Your Market
Is Winnable.

+

See how LynkedUp Pro performs in the field - from post-storm canvassing runs to adjuster-ready digital twin reports.

+
+ + + +
+ + +
+
+
+ + + + + + + + + 42.3 ft + + LiDAR SCAN ✓ + +
+
+ LiDAR Digital Twin +

Denton, TX - Post-Hailstorm Roof Assessment

+

Crew deployed LynkedUp Pro after the May hailstorm hit Denton. Drone scan on 14 properties in a single afternoon. AI flagged 312 individual hail impact zones. Every adjuster report auto-generated and filed same day.

+
+
14
Roofs scanned
+
312
Hail impacts flagged
+
3.8 min
Avg. scan time
+
$0
Per-report cost
+
+
+
+
+
+ + + + + + + + + ⚡ STORM EVENT - HOUSTON NW + + 3 REPS AUTO-DISPATCHED + +
+
+ Storm Canvassing +

Houston NW - Same-Day Storm Response

+

Alert fired at 2:14 PM. Three reps were auto-routed into the storm swath by 2:31 PM. By end of day, 11 contracts signed - all before a single competitor crew arrived the next morning.

+
+
17 min
Alert → reps deployed
+
11
Contracts signed
+
89
Homes scored
+
1st
On scene - zero competition
+
+
+
+
+ + +
+
+
+

❌ Before LynkedUp Pro

+
📋
Manual spreadsheets - Leads, jobs, follow-ups scattered across Excel, texts, and sticky notes.
+
⏱️
48-hour EagleView wait - $35-$87 per report, 1-2 day turnaround. Homeowners signed elsewhere.
+
📱
5+ disconnected apps - CRM, calendar, canvassing, measurements, billing - no sync, constant errors.
+
🌩️
Missed storm windows - Heard about hail from a neighbor. Competitors already had 20 contracts.
+
📄
Manual adjuster reports - Hours of documentation per job. Claims underpaid due to missing evidence.
+
+
+

✓ With LynkedUp Pro

+
🎯
Everything connected - One source of truth across your entire team from lead to final invoice.
+
4-minute AI scan - Drone deploys, LiDAR measures, AI annotates, report generated. On-site. Included.
+
📊
6 systems, one login - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - all in sync.
+
📡
First to the door - Sub-hour hail alerts auto-route reps to scored addresses before competitors check the news.
+
One-click adjuster reports - AI + LiDAR evidence packed into insurance-accepted PDFs. First submission gets approved.
+
+
+
+ + + +
+
+ + + +
+
+
+
+ +

Your Old Software Is Why
Your Best Leads Keep
Signing Elsewhere.

+

The Texas roofing market has specialized tools, but no one has connected them. Until now.

+
+
vs. EagleView
01

Real-time vs. 48-hour wait

EagleView costs $15-$87 per report and takes up to 2 days. LynkedUp Pro's LiDAR drone scan delivers the same accuracy in under 4 minutes, on-site, included in your subscription.

+
vs. SalesRabbit
02

Storm-aware vs. generic canvassing

SalesRabbit's DataGrid shows homeowner data - but has no idea a hail event just happened two blocks over. LynkedUp Pro canvassing maps auto-reprioritize territories the moment a storm hits.

+
vs. JobNimbus / Roofr
03

Field-first vs. office-first

JobNimbus is a great office CRM. Roofr is a great measurement tool. Neither was built for a rep standing in a hail-damaged neighborhood needing a scan, estimate, and signed contract in 30 minutes.

+
vs. Loveland IMGING
04

Full workflow vs. inspection-only

Loveland/IMGING builds excellent drone digital twins for insurance inspections. But it stops there. LynkedUp Pro connects the drone scan directly into your CRM, canvassing, proposal, and claim workflow.

+
vs. RoofLink
05

AI-native vs. feature-patched

RoofLink is a solid Texas-based all-in-one. But it was built before LiDAR drones and storm-data APIs. LynkedUp Pro is architected from the ground up for AI diagnostics and geospatial intelligence.

+
vs. HailTrace
06

Intelligence + action, not just data

HailTrace gives you excellent hail maps. LynkedUp Pro takes that map and automatically routes your reps, scores every address, and triggers your canvassing workflow - no copy-paste required.

+
+
+
+ + +
+
+ +

See exactly where we win.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp Pro ✦JobNimbusAccuLynxEagleViewRoofrSalesRabbit
Roofing-specific CRM~~
AI Roof Measurements (Built-In)~
Smart Calendar + AI Suggestions~~
Real-Time Hail Alerts~
LiDAR / Drone Digital Twin~
Adjuster-Ready Auto Reports~~
Storm Territory Canvassing Map~~~
Proposals + Digital Signatures
Owners Box Command Center
Flat-Rate Pricing (No Per-User Fees)~
Built Exclusively for Roofers~~~
+
+

✓ = Included    ~ = Partial or add-on cost    ✗ = Not available. Data based on publicly available information as of 2026. JobNimbus starts at $300/mo; AccuLynx estimated $60-$120/user/mo + $500-$5,000 onboarding fees. EagleView charges $15-$87 per report.

+
+
+ + +
+
+ +

You're Probably Spending
$1,200 a Month
on What This Replaces.

+

Move the sliders and watch your current tool costs vs. LynkedUp Pro flat-rate pricing. The math usually surprises people.

+
+
+

Your Current Monthly Costs

+
Roof Reports / Month20 reports
+
Cost Per Report (EagleView avg)$35 / report
+
Current CRM Cost$300 / mo
+
Canvassing / Dispatch Tool$150 / mo
+
Field Team Size8 users
+
+
Your Current Monthly Stack
+
Report Fees (EagleView)$700
+
CRM Platform$300
+
Canvassing Tool$150
+
Per-User Tool Costs$200
+
Total Monthly Cost$1,350
+
+
+
+

With LynkedUp Pro at $2000/mo

+
+
$1,001
+
Monthly savings vs. your current stack
+
+
+
Annual Savings
$12,012
+
Payback Period
~9 days
+
3-Year Total Saved
$36,036
+
LynkedUp Pro Cost
$2000/mo
+
+
+ Lock In Your Savings → +

No contracts · Cancel anytime · Full onboarding included

+
+
+
+
+
+ + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$1

+ DEMO ACCESS • $1 ONLY +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Try the Demo – Free, No Card +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+ +

Roofers Who
Switched. And Won.

+
+ +
$2.1K
Saved Monthly
★★★★★
I was paying EagleView, JobNimbus, and SalesRabbit separately. LynkedUp Pro replaced all three for less. The measurements are actually better - insurance claims get approved on the first try, every time.
MT
Marcus T.
Operations Manager · Fort Worth
*
+
4 min
Scan to Proposal
★★★★★
The AI calendar suggestions are a game changer. My reps never miss appointments and the route nudges actually help them plan smarter. Best scheduling and field tool I've ever used for a roofing sales team.
SA
Sarah A.
Business Development Manager · Houston
*
+
+
+
+ + +
+
+ +

Got Questions?
We Got Answers.

+
+

JobNimbus was built for multi-trade contractors and requires expensive add-ons for measurements and canvassing. AccuLynx charges per-user and doesn't include hail intelligence or LiDAR measurements. LynkedUp Pro includes all 6 core systems - CRM, Canvas, Measurements, Client Experience, Billing, and Estimating - in one flat-rate subscription built exclusively for roofers.

+

Yes, drone hardware is not included but LynkedUp Pro is compatible with DJI Mavic 3, DJI Mini 4 Pro, and most consumer DJI drones. Our software handles all scanning, processing, and report generation. FAA Part 107 certification may be required for commercial drone operations in your area.

+

We fuse data from HailTrace, HailWatch, and NOAA for dual-source storm coverage. When a hail event occurs in your service territory, you receive an instant push notification with the impact zone mapped and every address scored by hail severity. You can be knocking on doors within minutes of a storm ending.

+

No. Starter includes up to 3 users and Professional includes up to 15 users - both on flat monthly rates. Unlike EagleView ($15-$87 per report) or AccuLynx ($60-$120/user/month), you get unlimited reports and all features included in your subscription tier.

+

Most teams are fully onboarded within a week. We provide a dedicated onboarding session, video walkthroughs, and live chat support. The Owners Box admin panel makes it easy to manage compliance documents, team access, and accounting - no IT department required.

+

Absolutely. While we're especially powerful for storm restoration, the full CRM, scheduling, estimating, and billing suite is equally effective for retail roofing. The smart calendar and client experience features drive referrals and repeat business regardless of how you source jobs.

+
+
+
+ + +
+
+
⏰   Founding Member Pricing - Ends Soon
+

Ready to Leave
the Old Tools Behind?

+

Join roofing teams already using LynkedUp Pro to win more jobs, save thousands per month, and stay ahead of every storm.

+
+
02Days
+
:
+
14Hours
+
:
+
37Mins
+
:
+
44Secs
+
+ +

30-min walkthrough · Real roofing workflow · No sales pressure · Cancel anytime

+
+
98%
On-Track This Week
+
+
4 min
Avg Scan to Report
+
+
$2000
Flat Rate / Month
+
+
6
Core Systems Included
+
+
+
+ + +
+
+
+ +
+
+ + $2000/mo flat - one system to run your whole business +
+

Your Next Storm Run
Starts Clean -
or It Starts Behind.

+

Every roofing company in your market is either building a software advantage or falling behind one. LynkedUp Pro is the platform that wins the storm season. Hail alerts, AI scans, adjuster reports, and pipeline, all connected, all in one subscription.

+ +
+ Founders pricing locked in + Free onboarding & training + Texas support team +
+
+
+ + +
+ +
+ + + + + + + 🔥 Demo Access - $1 Only + + + + + + + + + diff --git a/public/page/2.html b/public/page/2.html new file mode 100644 index 0000000..0571b23 --- /dev/null +++ b/public/page/2.html @@ -0,0 +1,1620 @@ + + + + + +LynkedUp Pro - One platform to run your entire roofing business + + + + + + + +
+ + + + + +
+
+ + + Limited Founders Lifetime Deal · only a few licenses left + +

+ One platform to run your
entire roofing business. +

+

+ LynkedUp Pro unifies your calendar, CRM, LiDAR measurements, estimates, invoicing, and crew chat, so contractors close 41% more jobs without juggling six tools. It's your assistant that never sleeps or takes a day off. +

+ +
+
+ + Founders pricing locked in +
+
+
+ + 3,000+ pros onboarded +
+
+ + +
+
+
+ + + + app.lynkedup.pro/owners-box + +
+ +
+ LynkedUp Pro Owners Box - live pipeline, jobs, close rate, and crew utilization +
+ + +
+
+
+ +
+
+
Compliant
+
SOC 2 · Type II
+
+
+
+
+ +
+
+
G2 Rating
+
4.9★ · 248 reviews
+
+
+
+
+
+
+ + +
+
+
+
Trusted by 3,000+ roofing & exterior pros
+
+ RidgeWorks + PEAK&SLOPE + Stonefield Co. + NORTHRIDGE + Skyhaus⌃ +
+
+
+
+ + +
+
+ One ecosystem · Six native modules +

Everything your crew needs,
finally under one roof.

+

Stop paying for AccuLynx, JobNimbus, QuickBooks, Calendly, Slack, and a measurement add-on. LynkedUp Pro replaces all of them, natively integrated, no per-seat tax.

+
+ +
+
+
+
01 / Schedule
+
+ +
+

Intelligent Calendar

+

Auto-dispatch crews based on travel time, weather windows, and material readiness. The schedule books itself.

+ +
+
02 / Sell
+
+ +
+

Pipeline CRM

+

Every door-knock, callback, and contract on one timeline. Kanban + map view + SMS, built for roofers, not lawyers.

+ +
+
03 / Estimate
+
+ +
+

LiDAR Measurements

+

Point your phone at the roof. We return precise pitch, area, and material take-off in 30 seconds. No drones, no climbing.

+ +
+
04 / Invoice
+
+ +
+

Smart Invoicing

+

Stripe and ACH baked in. Send a deposit request from the truck, get paid before the tarps come off.

+ +
+
05 / Communicate
+
+ +
+

Crew Chat & Files

+

Photos, contracts, change orders, all attached to the job, not lost in a group text. Works offline on the site.

+ +
+
06 / Analyze
+
+ +
+

Owner's Box

+

Job-level margin, crew utilization, and supplier waste, surfaced as one number you can actually act on every Monday.

+
+
+
+ + +
+
+ How it works +

From cold lead to cashed check.
One continuous flow.

+

LynkedUp threads every step of a job through a single hub. No re-keying data, no exporting CSVs, no Slack-to-QuickBooks tab juggling at 9 PM.

+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + + +
Core hub
+
LynkedUp Pro
+
+
+ + +
+
+
1LEAD CAPTURE
+
Door-knock to deal
+
Storm leads, web forms, and referrals flow straight into the CRM.
+
+ +
+
+
2MEASURE
+
LiDAR scan
+
Phone-based measurement returns area & pitch in 30 seconds.
+
+ +
+
+
3ESTIMATE
+
AI proposal
+
Auto-generates branded estimate with material take-off and margin.
+
+ +
+
+
4SCHEDULE
+
Weather-aware dispatch
+
Crews booked around the forecast, traffic, and material delivery.
+
+ +
+
+
5EXECUTE
+
Job site sync
+
Crew updates, photos, and change orders attach to the job, not a group text.
+
+ +
+
+
6GET PAID
+
Invoice & reconcile
+
Stripe and ACH close the loop, straight to QuickBooks.
+
+
+
+
+
+ + + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Book a demo +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+ Loved by roofers nationwide +

3,000 contractors. One verdict.

+

From hail-chase teams in Texas to legacy slate shops in New England, LynkedUp has quietly become the operating layer for serious roofing companies.

+
+ +
+
+ + + +
+
★★★★★
+

"The Owners Box dashboard is the first time I've ever looked at my pipeline and immediately known what to do next."

+
+
+
+
Brenda Castillo
+
Operations Manager · Houston, TX
+
+
+
+ +
+
★★★★★
+

"Closed 41% more jobs in the first quarter. The weather-aware dispatch alone saved us four cancellations during hail season."

+
+
+
+
DeShawn Price
+
Operations Manager · Shreveport, LA
+
+ +41% CLOSE +
+
+ +
+
★★★★★
+

"I'm a one-person crew in Vermont. LynkedUp gives me the back office of a 50-person company. The Founders lifetime license paid for itself on job two."

+
+
+
+
Erin Holloway
+
Owner · Plano, TX
+
+
+
+ +
+
★★★★★
+

"The QuickBooks sync just works. Took 11 minutes from sign-up to first paid invoice."

+
+
+
+
Tomás Veliz
+
Owner · Houston, TX
+
+
+
+ +
+
★★★★★
+

"I evaluated AccuLynx, JobNimbus, and ServiceTitan. None of them measure roofs from your pocket. Done deal."

+
+
+
+
Jordan Mireles
+
Business Development Manager · Shreveport, LA
+
+
+
+ +
+
★★★★★
+

"Our office manager got 8 hours of her week back. That's literally a whole work day she now spends on customer follow-up."

+
+
+
+
Priya Anand
+
Co-Founder · Houston, TX
+
+ −8 HRS/WK +
+
+ +
+
★★★★★
+

"Best $349 I've spent on tools in 22 years. The fact that it's a one-time payment is the cherry on top."

+
+
+
+
Frank Delaney
+
Founder · Plano, TX
+
+
+
+ +
+
★★★★★
+

"Crews actually use it. That's the bar, and LynkedUp is the only software that's cleared it for us."

+
+
+
+
Renée Okafor
+
Owner · Shreveport, LA
+
+
+
+
+
+
+ + +
+
+
© 2026 LynkedUp Inc · Built for roofers, by ex-roofers.
+
+
+

+ * Figures shown are illustrative and reflect beta-period targets; individual results vary.
+ ** Founders Lifetime Deal is a one-time payment; limited founding-member availability. +

+
+
+ + +
+
+
+ +
+
Founders Lifetime Deal ends Friday, only a few licenses left
+
$2000 one-time · pays for itself in ~3 jobs
+
+
+
+
03
+ : +
14
+ : +
27
+ : +
42
+
+ +
+
+ +
+ + + + + + + + diff --git a/public/page/3.html b/public/page/3.html new file mode 100644 index 0000000..4bfcf53 --- /dev/null +++ b/public/page/3.html @@ -0,0 +1,1346 @@ + + + + + + +LynkedUp Pro - Field Intelligence. Not Just CRM. + + + + + + + + + + + + + + + +
+
+
+ + + Limited Founders Lifetime Deal, only a few licenses left + +

+ Field intelligence. Not just CRM. +

+

Experience workflow simplicity like never before. LynkedUp Pro unifies your calendar, CRM, LiDAR measurements, estimates, billing, and crew chat into one intelligent platform, built for roofers and contractors, by contractors. It's your assistant that never sleeps or takes a day off.

+ +
+
+ ★★★★★ + 4.9★ · 248 reviews +
+
+
Founders pricing locked in
+
+
SOC 2 Type II
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + +
+ + +
+ +
+
LiDAR live
+
±0.4 in accuracy
+
+
+
+ +
+
AI estimate
+
$18,420 · 72%
+
+
+
+
+ + +
+
+
+
+ +
+
+
Plan Better
+
Calendar that thinks ahead
+
+
+
+
+ +
+
+
Work Smarter
+
AI assistant in every step
+
+
+
+
+ +
+
+
Win More
+
+41% close rate avg.
+
+ * +
+
+
+ +
+
+
Grow Faster
+
$48k+ weekly avg revenue
+
+ * +
+
+
+
+ + +
+
+
Trusted by 3,000 roofing & exterior contractors
+
+ RidgeWorks + PEAK&SLOPE + A R T E S A N O + Stonefield Co. + NORTHRIDGE + Skyhaus⌃ +
+
+
+ + +
+
+ The Owners Box +

One platform. Every job. Zero drag.

+

Where roofing's field experience meets next-level technology. Pipeline, dispatch, measurements, and billing, all flowing through a single intelligent dashboard your whole team actually uses.

+
+ +
+ +
+
+ + + + app.lynkeduppro.com/dashboard + + +
+ +
+ + + + +
+ +
+ + + + + LynkedUp Pro dashboard - pipeline, revenue, and activity at a glance + LynkedUp Pro estimates - AI-generated proposal workflow + LynkedUp Pro project data - jobs, measurements, and timelines + LynkedUp Pro LynkDispatch - real-time job coordination +
+
+ + +
+
+ Companion App +

Your office, in your pocket.

+

Run Owners Box from the truck. Capture leads, scan roofs, send estimates, and collect payments, without ever opening a laptop.

+
    +
  • Offline-first, works in dead zones
  • +
  • iOS & Android · same data, same second
  • +
  • One-tap LiDAR scan from any iPhone
  • +
+
+
+
+
+
9:41●●●
+
+ + Project #1286 +
+
123 Maple St, Anytown, USA
+
+ Overview + Canvas + Measurements +
+
+ + + + + + + + + 24.5 ft + 18.2 ft + 16.8 ft + + +
+
+
Total Roof Area
+
1,892.34 sq ft
+ + + +
+ +
+
+ + +
+ LynkedUp Pro - contractor & crew management view +
+ + Live · Crew A on site · synced with Owners Box +
+
+
+
+
+ + +
+
+ See it in action +

From the truck to the rooftop, in two minutes.

+

Watch a real crew take a lead from door-knock to deposit: LiDAR scan, AI estimate, branded proposal, and Stripe payment, all without leaving the truck.

+
+ +
+
+
+ +
+ LynkedUp Pro demo - aerial roof view +
+ +
+ 2:14 + Product walkthrough +
+ +
LiDAR scan · live
+
AI estimate · $18,420
+
2,847 ft² · 6:12 pitch
+
+ + +
+ +
+
+ 00:08 + LiDAR roof scan from iPhone +
+
+ 00:42 + AI-generated proposal in 90s +
+
+ 01:18 + Crew dispatch + weather sync +
+
+ 01:52 + Stripe payment, QuickBooks sync +
+
+
+
+
+ + +
+
+ One ecosystem · Six native modules +

All connected. All automated. All built to perform.

+

Six native modules that share one source of truth. No more bouncing between AccuLynx, JobNimbus, QuickBooks, Calendly, Slack, and a measurement add-on.

+
+ +
+
+
+
+ +
+
01
+

CRM

+

Pipeline, automations, AI insights, and team performance built for maximum results.

+ +41% close rate avg +
+ +
+
+ +
+
02
+

Canvas

+

Door-to-door, territory mapping, and visual job planning, a digital whiteboard for the field.

+ Map-first +
+ +
+
+ +
+
03
+

Measurements

+

AI & LiDAR precision you can rely on. 10× faster than EagleView, claim-ready in minutes.

+ ±0.4 in accuracy +
+ +
+
+ +
+
04
+

Client Experience

+

Branded portal where homeowners view photos, sign contracts, and pay invoices, no logins needed.

+ 5-star reviews +
+ +
+
+ +
+
05
+

Billing

+

Stripe and ACH baked in. Two-way QuickBooks sync. Get paid before the tarps come off.

+ Stripe · ACH · Affirm +
+ +
+
+ +
+
06
+

Estimating

+

AI proposals that win. Material take-off, labor, and margin calc, branded and sent in 90 seconds.

+ 90-second proposals +
+
+
+
+ + +
+
+
+ Calendar AI +

Your calendar should think ahead.

+

An optimized calendar that learns, syncs, and suggests, while you stay in control. LynkedUp watches traffic, weather, and crew load every 15 minutes, then proposes one-tap fixes before a 7:32 AM thunderstorm blows up your whole Tuesday.

+ +
+
+
+ +
+
+

Sync

+

iOS · Google · Calendly · Outlook. Two-way sync, all devices, same second.

+
+
+
+
+ +
+
+

Suggest

+

AI proposes the best time, route, and next action, using live weather & traffic.

+
+
+
+
+ +
+
+

Control

+

Nothing changes without your approval. Every suggestion is a one-tap accept or dismiss.

+
+
+
+
+ +
+
+
+
+ + Calendar +
+
+ + May 12 - May 18, 2026 + +
+
+ Week ▾ + +
+
+
+
+
MON12
+
TUE13
+
WED14
+
THU15
+
FRI16
+
SAT17
+
SUN18
+
+
+
+ 8 AM9 AM10 AM11 AM12 PM1 PM2 PM +
+
+
+
+
10:00 AM
+
Estimate · 123 Maple St
+
+
+
+
+
10:00 AM
+
Roof Inspection · 456 Oak Ave
+
+
+
11:00 AM
+
Follow Up · 789 Pine Rd
+
+
+
+
+
+
9:30 AM
+
Material Order · ABC
+
+
+
1:00 PM
+
Client Call · Whitfield
+
+
+
+
+ + +
+
+
+ +
+
+
Suggested actions
+
LynkedUp AI · just now
+
+
+

Traffic is moderate. Suggest leaving now for your 10:00 AM inspection. Save 14 min by routing through Cherry Creek.

+
+ + +
+
+
+
+ + +
+
+ + iOS +
+
+ + Google +
+
+ + Calendly +
+
+ + Outlook +
+
+
+
+
+ + +
+
+ AI-Powered Precision +

Measure once. Use everywhere.

+

AI-powered measurements that are accurate, fast, and claim-ready. Point your phone at the roof, we return precise pitch, area, and material take-off in 30 seconds. No drones, no climbing, no $85 EagleView report.

+
+ +
+
+ +
+ LynkedUp dispatch and AI roof measurement view + + + +
+ + +
+
+
+
+ LynkedUp mobile measurement summary screen +
+
+
+
+ + +
+
+
+
10× Faster
+
Measure in minutes, not hours
+ * +
+
+
+
98% Accurate
+
AI & LiDAR precision you can rely on
+ * +
+
+
+
Claim Approved
+
Evidence-backed reports that get paid
+ * +
+
+
+
Cloud Sync
+
Real-time access across your team
+ * +
+
+
+
Maximize Profit
+
Better data · better estimates · bigger wins
+ * +
+
+
+
+ + +
+
+ One System · One Source of Truth +

All your work. Connected. All in one place.

+

From leads to final invoice, every detail connected, so nothing slips through the cracks. Built for roofing. Built for you.

+
+ +
+
+ +
+
+
+
+

Leads

+

Capture and qualify leads automatically.

+
+
+
+
+
+

Schedule

+

Smart scheduling that adapts to your day.

+
+
+
+
+
+

Inspections

+

Collect, document, and move forward.

+
+
+
+
+
+

Estimates

+

Create faster. Win more.

+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+

Proposals

+

Professional proposals that close.

+
+
+
+
+
+

Jobs

+

Stay on track every step.

+
+
+
+
+
+

Photos

+

Everything in one place.

+
+
+
+
+
+

Invoices

+

Get paid faster. Keep cash flow strong.

+
+
+
+
+ + +
+
+
+
+

Save Time

+

Automate the busy work and focus on what matters.

+
+
+
+
+
+

Reduce Errors

+

Connected data means fewer mistakes.

+
+
+
+
+
+

Grow Faster

+

Better systems · better decisions · bigger results.

+
+
+
+
+
+ + + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+
+ +
+
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + +
+
+ Built for the field +

Real crews. Real roofs. Real results.

+

From hail-chase teams in Texas to legacy slate shops in New England, LynkedUp Pro is on the ladder, on the truck, and in the office.

+
+ + +
+ + +
+
+ Loved by 3,000+ contractors +

Smarter measurements. Stronger claims. Bigger results.

+

From hail-chase teams in Texas to legacy slate shops in New England, LynkedUp Pro has quietly become the operating layer for serious roofing companies.

+
+ +
+
+
★★★★★
* +

"We killed five subscriptions the week we switched to LynkedUp. The LiDAR alone closes deals before competitors can even climb the ladder. It's the first software that actually feels built for our trade."

+
+ Marcus Holloway +
+
Marcus Holloway
+
Owner · Plano, TX
+
+ VERIFIED +
+
+
+
★★★★★
* +

"The Owners Box dashboard is the first time I've ever looked at my pipeline and immediately known what to do next."

+
+ Brenda Castillo +
Brenda Castillo
Operations Manager · Houston, TX
+
+
+
+
★★★★★
* +

"Closed 41% more jobs in the first quarter. The weather-aware dispatch alone saved us four cancellations during hail season."

+
+ DeShawn Price +
DeShawn Price
Operations Manager · Shreveport, LA
+ +41% +
+
+
+
★★★★★
* +

"I'm a one-person crew in Vermont. LynkedUp gives me the back office of a 50-person company. The Founders lifetime license paid for itself on job two."

+
+ Erin Holloway +
Erin Holloway
Owner · Plano, TX
+
+
+
+
★★★★★
* +

"Took 11 minutes from sign-up to first paid invoice. The QuickBooks sync just works."

+
+ Tomás Veliz +
Tomás Veliz
Owner · Houston, TX
+
+
+
+
★★★★★
* +

"I evaluated AccuLynx, JobNimbus, and ServiceTitan. None of them measure roofs from your pocket. Done deal."

+
+ Jordan Mireles +
Jordan Mireles
Business Development Manager · Shreveport, LA
+
+
+
+
★★★★★
* +

"Our office manager got 8 hours of her week back. That's a whole work day spent on customer follow-up now."

+
+ Priya Anand +
Priya Anand
Co-Founder · Plano, TX
+ −8 HRS/WK +
+
+
+
★★★★★
* +

"Best $349 I've spent on tools in 22 years. The fact that it's a one-time payment is the cherry on top."

+
+ Frank Delaney +
Frank Delaney
Founder · Houston, TX
+
+
+
+
★★★★★
* +

"Crews actually use it. That's the bar, and LynkedUp is the only one that's cleared it for us."

+
+ Renée Okafor +
Renée Okafor
Owner · Shreveport, LA
+
+
+
+
+ + +
+
+
+
+ + + Founders Lifetime Deal closes in + +

The last roofing CRM you'll ever buy.

+

Join 3,000+ contractors who've ditched their monthly stack. One payment, one platform, one less thing to think about every billing cycle.

+ +
+
+
Deal ends Friday 11:59 PM PT
+
+
03
Days
+
14
Hours
+
27
Mins
+
42
Secs
+
+
+ 38 / 50 licenses claimed +
+
+
+
+
+
+ + +
+
+
+ LynkedUp Pro +

Built for roofers. Driven by innovation. One system. One source of truth.

+
+ SOC 2 Type II + GDPR Ready +
+
+
+
+
© 2026 LynkedUp Inc · Built for roofers and contractors, by contractors.
+
Built for roofing. Built for you.
+
+ +
+ + +
+
+
+ +
+
Founders Lifetime Deal ends Friday, only a few left
+
$2000 one-time · pays for itself in ~3 jobs
+
+
+
+
03d
+
14h
+
27m
+
42s
+
+ +
+
+ + + +
+ + + + + + + + diff --git a/public/page/4.html b/public/page/4.html new file mode 100644 index 0000000..19be51d --- /dev/null +++ b/public/page/4.html @@ -0,0 +1,1125 @@ + + + + + +LynkedUp Pro - Field Intelligence Platform for Roofers + + + + + + + + + + + + +
+
+
+
The platform roofing crews actually use
+

RUN YOUR
WHOLE COMPANY
FROM ONE
SCREEN

+

Schedule crews, measure roofs, chase hail storms, close insurance claims, all without switching apps. It's your assistant that never sleeps or takes a day off. Built ground-up for roofers. Not adapted from something else.

+ +
4.9★ · 248 reviews
+
+
+
2+ hrs
+
Saved per crew per day
+
+
+
$850
+
Avg. monthly savings vs. stacked tools
+
+
+
6
+
Integrated core systems
+
+
+
98%
+
Customer retention rate
+
+
+
+ + +
+
+
+
app.lynkeduppro.com/dashboard
+ LynkedUp Pro Owner's Dashboard - live KPIs, pipeline, revenue, and crew performance in one screen +
+ LynkedUp Pro mobile app - field crew view +
+
+ + +
+
+ Replaces +
+
+ + + + + + +
+
+
+ + +
+
+
+ +
YOUR SOFTWARE
IS COSTING YOU JOBS
+

Most roofers are duct-taping 5-6 apps together and losing hours, leads, and money every week because of it.

+
+
+
+
💸
+

5 Bills. 5 Logins. 5 Problems.

+

Average roofer pays $900-$1,400/mo across tools that don't talk to each other, and still falls through the cracks between them.

+
+
+
⏱️
+

You've Typed That Address Three Times Today

+

Data re-entered across systems. Addresses wrong, jobs duplicated, leads lost. Your crew wastes hours every week on things software should handle.

+
+
+
🌩️
+

Your Competitor Knocked Those Doors First

+

Without real-time hail alerts, you find out about storm damage after the block is already canvassed. Speed wins in storm restoration.

+
+
+
📋
+

That Adjuster Report Took 90 Minutes. Again.

+

Manual photo sorting, scope notes, damage docs, built from scratch every time. While the homeowner waits. And your close rate suffers.

+
+
+
+
+ + +
+

There's a Better Way to
Run a Roofing Company

+

One platform replaces all of it, and pays for itself in the first week.

+ +
+ + +
+
+
+
+ +
SIX TOOLS.
ONE LOGIN.
ZERO CHAOS.
+
+
+

Every module purpose-built for roofing. Every system talking to each other. Stop paying for add-ons. It's all here.

+ See Pricing → +
+
+
+
+
01
+
📅
+

Schedule It. Route It. Forget It.

+

AI scheduling that routes crews by location, weather, and skill. Drag-and-drop dispatch with automated homeowner texts. No phone tag.

+ AI Routing +
+
+
02
+
📐
+

Measure Any Roof in 60 Seconds

+

Instant aerial measurements with pitch detection. Drone + LiDAR digital twin creation. Estimate from your truck, not the ridge cap.

+ LiDAR + Drone +
+
+
03
+
🌩️
+

Get to the Storm Before Anyone Else

+

Real-time NEXRAD radar alerts mapped to your customer list. Know which streets got hit and deploy canvassing crews before competition shows up.

+ Real-Time Radar +
+
+
04
+
📊
+

Never Let a Lead Slip Through Again

+

Visual sales pipeline built for roofing, from first knock to signed contract to install complete. Built for how you actually sell, not how a generic CRM thinks you do.

+ Full Pipeline +
+
+
05
+
📄
+

Close the Claim in 3 Minutes, Not 90

+

One-click insurance reports with auto photo organization, scope notes, and damage documentation. Adjusters love them. Homeowners sign faster.

+ 3-Min Reports +
+
+
06
+
📈
+

See Your Whole Business. Right Now.

+

Live KPIs, crew performance, revenue, and job costing, all in one dashboard. Know what's happening on every job without making a single call.

+ Live KPIs +
+
+
+
+ + +
+

Why Are You Still Paying
for 5 Separate Subscriptions?

+

All 6 systems. One flat rate. Starting at $149/month with a 14-day free trial.

+ +
+ + +
+
+
+ +
YOUR CREWS SHOULD
BE ON ROOFS.
NOT IN TRAFFIC.
+
+
+
+

Stop manually dispatching and chasing down confirmations. The Smart Calendar handles routing, weather, and homeowner communication, automatically.

+
+
+
🗺️
+
+

Stop Wasting Windshield Time

+

AI groups jobs by territory and skill, cutting drive time and adding 2+ productive hours to every crew's day.

+
+
+
+
☁️
+
+

Rain Cancels Itself

+

Weather-aware scheduling auto-reschedules installs when rain hits the forecast and notifies homeowner and crew. You don't touch a thing.

+
+
+
+
🔔
+
+

Homeowners Know Before They Ask

+

Branded confirmations, reminders, and arrival windows go out automatically. Fewer no-shows. Happier customers.

+
+
+
+
🔄
+
+

Your Whole Team, Always in Sync

+

Two-way Google & Outlook sync means office and field see the same schedule. No more "I didn't get that update."

+
+
+
+
+ + View Plans +
+
+ +
+ LynkedUp Pro Smart Calendar - AI crew dispatch, routing, and scheduling +
+
+
+
+ + +
+
+
+ +
WHILE THEY CHECK
THE WEATHER,
YOU'RE KNOCKING.
+
+
+
+

Real-time NEXRAD radar alerts pinpointed to your customer map. You'll know which streets got hit before the hail has even stopped falling.

+
    +
  • Alerts down to individual addresses, not vague zip codes that send you to the wrong neighborhood
  • +
  • 🗺️
    See exactly which of your past customers got hit so you can call before a competitor knocks
  • +
  • 📱
    Push your canvassing team to the right streets instantly with pre-loaded door knock scripts
  • +
  • 📊
    Historical storm data reveals the zip codes in your market most likely to get hit next
  • +
  • 🤝
    Affected addresses auto-become leads with follow-up tasks queued, no manual entry needed
  • +
+
+ + All Features +
+
+ +
+
+ Hail Intelligence - Dallas / FW + 🔴 ACTIVE ALERT +
+
+ Real-time hail impact map pinpointed to your customer database +
+
+
Affected Addresses - Your Database
+
1822 Elm St, Grapevine TX🔴 High Priority
+
407 Oak Ave, Euless TX🟠 Medium
+
309 Maple Dr, Grapevine TX🔴 High Priority
+
2100 Cedar Ln, Irving TX🟢 Monitor
+
+
+
+
+
+ + +
+

A Storm Just Hit Your Market.
Are You First or Fourth?

+

Hail Intelligence is included in every plan. No add-on, no per-alert fee.

+ +
+ + +
+
+
+ +
WHAT HAPPENS WHEN
YOU STOP DUCT-TAPING
TOOLS TOGETHER
+
+
+
+
+43%
Revenue
+
★★★★★
+
"We replaced JobNimbus, EagleView, and SalesRabbit in one shot. The hail alert alone got us to 11 houses before anyone else in our market showed up."
+
+
MR
+
Marcus Rivera
Owner · Plano, TX
+
+ * +
+
+
$1,100
Saved/mo
+
★★★★★
+
"I was paying for 5 different subscriptions. Switched to LynkedUp Pro and cut my software bill by $1,100 a month, and everything actually works together."
+
+
KJ
+
Kyle Jensen
Owner · Houston, TX
+
+ * +
+
+
3 min
Adj. Reports
+
★★★★★
+
"Reports used to take me an hour. Now it's 3 minutes and adjusters comment on how professional they look. We close faster because of it."
+
+
SH
+
Sarah Hendricks
Business Development Manager · Shreveport, LA
+
+ * +
+
+
+
+ + +
+

Your Competitors Are
Already Using This. Are You?

+

14-day free trial. Full setup in 48 hours. No credit card to start.

+ +
+ + +
+
+
+ +
EVERYTHING THEY
CHARGE EXTRA FOR -
WE INCLUDE.
+

The full-stack comparison your current vendor hopes you never see.

+
+
+ + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp ProJobNimbusAccuLynxEagleView
AI Measurements IncludedAdd-on
Hail Alerts (Real-Time) Included
Smart Calendar / AI Routing IncludedBasicBasic
LiDAR Digital Twins IncludedAdd-on
1-Click Adjuster Reports 3 min avg.ManualManual
Owner's Dashboard (Live KPIs) IncludedLimitedLimited
Monthly Cost (full stack)$149-$349$400+ w/ add-ons$350+ w/ add-onsPer-report fees
+
+ +
+
+ + + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + +
+
+
+ +
YOU ASKED.
WE ANSWERED.
+
+
+
+ +

Most teams are fully operational within 48 hours. We handle data migration, crew setup, and walk through every module live on Zoom. No IT department required.

+
+
+ +

Yes. We have direct import tools for JobNimbus, AccuLynx, and Roofr. Your customers, jobs, and history come with you. We've done this hundreds of times.

+
+
+ +

Yes. The mobile app has full offline mode. Photos, notes, and measurements sync automatically when you're back on a network. Field work doesn't stop when the signal does.

+
+
+ +

Our AI measurements are within 1-3% of manual measurements on standard residential roofs, validated against EagleView. LiDAR adds sub-inch precision for complex commercial jobs.

+
+
+ +

Month-to-month on all plans. No annual contract required unless you want a discount. Cancel any time with 30 days notice. We don't lock you in.

+
+
+ +

JobNimbus is a general contractor CRM adapted for roofing. We're built from scratch for roofing, every field, every workflow, every report. Plus measurements, hail alerts, and drone integration they don't offer.

+
+
+
+

Still not sure? We'll walk you through the whole thing, live, no pressure.

+ Talk to a Roofing Tech Expert +
+
+
+ + +
+
+

YOUR NEXT JOB
IS WAITING ON YOU
TO DO THIS.

+

Book a 20-minute demo. We'll show you exactly how much time and money you're leaving on the table, and what it looks like when you're not.

+ +

No credit card. No obligation. Just a straight conversation about your business.

+
+
+ + +
+ +
+ + + + + + + diff --git a/public/page/5.html b/public/page/5.html new file mode 100644 index 0000000..6cda9b4 --- /dev/null +++ b/public/page/5.html @@ -0,0 +1,1451 @@ + + + + + +LynkedUp Pro - AI-Powered Roofing Operations + + + + + + + + + + + +
+
+
+
+
+
+ +
+
+
+ AI-Powered · LiDAR · Geospatial +
+

+ Stop Climbing Roofs
+ to Know What
+ Needs Fixing. +

+

+ LynkedUp Pro combines real-time geospatial mapping, AI roof diagnosis, and LiDAR-powered instant estimates, so your crew closes faster, wastes less time, and wins more jobs. It's your assistant that never sleeps or takes a day off. +

+ +

4.9★ · 248 reviews

+
+
+
3.2x*
+
Faster Estimates
+
+
+
94%*
+
Diagnosis Accuracy
+
+
+
$47k*
+
Avg. Revenue/Mo
+
+
+
+ + +
+ LynkedUp Pro operations dashboard +
+
+
+ + +
+
+
+
1,200*
+
Roofs measured
+
+
+
38k*
+
Roofs diagnosed with AI
+
+
+
10.9min*
+
Avg. estimate time (was 3hrs)
+
+
+
98.6%*
+
Customer satisfaction score
+
+
+
+ + +
+
+
+
+
+
01 - Geospatial Mapping
+

+ See Every Roof in Your
+ Territory Before You
+ Leave Your Truck.
+

+

+ Why drive around guessing? LynkedUp Pro overlays your entire service area with real-time roof data, job status, AI flags, and opportunity scores, live on your screen. +

+
+
+
+

Live territory overlay, every property color-coded by roof condition, job stage, and revenue potential.

+
+
+
+

Route optimization. Plan 8 site visits in the time it used to take for 3. Never backtrack.

+
+
+
+

Storm damage heat maps. When hail hits, see affected roofs in your area instantly and move first.

+
+
+ +
+ +
+ LynkedUp Pro geospatial territory map +
+
+
+ + +
+
+
+
For Roofing Contractors
+

+ Your Competitors Are
+ Knocking on Doors at Random.
+ You Don't Have To. +

+

+ LynkedUp Pro helps your team scout potential clients more efficiently with homeowner data and storm tracking, ranked by urgency and estimated job value before you show up. +

+ +
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
+
+ AI Roof Diagnosis · v3.2 +
+
+
+
+
+
+
2 damage zones detected
+
+
+
+
1847 Birchwood Ave
+
Scan: 14s · Model: roof-diag-v3
+
+
HIGH RISK
+
+
+
+
+ Granule loss - NW quadrant, ~180 sqft + 98% +
+
+
+ Flashing separation near chimney + 91% +
+
+
+ Minor curling shingles - SE ridge + 84% +
+
+
+ Gutters clear - no debris buildup + 96% +
+
+
+
Lynk Dispatch recommendation
+
Full replacement recommended within 12-18 months. Estimated scope: 2,340 sqft, asphalt shingle. Insurance claim likely eligible.
+
+
+
+
+ +
+
02 - AI Roof Diagnosis
+

+ Know Exactly What's
+ Wrong - Without
+ Climbing Up There.
+

+

+ Use our proprietary drones and AI damage detection (beta) to scan roof photos in seconds, with confidence scores so you can quote accurately the first time. +

+
+
+
+

Quick AI scan. Upload a photo from your phone. AI returns full diagnosis with zone mapping.

+
+
+
+

Insurance-ready reports, one-click PDF export with annotated images, findings, and repair scope.

+
+
+
+

Before/after comparison. Document job completion with visual proof customers trust and insurers accept.

+
+
+ +
+
+
+ + +
+
+
+
+
+
03 - LiDAR Instant Estimates
+

+ Stop Losing Jobs
+ Because Your Quote
+ Came in Two Days Late. +

+

+ LynkedUp Pro uses LiDAR data to measure roof pitch, surface area, and material needs with millimeter precision, in rapid time, from anywhere, on any device. +

+
+
+
+

No site visit needed for estimates. Generate professional quotes from the office using LiDAR aerial data.

+
+
+
+

Material cost auto-calculation, synced with live lumber and shingle pricing so margins stay protected.

+
+
+
+

Digital proposal in one click. Send e-sign-ready quotes to customers before your competitor even visits the site.

+
+
+ +

while you're still at the property

+
+ +
+ LynkedUp Pro LiDAR instant estimate +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ +
+
+
No More Guesswork
+

+ Your Next Quote Could Be
+ Ready Before the
+ Homeowner Hangs Up. +

+

+ LiDAR + AI means your estimate is more accurate than a hand-measured one, and it's done in the time it takes to have a coffee. Win the job before anyone else shows up. +

+ +
+
+ + +
+
+
+
+ +
+ LynkedUp Pro CRM and dispatch operations +
+ +
+
04 - CRM & Operations
+

+ Run Your Entire
+ Business From
+ One Dashboard. +

+

+ From first lead to final invoice, track every job, every crew, every follow-up. LynkedUp Pro replaces the 5 disconnected tools most roofing companies are limping along with. +

+
+
+
+

Visual sales pipeline. See every deal's status, value, and next action at a glance. Nothing falls through the cracks.

+
+
+
+

Crew scheduling + GPS tracking. Assign jobs, track arrival, and get real-time field updates without calling anyone.

+
+
+
+

Automated follow-ups. AI sends quotes, appointment reminders, and payment requests so nothing sits in a queue.

+
+
+ +
+
+
+ + +
+ +

Roofing Contractors Who Stopped Guessing

+

Real results from contractors who replaced hours of fieldwork with LynkedUp Pro's AI platform.

+
+ +
+
★★★★★
+ * +

The AI diagnosis caught a flashing issue I almost quoted over. Saved me $1,400 on a comebacks call. The insurance report it generates? Adjusters love it. Saved 2 claims this month alone.

+
+
SJ
+
+
Sarah Jensen
+
Operations Manager · Denver
+
+
+
+
+
★★★★★
+ * +

The territory map is insane. After a hailstorm, I had a list of 47 flagged addresses before my competitors even drove out. Booked 11 jobs in 48 hours. That's what this platform does.

+
+
DL
+
+
Derek Lam
+
Owner · Dallas, TX
+
+
+
+
+
+ + +
+
+
+
+
+
+ Book a Demo · See It Live +
+

+ Your Crew Is Ready.
+ Your Territory Is Ready.
+ Are You? +

+

+ Every day you're not using LiDAR estimates, AI diagnosis, and geospatial mapping, a competitor who is will close the jobs that should be yours. +

+
+ + Book a demo +
+

Setup in under 10 minutes · Works on iOS, Android & Web · Cancel anytime

+
+
+ + +
+ +
+

* Figures shown are illustrative and reflect beta-period targets; individual results vary.

+

** Founders Lifetime Deal is a one-time payment; limited founding-member availability.

+
+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + + + diff --git a/public/page/6.html b/public/page/6.html new file mode 100644 index 0000000..c1d4cee --- /dev/null +++ b/public/page/6.html @@ -0,0 +1,1102 @@ + + + + + +LynkedUp Pro - Field Intelligence Platform for Roofers + + + + + + + + + + + + +
+
+
+
Built exclusively for roofing contractors
+

THE ONLY
CRM/ERP
BUILT FOR
ROOFERS

+

6 fully-integrated systems: AI measurements, hail alerts, smart scheduling, LiDAR digital twins, and instant adjuster reports. Your assistant that never sleeps or takes a day off. One platform. No tool sprawl.

+ +
4.9★ · 248 reviews
+
+
+
2+ hrs
+
Saved per crew per day
+
+
+
$850
+
Avg. monthly savings vs. stacked tools
+
+
+
6
+
Integrated core systems
+
+
+
98%
+
Customer retention rate
+
+
+
+ + +
+
+ Replaces +
+
+ + + + + + +
+
+
+ + +
+
+
+ +
ROOFERS PAY
FOR TOO MANY TOOLS
+

Juggling 5-6 disconnected apps costs you time, jobs, and real money every month. LynkedUp Pro replaces them all.

+
+
+
+
💸
+

Tool Sprawl

+

Average roofer pays $900-$1,400/mo across CRM, measurement, scheduling, and reporting tools that don't talk to each other.

+
+
+
⏱️
+

Manual Re-entry

+

Data entered across three systems. Addresses wrong, jobs duplicated, leads lost. Hours wasted every single week.

+
+
+
🌩️
+

Missed Storm Jobs

+

No real-time hail alerts means you find out about storm damage after your competitors have knocked every door.

+
+
+
📋
+

Slow Adjuster Reports

+

Building a proper insurance report takes 90 minutes of manual work. Every time. While the homeowner waits.

+
+
+
+
+ + +
+

Stop Paying for Tools That
Don't Talk to Each Other

+

See how LynkedUp Pro consolidates your entire operation into one platform and saves you $850+ a month doing it.

+ +
+ + +
+
+
+
+ +
ONE PLATFORM.
ZERO GAPS.
+
+
+

Every module purpose-built for roofing. Every system connected. No subscriptions stacked on subscriptions.

+ See Pricing → +
+
+
+
+
01
+
📅
+

Smart Calendar

+

AI scheduling that routes crews by location, weather, and skill set. Drag-and-drop with automated homeowner notifications.

+ AI Routing +
+
+
02
+
📐
+

AI Measurements

+

Instant aerial measurements with pitch detection. Drone integration + LiDAR digital twin creation. No ladder for the estimate.

+ LiDAR + Drone +
+
+
03
+
🌩️
+

Hail Intelligence

+

Real-time NEXRAD radar alerts overlaid on your customer map. Deploy canvassing crews to the right streets first.

+ Real-Time Radar +
+
+
04
+
📊
+

CRM & Pipeline

+

Visual sales pipeline built for roofing, from knock to signed contract. No generic CRM adapted from another industry.

+ Full Pipeline +
+
+
05
+
📄
+

Adjuster Reports

+

One-click insurance reports with photo organization, scope notes, and damage documentation. 90 minutes → 3.

+ 3-Min Reports +
+
+
06
+
📈
+

Owner's Dashboard

+

Live KPIs, crew performance, revenue tracking, and job costing. The full picture from anywhere, on any device.

+ Live KPIs +
+
+
+
+ + +
+

All 6 Systems. One Subscription.

+

Starting at $149/month. No per-report fees. No add-ons. Cancel anytime.

+ +
+ + +
+
+
+ +
SCHEDULE SMARTER.
WASTE NOTHING.
+
+
+
+

Your dispatcher's AI assistant. Automatically clusters jobs by zip code, checks weather, and texts the homeowner, all without touching a phone.

+
+
+
🗺️
+
+

Route Optimization

+

AI groups jobs by territory and skill, eliminating windshield time. Save 2+ hours per crew daily.

+
+
+
+
☁️
+
+

Weather-Aware Scheduling

+

Auto-reschedules installs when rain is forecasted. Notifies homeowner and crew in one click.

+
+
+
+
🔔
+
+

Automated Notifications

+

Branded SMS/email confirmations, reminders, and arrival windows, sent automatically.

+
+
+
+
🔄
+
+

Google & Outlook Sync

+

Two-way sync keeps office and field calendars always in lockstep.

+
+
+
+
+ + View Plans +
+
+ + LynkedUp Pro smart calendar and crew dispatch +
+
+
+ + +
+
+
+ +
BE FIRST ON
EVERY STORM.
+
+
+
+

Real-time NEXRAD radar alerts overlaid on your customer map. Know which streets got hit before your competitors even check the weather.

+
    +
  • Real-time hail alerts pinpointed to individual addresses, not just zip codes
  • +
  • 🗺️
    Hail overlay on your customer database, see which past clients got hit
  • +
  • 📱
    Instant push alerts to your canvassing team with pre-built door knock scripts
  • +
  • 📊
    Historical storm data to identify high-frequency hail zones in your market
  • +
  • 🤝
    Auto-creates leads for affected addresses and queues follow-up tasks
  • +
+
+ + All Features +
+
+ + LynkedUp Pro hail intelligence map with affected addresses +
+
+
+ + +
+

Know About Storms
Before Your Competition Does

+

Hail Intelligence is included in every LynkedUp Pro plan. No extra charge, no add-on fee.

+ +
+ + +
+
+
+ +
ROOFERS WHO
MADE THE SWITCH
+
+
+
+
+43%
Revenue
+
★★★★★
+
"We replaced JobNimbus, EagleView, and SalesRabbit in one shot. The hail alert alone got us to 11 houses before anyone else in our market showed up."
+
+
MR
+
Marcus Rivera
Owner · Plano, TX
+
+ * +
+
+
$1,100
Saved/mo
+
★★★★★
+
"I was paying for 5 different subscriptions. Switched to LynkedUp Pro and cut my software bill by $1,100 a month, and everything actually works together."
+
+
KJ
+
Kyle Jensen
Founder · Houston, TX
+
+ * +
+
+
3 min
Adj. Reports
+
★★★★★
+
"Reports used to take me an hour. Now it's 3 minutes and adjusters comment on how professional they look. We close faster because of it."
+
+
SH
+
Sarah Hendricks
Operations Manager · Shreveport, LA
+
+ * +
+
+
+
+ + +
+

Join Hundreds of Roofers
Already Winning With LynkedUp Pro

+

14-day free trial. No credit card required. Set up in under 48 hours.

+ +
+ + +
+
+
+ +
HOW WE STACK UP
+

See what you actually get vs. the tools you're paying for now.

+
+
+ + + + + + + + + + + + + + + + + + + +
FeatureLynkedUp ProJobNimbusAccuLynxEagleView
AI Measurements IncludedAdd-on
Hail Alerts (Real-Time) Included
Smart Calendar / AI Routing IncludedBasicBasic
LiDAR Digital Twins IncludedAdd-on
1-Click Adjuster Reports 3 min avg.ManualManual
Owner's Dashboard (Live KPIs) IncludedLimitedLimited
Monthly Cost (full stack)$149-$349$400+ w/ add-ons$350+ w/ add-onsPer-report fees
+
+ +
+
+ + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + + + +
+
+
+ +
THINGS ROOFERS
ALWAYS ASK
+
+
+
+ +

Most teams are fully operational within 48 hours. We handle data migration, crew setup, and walk through every module live on Zoom. No IT department required.

+
+
+ +

Yes. We have direct import tools for JobNimbus, AccuLynx, and Roofr. Your customers, jobs, and history come with you. We've done this hundreds of times.

+
+
+ +

Yes. The mobile app has full offline mode. Photos, notes, and measurements sync automatically when you're back on a network. Field work doesn't stop when the signal does.

+
+
+ +

Our AI measurements are within 1-3% of manual measurements on standard residential roofs, validated against EagleView. LiDAR adds sub-inch precision for complex commercial jobs.

+
+
+ +

Month-to-month on all plans. No annual contract required unless you want a discount. Cancel any time with 30 days notice. We don't lock you in.

+
+
+ +

JobNimbus is a general contractor CRM adapted for roofing. We're built from scratch for roofing, every field, every workflow, every report. Plus measurements, hail alerts, and drone integration they don't offer.

+
+
+
+

Still have questions? We'd love to talk.

+ Talk to a Roofing Tech Expert +
+
+
+ + +
+
+

READY TO DOMINATE
YOUR MARKET?

+

Book a 20-minute demo and see how LynkedUp Pro transforms how your company operates.

+ +

No credit card. No obligation. Just a straight conversation about your business.

+
+
+ +
+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/7.html b/public/page/7.html new file mode 100644 index 0000000..2bc80d3 --- /dev/null +++ b/public/page/7.html @@ -0,0 +1,481 @@ + + +LynkedUp Pro - Know Your Conversion Rate. Know Who's Performing. + + + + + + +
+
+
Pipeline Metrics · Conversion Tracking · Agent Performance
+

You Don't Know
Your Conversion Rate.
That's the Problem.

+

How many leads are verified? How many converted? Which rep closes and which one stalls? Without metrics you're managing on vibes, and losing revenue you don't even know you're losing. LynkedUp Pro is your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews +
+
+ Verified vs unverified leads + Live conversion rate + Per-agent revenue tracking +
+
+
4
Lead status categories
+
Live
Conversion rate dashboard
+
Per
Agent revenue & deal count
+
Role
Based access control
+
+
+ +
+
+
The Problem
+

Your Pipeline Is Full.
But You're Still Missing Numbers.

+

A big pipeline looks great. But if you don't know your conversion rate, you can't fix it. If you don't track per-agent volume, your best rep is carrying your weakest one.

+
+

No Lead Verification

Is this a real homeowner ready to buy, or a tire-kicker your rep spent 3 hours on? Unverified leads pollute your pipeline and inflate your numbers.

Cost: Wasted rep hours daily
+
📉

Conversion Rate Invisible

You know how many leads came in. You know how many jobs closed. But no one has calculated the rate in between, and that's where all the coaching opportunity lives.

Cost: Uncoached underperformers
+
👤

No Per-Agent Visibility

One rep closes 70% of their deals. Another closes 20%. Both look the same on the surface because nobody's tracking deal count and revenue volume per person.

Cost: Wrong reps in wrong territories
+
+
+
+ + +
+
+
+
+ + You're Bleeding Revenue Right Now +
+

You Can't Fix
What You Can't See.

+

Right now, one of your reps is closing 20% while another closes 70%. Same leads. Same territory. You just don't know who. Let's fix that in 30 minutes.

+ +
+ Free 30-min demo + No credit card required + Live pipeline data +
+
+
+ +
+
+
The Fix
+

Every Metric
That Actually
Matters.

+
+
+

LynkedUp Pro tracks every lead through a verified status pipeline and gives every manager and owner live conversion data, per-agent breakdowns, and deal volume, all in one dashboard.

+
    +
  • 4 lead status categories: Verified, Unverified, Converted, and Lost. Every lead correctly categorized from first contact.
  • +
  • 📊Live conversion rate: per team, per rep, per territory. Updated in real time as leads move through the pipeline.
  • +
  • 💰Per-agent revenue volume: total revenue attributed to each rep, plus deal count, close rate, and average deal size.
  • +
  • 🔐Role-based access: reps see their own numbers, managers see their team, admins assign leads, owners see everything. No data leakage.
  • +
+
+
Real-Time
Conversion rate tracking
+
4
Lead verification statuses
+
Per Rep
Revenue & deal count
+
Admin
Lead assignment controls
+
+
+ + LynkedUp Pro pipeline metrics and agent performance dashboard +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + + +
+
+
+
📊 Live for 500+ Roofing Companies
+

Stop Managing
on Gut Feeling.
Start With Real Numbers.

+

The dashboard is live in 24 hours. You'll see your conversion rate, your verified vs unverified lead split, and every rep's numbers, before your next morning huddle.

+
+
+
38.2%
+
Conversion Rate
+
+
+
89
+
Verified Leads
+
+
+
$9K
+
Top Rep Revenue
+
+
+ +
+
+ +
+
+
Real Impact
+

Found the Problem.
Fixed the Team. Fast.

+
+
+43%
Close Rate
+
★★★★★
+

"When I saw the agent breakdown for the first time, I realized one rep had an 18% close rate while another had 68%. Same leads, same territory. I moved assignments around and the lower performer jumped to 34% in six weeks. I would never have known without the data."

+
+
JR
+
Jason Rodriguez
Owner · Dallas, TX · 14-person crew
+
+ * +
+
+
+ +
+
+
📊 Know your conversion rate before your next storm season
+

Know Who's Performing.
Fix What Isn't.

+

See the full pipeline metrics dashboard, with verified leads, conversion rate, and per-agent revenue, in a free 30-minute demo.

+ +
✅ No credit card✅ 30-day guarantee✅ Free onboarding
+
+
+

© 2026 LynkedUp Pro Full Platform →

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/8.html b/public/page/8.html new file mode 100644 index 0000000..4c73314 --- /dev/null +++ b/public/page/8.html @@ -0,0 +1,470 @@ + + +LynkedUp Pro - Everything You Need in 60 Seconds + + + + + + +
+
+
Built for Roofing · Flat 49/mo · 30-Day Guarantee
+

One Tool.
Every Job.
Done.

+

Replace EagleView, JobNimbus & SalesRabbit with one AI-powered roofing platform. Hail alerts. AI measurements. Smart calendar. All in. It's your assistant that never sleeps or takes a day off.

+ +
4.9★ · 248 reviews
+
+ No credit card + 30-day guarantee + Cancel anytime +
+
+
$0
Per-report fee. Ever.
+
17 min
Storm alert to reps on doors
+
+43%
Close rate lift (beta crews)
+
49
All 6 systems. Flat rate.
+
+
+ +
+
+
📅
Smart Calendar
AI scheduling + iOS/Google/Calendly sync
+
📐
AI Measurements
LiDAR scan in minutes. $0 per report.
+
Hail Alerts
Sub-hour storm alerts + address scoring
+
📋
Adjuster Reports
1-click. Insurance-accepted. Auto-generated.
+
📊
Pipeline CRM
Leads, stages, estimates, proposals
+
🏠
Owner's Box
Revenue, KPIs, team performance, live
+
+
+ +
+
+
Your Current Stack vs. LynkedUp Pro
+

The math is simple.

+
+
+
+
❌ What you're paying now
+
+
💸EagleView reports - $700+/mo
+
💸JobNimbus CRM - 00+/mo
+
💸SalesRabbit - 9+/user/mo
+
💸Billing + proposal tools - 00+/mo
+
+ Total monthly + ,150+ +
+
+
+
+
+
✅ LynkedUp Pro
+
+
AI Measurements - $0/report
+
Roofing CRM - included
+
Hail alerts + canvassing - included
+
Billing + proposals - included
+
+ Total monthly + 49 +
+
+
+
+
+ Your monthly savings: + 00+ / month + Claim These Savings → +
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + +
+
+
🔥 Only 12 Founding Member Spots Remaining
+
$2000/mo
+
Everything included. No per-user fees. No per-report charges. 30-day money-back.
+ +
+ ✅ No credit card required✅ Free onboarding✅ 30-day money-back guarantee +
+
+
+ + + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/9.html b/public/page/9.html new file mode 100644 index 0000000..cec0e97 --- /dev/null +++ b/public/page/9.html @@ -0,0 +1,534 @@ + + + + + + + + +LynkedUp Pro - Stop Getting Your Insurance Claims Underpaid + + + +
+
+
+
+
Adjuster-Ready Reports · Insurance Claims
+

The Insurance Company
Isn't Cheating You -
Your Docs Are.

+

Adjusters need precise, annotated evidence to pay full value. Without AI-documented hail impacts and LiDAR data, you hand them every reason to underpay, and they take it. It's your assistant that never sleeps or takes a day off.

+ +
+ 4.9★ · 248 reviews +
+
+ First-submission approval + AI-annotated hail impacts + Xactimate-style output +
+
+
1st
Submission approval rate
+
$0
Manual documentation time
+
1-click
Generate full adjuster report
+
100%
Insurance-accepted format
+
+
+
+
+
+
+
The Problem
+

Every Rejected Claim Is
Money You've Already Earned.

+

You did the work. You climbed the roof. You filed the report. And the adjuster still came back with a low number, or nothing at all. It's not the damage that's the problem. It's the paper trail.

+
+
📋

Vague Reports Get Rejected

Adjuster sees "hail damage noted" with a few phone photos. They write back for more evidence, delay the claim, or simply underpay. You have no leverage.

Cost: Weeks of delays, underpayment
+
🔍

You Miss Impact Zones

Manual roof inspections miss impacts on complex roof geometries. AI catches what the human eye skips, and insurance adjusters know the difference.

Cost: Unclaimed damage per job
+
📂

Hours of Manual Documentation

You do the roof work in 4 minutes. Then you spend 3 hours compiling photos, measurements, storm data and formatting a report adjusters may still reject.

Cost: 3+ hours per claim
+
+
+
+ +
+
+
+
+
+
+ + Right Now, This Storm Season +
+

You're Handing Adjusters
a Reason to Say No.
Stop It Today.

+

Every claim you file without AI-annotated hail data is a claim the adjuster has permission to shrink. The good news? One 30-minute demo changes the entire outcome of your next job.

+ +
+ No credit card + 30-min live demo + Real claims results +
+
+
+ +
+
+
+
+
The Fix
+

One Scan.
Full Payout.
Zero Resubmissions.

+
+
+

LynkedUp Pro combines LiDAR drone scanning, AI hail impact annotation, and historical storm data into a single adjuster-ready PDF. Automatically. Every time.

+
    +
  • 🤖AI auto-annotates every impact. The digital twin flags hail strikes, granule loss, and ridge damage with exact GPS coordinates. Nothing gets missed.
  • +
  • 🌩️Storm data auto-attached. HailTrace and NOAA historical records pull automatically into every report. Dated, sourced, irrefutable.
  • +
  • 📄Xactimate-style output. One click generates a formatted adjuster report with the exact structure insurance companies require. No resubmissions.
  • +
  • 🔗Wired into your CRM. Report links to the job file, the homeowner, the estimate, and the signed contract. Everything auditors want, one click away.
  • +
+
+
1-Click
Report generation
+
0 hrs
Manual documentation time
+
100%
Insurance-accepted format
+
Auto
Storm data attached
+
+
+ LynkedUp Pro AI-annotated adjuster report +
+
+
+ +
+
+
+
+
+
+ + Your Adjuster Wants a Reason to Say Yes +
+

Give Them Irrefutable
Evidence - or Keep
Fighting for Every Dollar.

+

LynkedUp Pro gives adjusters exactly what they need to approve on the first pass: GPS-pinned impacts, NOAA storm data, and Xactimate-ready formatting. Generated automatically. Every job.

+
+
+
100%
+
First-Pass Rate
+
+
+
$2.1K
+
Saved / Month
+
+
+
0 hrs
+
Manual Doc Time
+
+
+ +
+
+ +
+
+
+
+
Real Result
+

Our Clients Don't
Resubmit. They Get Paid.

+
+
$2.1K
Saved/Month
+
★★★★★
+

"We used to resubmit claims 2-3 times per job. Adjusters kept asking for more evidence we didn't have. With LynkedUp Pro, the AI-annotated reports have the exact documentation they need. Every claim gets approved on the first submission now. That alone is worth the entire subscription."

+
+
MT
+
Marcus Thompson
Operations Manager · Fort Worth, TX
+
+ * +
+
+
+
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + +
+
+
+
+
📋 Stop resubmitting claims that should've been approved the first time
+

Every Dollar Is Yours.
Start Claiming It.

+

See how LynkedUp Pro generates bulletproof adjuster reports automatically, in a 30-minute demo.

+ +
✅ No credit card✅ 30-day money-back guarantee✅ Free onboarding
+
+
+
+

© 2026 LynkedUp Pro  ·  See Full Platform →

+

$349/mo flat rate · No credit card required · 30-day money-back guarantee · Built for roofing

+

* Testimonials and figures shown are illustrative and reflect beta-period results; individual results vary.

+
+ + + + + 🔥 Founders Lifetime Deal - $2000 + + + + + + + + + diff --git a/public/page/assets/Screenshot 2026-06-01 120003.png b/public/page/assets/Screenshot 2026-06-01 120003.png new file mode 100644 index 0000000..4f4e5d8 Binary files /dev/null and b/public/page/assets/Screenshot 2026-06-01 120003.png differ diff --git a/public/page/assets/calendar.png b/public/page/assets/calendar.png new file mode 100644 index 0000000..46ebe54 Binary files /dev/null and b/public/page/assets/calendar.png differ diff --git a/public/page/assets/calendar1.png b/public/page/assets/calendar1.png new file mode 100644 index 0000000..687a307 Binary files /dev/null and b/public/page/assets/calendar1.png differ diff --git a/public/page/assets/calendar2.png b/public/page/assets/calendar2.png new file mode 100644 index 0000000..771410c Binary files /dev/null and b/public/page/assets/calendar2.png differ diff --git a/public/page/assets/contractors.png b/public/page/assets/contractors.png new file mode 100644 index 0000000..db2c750 Binary files /dev/null and b/public/page/assets/contractors.png differ diff --git a/public/page/assets/dashboard.png b/public/page/assets/dashboard.png new file mode 100644 index 0000000..263b8d1 Binary files /dev/null and b/public/page/assets/dashboard.png differ diff --git a/public/page/assets/esitimate.png b/public/page/assets/esitimate.png new file mode 100644 index 0000000..7c5fc7e Binary files /dev/null and b/public/page/assets/esitimate.png differ diff --git a/public/page/assets/hero-house.jpg b/public/page/assets/hero-house.jpg new file mode 100644 index 0000000..64f8edb Binary files /dev/null and b/public/page/assets/hero-house.jpg differ diff --git a/public/page/assets/jobs.png b/public/page/assets/jobs.png new file mode 100644 index 0000000..861c469 Binary files /dev/null and b/public/page/assets/jobs.png differ diff --git a/public/page/assets/lynkedispatch.png b/public/page/assets/lynkedispatch.png new file mode 100644 index 0000000..70a4891 Binary files /dev/null and b/public/page/assets/lynkedispatch.png differ diff --git a/public/page/assets/lynkedup-logo.png b/public/page/assets/lynkedup-logo.png new file mode 100644 index 0000000..0458027 Binary files /dev/null and b/public/page/assets/lynkedup-logo.png differ diff --git a/public/page/assets/map.png b/public/page/assets/map.png new file mode 100644 index 0000000..f913420 Binary files /dev/null and b/public/page/assets/map.png differ diff --git a/public/page/assets/mobile.png b/public/page/assets/mobile.png new file mode 100644 index 0000000..491f45c Binary files /dev/null and b/public/page/assets/mobile.png differ diff --git a/public/page/assets/overview1.png b/public/page/assets/overview1.png new file mode 100644 index 0000000..d345e8c Binary files /dev/null and b/public/page/assets/overview1.png differ diff --git a/public/page/assets/overview13 (1).png b/public/page/assets/overview13 (1).png new file mode 100644 index 0000000..d1de4a0 Binary files /dev/null and b/public/page/assets/overview13 (1).png differ diff --git a/public/page/assets/overview13.png b/public/page/assets/overview13.png new file mode 100644 index 0000000..d1de4a0 Binary files /dev/null and b/public/page/assets/overview13.png differ diff --git a/public/page/assets/pipeline.png b/public/page/assets/pipeline.png new file mode 100644 index 0000000..6af79f4 Binary files /dev/null and b/public/page/assets/pipeline.png differ diff --git a/public/page/assets/project-data.png b/public/page/assets/project-data.png new file mode 100644 index 0000000..1a7c719 Binary files /dev/null and b/public/page/assets/project-data.png differ diff --git a/public/page/assets/screencapture-4ygqvh-zs-myshopify-2026-06-03-23_06_04.png b/public/page/assets/screencapture-4ygqvh-zs-myshopify-2026-06-03-23_06_04.png new file mode 100644 index 0000000..5d28b34 Binary files /dev/null and b/public/page/assets/screencapture-4ygqvh-zs-myshopify-2026-06-03-23_06_04.png differ diff --git a/public/page/assets/storm.png b/public/page/assets/storm.png new file mode 100644 index 0000000..1439439 Binary files /dev/null and b/public/page/assets/storm.png differ diff --git a/public/page/image-slot.js b/public/page/image-slot.js new file mode 100644 index 0000000..d1eb01b --- /dev/null +++ b/public/page/image-slot.js @@ -0,0 +1,641 @@ +/** + * — user-fillable image placeholder. + * + * Drop this into a deck, mockup, or page wherever you want the user to + * supply an image. You control the slot's shape and size; the user fills it + * by dragging an image file onto it (or clicking to browse). The dropped + * image persists across reloads via a .image-slots.state.json sidecar — + * same read-via-fetch / write-via-window.omelette pattern as + * design_canvas.jsx, so the filled slot shows on share links, downloaded + * zips, and PPTX export. Outside the omelette runtime the slot is read-only. + * + * The host bridge only allows sidecar writes at the project root, so the + * HTML that uses this component is assumed to live at the project root too + * (same constraint as design_canvas.jsx). + * + * Attributes: + * id Persistence key. REQUIRED for the drop to survive reload — + * every slot on the page needs a distinct id. + * shape 'rect' | 'rounded' | 'circle' | 'pill' (default 'rounded') + * 'circle' applies 50% border-radius; on a non-square slot + * that's an ellipse — set equal width and height for a true + * circle. + * radius Corner radius in px for 'rounded'. (default 12) + * mask Any CSS clip-path value. Overrides `shape` — use this for + * hexagons, blobs, arbitrary polygons. + * fit object-fit: cover | contain | fill. (default 'cover') + * With cover (the default) double-clicking the filled slot + * enters a reframe mode: the whole image spills past the mask + * (translucent outside, opaque inside), drag to reposition, + * corner-drag to scale. The crop persists alongside the image + * in the sidecar. contain/fill stay static. + * position object-position for fit=contain|fill. (default '50% 50%') + * placeholder Empty-state caption. (default 'Drop an image') + * src Optional initial/fallback image URL. A user drop overrides + * it; clearing the drop reveals src again. + * + * Size and layout come from ordinary CSS on the element — width/height + * inline or from a parent grid — so it composes with any layout. + * + * Usage: + * + * + * + * + */ + +(() => { + const STATE_FILE = '.image-slots.state.json'; + // 2× a ~600px slot in a 1920-wide deck — retina-sharp without making the + // sidecar enormous. A 1200px WebP at q=0.85 is ~150-300KB. + const MAX_DIM = 1200; + // Raster formats only. SVG is excluded (can carry script; createImageBitmap + // on SVG blobs is inconsistent). GIF is excluded because the canvas + // re-encode keeps only the first frame, so an animated GIF would silently + // go still — better to reject than surprise. + const ACCEPT = ['image/png', 'image/jpeg', 'image/webp', 'image/avif']; + + // ── Shared sidecar store ──────────────────────────────────────────────── + // One fetch + immediate write-on-change for every on the + // page. Reads via fetch() so viewing works anywhere the HTML and sidecar + // are served together; writes go through window.omelette.writeFile, which + // the host allowlists to *.state.json basenames only. + const subs = new Set(); + let slots = {}; + // ids explicitly cleared before the sidecar fetch resolved — otherwise + // the merge below can't tell "never set" from "just deleted" and would + // resurrect the sidecar's stale value. + const tombstones = new Set(); + let loaded = false; + let loadP = null; + + function load() { + if (loadP) return loadP; + loadP = fetch(STATE_FILE) + .then((r) => (r.ok ? r.json() : null)) + .then((j) => { + // Merge: sidecar loses to any in-memory change that raced ahead of + // the fetch (drop or clear) so neither is clobbered by hydration. + if (j && typeof j === 'object') { + const merged = Object.assign({}, j, slots); + // A framing-only write that raced ahead of hydration must not + // drop a user image that's only on disk — inherit u from the + // sidecar for any in-memory entry that lacks one. + for (const k in slots) { + if (merged[k] && !merged[k].u && j[k]) { + merged[k].u = typeof j[k] === 'string' ? j[k] : j[k].u; + } + } + for (const id of tombstones) delete merged[id]; + slots = merged; + } + tombstones.clear(); + }) + .catch(() => {}) + .then(() => { loaded = true; subs.forEach((fn) => fn()); }); + return loadP; + } + + // Serialize writes so two near-simultaneous drops on different slots + // can't reorder at the backend and leave the sidecar with only the + // first. A save requested mid-flight just marks dirty and re-fires on + // completion with the then-current slots. + let saving = false; + let saveDirty = false; + function save() { + if (saving) { saveDirty = true; return; } + const w = window.omelette && window.omelette.writeFile; + if (!w) return; + saving = true; + Promise.resolve(w(STATE_FILE, JSON.stringify(slots))) + .catch(() => {}) + .then(() => { saving = false; if (saveDirty) { saveDirty = false; save(); } }); + } + + const S_MAX = 5; + const clampS = (s) => Math.max(1, Math.min(S_MAX, s)); + + // Normalize a stored slot value. Pre-reframe sidecars stored a bare + // data-URL string; newer ones store {u, s, x, y}. Either shape is valid. + function getSlot(id) { + const v = slots[id]; + if (!v) return null; + return typeof v === 'string' ? { u: v, s: 1, x: 0, y: 0 } : v; + } + + function setSlot(id, val) { + if (!id) return; + if (val) { slots[id] = val; tombstones.delete(id); } + else { delete slots[id]; if (!loaded) tombstones.add(id); } + subs.forEach((fn) => fn()); + // A drop is rare + high-value — write immediately so nav-away can't lose + // it. Gate on the initial read so we don't overwrite a sidecar we haven't + // merged yet; the merge in load() keeps this change once the read lands. + if (loaded) save(); else load().then(save); + } + + // ── Image downscale ───────────────────────────────────────────────────── + // Encode through a canvas so the sidecar carries resized bytes, not the + // raw upload. Longest side is capped at 2× the slot's rendered width + // (retina) and at MAX_DIM. WebP keeps alpha and is ~10× smaller than PNG + // for photos, so there's no need for per-image format picking. + async function toDataUrl(file, targetW) { + const bitmap = await createImageBitmap(file); + try { + const cap = Math.min(MAX_DIM, Math.max(1, Math.round(targetW * 2)) || MAX_DIM); + const scale = Math.min(1, cap / Math.max(bitmap.width, bitmap.height)); + const w = Math.max(1, Math.round(bitmap.width * scale)); + const h = Math.max(1, Math.round(bitmap.height * scale)); + const canvas = document.createElement('canvas'); + canvas.width = w; canvas.height = h; + canvas.getContext('2d').drawImage(bitmap, 0, 0, w, h); + return canvas.toDataURL('image/webp', 0.85); + } finally { + bitmap.close && bitmap.close(); + } + } + + // ── Custom element ────────────────────────────────────────────────────── + const stylesheet = + ':host{display:inline-block;position:relative;vertical-align:top;' + + ' font:13px/1.3 system-ui,-apple-system,sans-serif;color:rgba(0,0,0,.55);width:240px;height:160px}' + + '.frame{position:absolute;inset:0;overflow:hidden;background:rgba(0,0,0,.04)}' + + // .frame img (clipped) and .spill (unclipped ghost + handles) share the + // same left/top/width/height in frame-%, computed by _applyView(), so the + // inside-mask crop and the outside-mask spill stay pixel-aligned. + '.frame img{position:absolute;max-width:none;transform:translate(-50%,-50%);' + + ' -webkit-user-drag:none;user-select:none;touch-action:none}' + + // Reframe mode (double-click): the full image spills past the mask. The + // spill layer is sized to the IMAGE bounds so its corners are where the + // resize handles belong. The ghost inside is translucent; the real + // clipped underneath shows the opaque in-mask crop. + '.spill{position:absolute;transform:translate(-50%,-50%);display:none;z-index:1;' + + ' cursor:grab;touch-action:none}' + + ':host([data-panning]) .spill{cursor:grabbing}' + + '.spill .ghost{position:absolute;inset:0;width:100%;height:100%;opacity:.35;' + + ' pointer-events:none;-webkit-user-drag:none;user-select:none;' + + ' box-shadow:0 0 0 1px rgba(0,0,0,.2),0 12px 32px rgba(0,0,0,.2)}' + + '.spill .handle{position:absolute;width:12px;height:12px;border-radius:50%;' + + ' background:#fff;box-shadow:0 0 0 1.5px #c96442,0 1px 3px rgba(0,0,0,.3);' + + ' transform:translate(-50%,-50%)}' + + '.spill .handle[data-c=nw]{left:0;top:0;cursor:nwse-resize}' + + '.spill .handle[data-c=ne]{left:100%;top:0;cursor:nesw-resize}' + + '.spill .handle[data-c=sw]{left:0;top:100%;cursor:nesw-resize}' + + '.spill .handle[data-c=se]{left:100%;top:100%;cursor:nwse-resize}' + + ':host([data-reframe]){z-index:10}' + + ':host([data-reframe]) .spill{display:block}' + + ':host([data-reframe]) .frame{box-shadow:0 0 0 2px #c96442}' + + '.empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;' + + ' justify-content:center;gap:6px;text-align:center;padding:12px;box-sizing:border-box;' + + ' cursor:pointer;user-select:none}' + + '.empty svg{opacity:.45}' + + '.empty .cap{max-width:90%;font-weight:500;letter-spacing:.01em}' + + '.empty .sub{font-size:11px}' + + '.empty .sub u{text-underline-offset:2px;text-decoration-color:rgba(0,0,0,.25)}' + + '.empty:hover .sub u{color:rgba(0,0,0,.75);text-decoration-color:currentColor}' + + ':host([data-over]) .frame{outline:2px solid #c96442;outline-offset:-2px;' + + ' background:rgba(201,100,66,.10)}' + + '.ring{position:absolute;inset:0;pointer-events:none;border:1.5px dashed rgba(0,0,0,.25);' + + ' transition:border-color .12s}' + + ':host([data-over]) .ring{border-color:#c96442}' + + ':host([data-filled]) .ring{display:none}' + + // Controls sit BELOW the mask (top:100%), absolutely positioned so the + // author-declared slot height is unaffected. The gap is padding, not a + // top offset, so the hover target stays contiguous with the frame. + '.ctl{position:absolute;top:100%;left:50%;transform:translateX(-50%);padding-top:8px;' + + ' display:flex;gap:6px;opacity:0;pointer-events:none;transition:opacity .12s;z-index:2;' + + ' white-space:nowrap}' + + ':host([data-filled][data-editable]:hover) .ctl,:host([data-reframe]) .ctl' + + ' {opacity:1;pointer-events:auto}' + + '.ctl button{appearance:none;border:0;border-radius:6px;padding:5px 10px;cursor:pointer;' + + ' background:rgba(0,0,0,.65);color:#fff;font:11px/1 system-ui,-apple-system,sans-serif;' + + ' backdrop-filter:blur(6px)}' + + '.ctl button:hover{background:rgba(0,0,0,.8)}' + + '.err{position:absolute;left:8px;bottom:8px;right:8px;color:#b3261e;font-size:11px;' + + ' background:rgba(255,255,255,.85);padding:4px 6px;border-radius:5px;pointer-events:none}'; + + const icon = + '' + + '' + + ''; + + class ImageSlot extends HTMLElement { + static get observedAttributes() { + return ['shape', 'radius', 'mask', 'fit', 'position', 'placeholder', 'src', 'id']; + } + + constructor() { + super(); + const root = this.attachShadow({ mode: 'open' }); + // .spill and .ctl sit OUTSIDE .frame so overflow:hidden + border-radius + // on the frame (circle, pill, rounded) can't clip them. + root.innerHTML = + '' + + '
' + + ' ' + + '
' + icon + + '
' + + '
or browse files
' + + '
' + + '
' + + '
' + + ' ' + + '
' + + '
' + + '
' + + '
' + + '
' + + ''; + this._frame = root.querySelector('.frame'); + this._ring = root.querySelector('.ring'); + this._img = root.querySelector('.frame img'); + this._empty = root.querySelector('.empty'); + this._cap = root.querySelector('.cap'); + this._sub = root.querySelector('.sub'); + this._spill = root.querySelector('.spill'); + this._ghost = root.querySelector('.ghost'); + this._err = null; + this._input = root.querySelector('input'); + this._depth = 0; + this._gen = 0; + this._view = { s: 1, x: 0, y: 0 }; + this._subFn = () => this._render(); + // Shadow-DOM listeners live with the shadow DOM — bound once here so + // disconnect/reconnect (e.g. React remount) doesn't stack handlers. + this._empty.addEventListener('click', () => this._input.click()); + root.addEventListener('click', (e) => { + const act = e.target && e.target.getAttribute && e.target.getAttribute('data-act'); + if (act === 'replace') { this._exitReframe(true); this._input.click(); } + if (act === 'clear') { + this._exitReframe(false); + this._gen++; + this._local = null; + if (this.id) setSlot(this.id, null); else this._render(); + } + }); + this._input.addEventListener('change', () => { + const f = this._input.files && this._input.files[0]; + if (f) this._ingest(f); + this._input.value = ''; + }); + // naturalWidth/Height aren't known until load — re-apply so the cover + // baseline is computed from real dimensions, not the 100%×100% fallback. + this._img.addEventListener('load', () => this._applyView()); + // Gated on editable + fit=cover so share links and contain/fill slots + // stay static. + this.addEventListener('dblclick', (e) => { + if (!this.hasAttribute('data-editable') || !this._reframes()) return; + e.preventDefault(); + if (this.hasAttribute('data-reframe')) this._exitReframe(true); + else this._enterReframe(); + }); + // Pan + resize both originate on the spill layer. A handle pointerdown + // drives an aspect-locked resize anchored at the opposite corner; any + // other pointerdown on the spill pans. Offsets are frame-% so a + // reframed slot survives responsive resize / PPTX export. + this._spill.addEventListener('pointerdown', (e) => { + if (e.button !== 0 || !this.hasAttribute('data-reframe')) return; + e.preventDefault(); + e.stopPropagation(); + this._spill.setPointerCapture(e.pointerId); + const rect = this.getBoundingClientRect(); + const fw = rect.width || 1, fh = rect.height || 1; + const corner = e.target.getAttribute && e.target.getAttribute('data-c'); + let move; + if (corner) { + // Resize about the OPPOSITE corner. Viewport-px throughout (rect + // fw/fh, not clientWidth) so the math survives a transform:scale() + // ancestor — deck_stage renders slides scaled-to-fit. + const iw = this._img.naturalWidth || 1, ih = this._img.naturalHeight || 1; + const base = Math.max(fw / iw, fh / ih); + const sx = corner.includes('e') ? 1 : -1; + const sy = corner.includes('s') ? 1 : -1; + const s0 = this._view.s; + const w0 = iw * base * s0, h0 = ih * base * s0; + const cx0 = (50 + this._view.x) / 100 * fw; + const cy0 = (50 + this._view.y) / 100 * fh; + const ox = cx0 - sx * w0 / 2, oy = cy0 - sy * h0 / 2; + const diag0 = Math.hypot(w0, h0); + const ux = sx * w0 / diag0, uy = sy * h0 / diag0; + move = (ev) => { + const proj = (ev.clientX - rect.left - ox) * ux + + (ev.clientY - rect.top - oy) * uy; + const s = clampS(s0 * proj / diag0); + const d = diag0 * s / s0; + this._view.s = s; + this._view.x = (ox + ux * d / 2) / fw * 100 - 50; + this._view.y = (oy + uy * d / 2) / fh * 100 - 50; + this._clampView(); + this._applyView(); + }; + } else { + this.setAttribute('data-panning', ''); + const start = { px: e.clientX, py: e.clientY, x: this._view.x, y: this._view.y }; + move = (ev) => { + this._view.x = start.x + (ev.clientX - start.px) / fw * 100; + this._view.y = start.y + (ev.clientY - start.py) / fh * 100; + this._clampView(); + this._applyView(); + }; + } + const up = () => { + try { this._spill.releasePointerCapture(e.pointerId); } catch {} + this._spill.removeEventListener('pointermove', move); + this._spill.removeEventListener('pointerup', up); + this._spill.removeEventListener('pointercancel', up); + this.removeAttribute('data-panning'); + this._dragUp = null; + }; + // Stashed so _exitReframe (Escape / outside-click mid-drag) can + // tear the capture + listeners down synchronously. + this._dragUp = up; + this._spill.addEventListener('pointermove', move); + this._spill.addEventListener('pointerup', up); + this._spill.addEventListener('pointercancel', up); + }); + // Wheel zoom stays available inside reframe mode as a trackpad nicety — + // zooms toward the cursor (offset' = cursor·(1-k) + offset·k). + this.addEventListener('wheel', (e) => { + if (!this.hasAttribute('data-reframe')) return; + e.preventDefault(); + const r = this.getBoundingClientRect(); + const cx = (e.clientX - r.left) / r.width * 100 - 50; + const cy = (e.clientY - r.top) / r.height * 100 - 50; + const prev = this._view.s; + const next = clampS(prev * Math.pow(1.0015, -e.deltaY)); + if (next === prev) return; + const k = next / prev; + this._view.s = next; + this._view.x = cx * (1 - k) + this._view.x * k; + this._view.y = cy * (1 - k) + this._view.y * k; + this._clampView(); + this._applyView(); + }, { passive: false }); + } + + connectedCallback() { + // Warn once per page — an id-less slot works for the session but + // cannot persist, and two id-less slots would share nothing. + if (!this.id && !ImageSlot._warned) { + ImageSlot._warned = true; + console.warn(' without an id will not persist its dropped image.'); + } + this.addEventListener('dragenter', this); + this.addEventListener('dragover', this); + this.addEventListener('dragleave', this); + this.addEventListener('drop', this); + subs.add(this._subFn); + // width%/height% in _applyView encode the frame aspect at call time — + // a host resize (responsive grid, pane divider) would stretch the + // image until the next _render. Re-render on size change: _render() + // re-seeds _view from stored before clamp/apply, so a shrink→grow + // cycle round-trips instead of ratcheting x/y toward the narrower + // frame's clamp range. + this._ro = new ResizeObserver(() => this._render()); + this._ro.observe(this); + load(); + this._render(); + } + + disconnectedCallback() { + subs.delete(this._subFn); + this.removeEventListener('dragenter', this); + this.removeEventListener('dragover', this); + this.removeEventListener('dragleave', this); + this.removeEventListener('drop', this); + if (this._ro) { this._ro.disconnect(); this._ro = null; } + this._exitReframe(false); + } + + _enterReframe() { + if (this.hasAttribute('data-reframe')) return; + this.setAttribute('data-reframe', ''); + this._applyView(); + // Close on click outside (the spill handler stopPropagation()s so + // in-image drags don't reach this) and on Escape. Listeners are held + // on the instance so _exitReframe / disconnectedCallback can detach + // exactly what was attached. + this._outside = (e) => { + if (e.composedPath && e.composedPath().includes(this)) return; + this._exitReframe(true); + }; + this._esc = (e) => { if (e.key === 'Escape') this._exitReframe(true); }; + document.addEventListener('pointerdown', this._outside, true); + document.addEventListener('keydown', this._esc, true); + } + + _exitReframe(commit) { + if (!this.hasAttribute('data-reframe')) return; + if (this._dragUp) this._dragUp(); + this.removeAttribute('data-reframe'); + this.removeAttribute('data-panning'); + if (this._outside) document.removeEventListener('pointerdown', this._outside, true); + if (this._esc) document.removeEventListener('keydown', this._esc, true); + this._outside = this._esc = null; + if (commit) this._commitView(); + } + + attributeChangedCallback() { if (this.shadowRoot) this._render(); } + + // handleEvent — one listener object for all four drag events keeps the + // add/remove symmetric and the depth counter correct. + handleEvent(e) { + if (e.type === 'dragenter' || e.type === 'dragover') { + // Without preventDefault the browser never fires 'drop'. + e.preventDefault(); + e.stopPropagation(); + if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'; + if (e.type === 'dragenter') this._depth++; + this.setAttribute('data-over', ''); + } else if (e.type === 'dragleave') { + // dragenter/leave fire for every descendant crossing — count depth + // so hovering the icon inside the empty state doesn't flicker. + if (--this._depth <= 0) { this._depth = 0; this.removeAttribute('data-over'); } + } else if (e.type === 'drop') { + e.preventDefault(); + e.stopPropagation(); + this._depth = 0; + this.removeAttribute('data-over'); + const f = e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files[0]; + if (f) this._ingest(f); + } + } + + async _ingest(file) { + this._setError(null); + if (!file || ACCEPT.indexOf(file.type) < 0) { + this._setError('Drop a PNG, JPEG, WebP, or AVIF image.'); + return; + } + // toDataUrl can take hundreds of ms on a large photo. A Clear or a + // newer drop during that window would be clobbered when this await + // resumes — bump + capture a generation so stale encodes bail. + const gen = ++this._gen; + try { + const w = this.clientWidth || this.offsetWidth || MAX_DIM; + const url = await toDataUrl(file, w); + if (gen !== this._gen) return; + // Only exit reframe once the new image is in hand — a rejected type + // or decode failure leaves the in-progress crop untouched. + this._exitReframe(false); + const val = { u: url, s: 1, x: 0, y: 0 }; + setSlot(this.id || '', val); + // Keep a session-local copy for id-less slots so the drop still + // shows, even though it cannot persist. + if (!this.id) { this._local = val; this._render(); } + } catch (err) { + if (gen !== this._gen) return; + this._setError('Could not read that image.'); + console.warn(' ingest failed:', err); + } + } + + _setError(msg) { + if (this._err) { this._err.remove(); this._err = null; } + if (!msg) return; + const d = document.createElement('div'); + d.className = 'err'; d.textContent = msg; + this.shadowRoot.appendChild(d); + this._err = d; + setTimeout(() => { if (this._err === d) { d.remove(); this._err = null; } }, 3000); + } + + // Reframing (pan/resize) is only meaningful for fit=cover — contain/fill + // keep the old object-fit path and double-click is a no-op. + _reframes() { + return this.hasAttribute('data-filled') && + (this.getAttribute('fit') || 'cover') === 'cover'; + } + + // Cover-baseline geometry, shared by clamp/apply/resize. Null until the + // img has loaded (naturalWidth is 0 before that) or when the slot has no + // layout box — ResizeObserver fires with a 0×0 rect under display:none, + // and clamping against a degenerate 1×1 frame would silently pull the + // stored pan toward zero. + _geom() { + const iw = this._img.naturalWidth, ih = this._img.naturalHeight; + const fw = this.clientWidth, fh = this.clientHeight; + if (!iw || !ih || !fw || !fh) return null; + return { iw, ih, fw, fh, base: Math.max(fw / iw, fh / ih) }; + } + + _clampView() { + // Pan range on each axis is half the overflow past the frame edge. + const g = this._geom(); + if (!g) return; + const mx = Math.max(0, (g.iw * g.base * this._view.s / g.fw - 1) * 50); + const my = Math.max(0, (g.ih * g.base * this._view.s / g.fh - 1) * 50); + this._view.x = Math.max(-mx, Math.min(mx, this._view.x)); + this._view.y = Math.max(-my, Math.min(my, this._view.y)); + } + + _applyView() { + const g = this._geom(); + const fit = this.getAttribute('fit') || 'cover'; + if (fit !== 'cover' || !g) { + // Non-cover, or dimensions not known yet (before img load). + this._img.style.width = '100%'; + this._img.style.height = '100%'; + this._img.style.left = '50%'; + this._img.style.top = '50%'; + this._img.style.objectFit = fit; + this._img.style.objectPosition = this.getAttribute('position') || '50% 50%'; + return; + } + // Cover baseline: img fills the frame on its tighter axis at s=1, so + // pan works immediately on the overflowing axis without zooming first. + // Width/height and left/top are all frame-% — depends only on the + // frame aspect ratio, so a responsive resize keeps the same crop. The + // spill layer mirrors the same box so its corners = image corners. + const k = g.base * this._view.s; + const w = (g.iw * k / g.fw * 100) + '%'; + const h = (g.ih * k / g.fh * 100) + '%'; + const l = (50 + this._view.x) + '%'; + const t = (50 + this._view.y) + '%'; + this._img.style.width = w; this._img.style.height = h; + this._img.style.left = l; this._img.style.top = t; + this._img.style.objectFit = ''; + this._spill.style.width = w; this._spill.style.height = h; + this._spill.style.left = l; this._spill.style.top = t; + } + + _commitView() { + const v = { s: this._view.s, x: this._view.x, y: this._view.y }; + if (this._userUrl) v.u = this._userUrl; + // Framing-only (no u) persists too so an author-src slot remembers its + // crop; clearing the sidecar still falls through to src=. + if (this.id) setSlot(this.id, v); + else { this._local = v; } + } + + _render() { + // Shape / mask. Presets use border-radius so the dashed ring can + // follow the rounded outline; clip-path is only applied for an + // explicit `mask` (the ring is hidden there since a rectangle + // dashed border chopped by an arbitrary polygon looks broken). + const mask = this.getAttribute('mask'); + const shape = (this.getAttribute('shape') || 'rounded').toLowerCase(); + let radius = ''; + if (shape === 'circle') radius = '50%'; + else if (shape === 'pill') radius = '9999px'; + else if (shape === 'rounded') { + const n = parseFloat(this.getAttribute('radius')); + radius = (Number.isFinite(n) ? n : 12) + 'px'; + } + this._frame.style.borderRadius = mask ? '' : radius; + this._frame.style.clipPath = mask || ''; + this._ring.style.borderRadius = mask ? '' : radius; + this._ring.style.display = mask ? 'none' : ''; + + // Controls and reframe entry gate on this so share links stay read-only. + const editable = !!(window.omelette && window.omelette.writeFile); + this.toggleAttribute('data-editable', editable); + this._sub.style.display = editable ? '' : 'none'; + + // Content. The sidecar is also writable by the agent's write_file + // tool, so its value isn't guaranteed canvas-originated — only accept + // data:image/ URLs from it. The `src` attribute is author-controlled + // (Claude wrote it into the HTML) so it passes through unchanged. + let stored = this.id ? getSlot(this.id) : this._local; + if (stored && stored.u && !/^data:image\//i.test(stored.u)) stored = null; + const srcAttr = this.getAttribute('src') || ''; + this._userUrl = (stored && stored.u) || null; + const url = this._userUrl || srcAttr; + // Don't clobber an in-flight reframe with a store-triggered re-render. + if (!this.hasAttribute('data-reframe')) { + this._view = { + s: stored && Number.isFinite(stored.s) ? clampS(stored.s) : 1, + x: stored && Number.isFinite(stored.x) ? stored.x : 0, + y: stored && Number.isFinite(stored.y) ? stored.y : 0, + }; + } + this._cap.textContent = this.getAttribute('placeholder') || 'Drop an image'; + // Toggle via style.display — the [hidden] attribute alone loses to + // the display:flex / display:block rules in the stylesheet above. + if (url) { + if (this._img.getAttribute('src') !== url) { + this._img.src = url; + this._ghost.src = url; + } + this._img.style.display = 'block'; + this._empty.style.display = 'none'; + this.setAttribute('data-filled', ''); + this._clampView(); + this._applyView(); + } else { + this._img.style.display = 'none'; + this._img.removeAttribute('src'); + this._ghost.removeAttribute('src'); + this._empty.style.display = 'flex'; + this.removeAttribute('data-filled'); + } + } + } + + if (!customElements.get('image-slot')) { + customElements.define('image-slot', ImageSlot); + } +})(); diff --git a/public/page/index.html b/public/page/index.html new file mode 100644 index 0000000..23a5630 --- /dev/null +++ b/public/page/index.html @@ -0,0 +1,1726 @@ + + + + + +LynkedUp Pro - The OS for Modern Roofing Crews + + + + + + + +
+
+ + + + + +
+
+
+ + + Limited Founders Lifetime Deal - only a few licenses left + +

+ The all-in-one operating system for modern roofing crews. +

+

+ LynkedUp Pro unifies estimates, dispatch, LiDAR roof measurements, invoicing, and crew chat, so your contractors stop juggling six tools and start closing 41% more jobs. It's your assistant that never sleeps or takes a day off. +

+ +
+ +
+
4.9★ · 248 reviews
+
+
+ + Founders pricing locked in +
+
+ + No subscription, ever +
+
+
+ + +
LynkedUp Pro dashboard
+
+
+ + +
+
+
Trusted by 3,000 roofing and exterior pros
+
+ RidgeWorks + PEAK&SLOPE + A R T E S A N O + Stonefield Co. + NORTHRIDGE + Skyhaus⌃ +
+
+
+ + +
+
+
+ One ecosystem. Six native modules. +

Everything your crew needs, finally under one roof.

+

Stop paying for AccuLynx, JobNimbus, QuickBooks, Calendly, Slack, and a measurement add-on. LynkedUp Pro replaces all of them, with deeper integration and no per-seat tax.

+
+ +
+ +
+
+ + + + + +
+

Intelligent Calendar

+

Auto-dispatch crews based on travel time, weather windows, and material readiness. The schedule books itself.

+ AI-routed +
+ + +
+
+ + + + + + +
+

Pipeline CRM

+

Every door-knock, callback, and contract in one timeline. Kanban + map view + SMS, built for roofers, not lawyers.

+ +41% close rate + * +
+ + +
+
+ + + + + +
+

Smart Invoicing

+

Stripe and ACH close the loop, straight to QuickBooks. Send a deposit request from the truck, get paid before the tarps are off.

+ Stripe · ACH · Affirm +
+ + +
+
+ + + + + +
+

LiDAR Estimates

+

Point your phone at the roof. We return precise pitch, area, and material take-off in 30 seconds. No drones, no climbing.

+ ±0.4 in accuracy + * +
+ + +
+
+ + + + +
+

Crew Chat & Files

+

Photos, contracts, change orders, all attached to the job, not lost in a group text. Works offline at the site.

+ Offline-first +
+ + +
+
+ + + + + +
+

Owner's Box

+

Job-level margin, crew utilization, and supplier waste, surfaced as one number you can actually act on.

+ Owner dashboard +
+
+
+
+ + +
+
+
+
+ Module · Intelligent Calendar +

A calendar that reschedules itself before you even notice.

+

LynkedUp watches weather, traffic, crew load, and material arrival in real time, then suggests one-tap fixes so a 7:32 AM thunderstorm doesn't blow up your whole Tuesday.

+ +
+
+
+ +
+
+

Weather-aware dispatch

+

Pulls hyperlocal forecasts every 15 minutes and flags jobs at risk before rain hits the deck.

+
+
+
+
+ +
+
+

Travel-optimized routing

+

Cuts dead-mileage by ~22% by clustering nearby estimates and matching the closest available crew.

+
+
+
+
+ +
+
+

Material readiness sync

+

If the shingles are still at ABC Supply, the job politely refuses to schedule. No more wasted trucks.

+
+
+
+
+ + +
+
+
November 2026 · Week 47
+
+
+ + + +
+ + +
+
+ +
+
+
Mon17
+
Tue18
+
Wed19
+
Thu20
+
Fri21
+
+ +
+
+
7 AM
+
8 AM
+
9 AM
+
10 AM
+
11 AM
+
12 PM
+
1 PM
+
+ +
+
+
Reynolds - Tear-off
+
Crew A · 7:30-9:30
+
+
+
Materials drop
+
ABC Supply
+
+
+
Vasquez estimate
+
11:00 · 18 min away
+
+
+ +
+
+
Patel - Inspection
+
7:30 · LiDAR ready
+
+
+
Kim - Estimate
+
10:00 · 22 min
+
+
+
Anderson - Install
+
Diego R. · 10:30-1:00
+
+
+ +
+
+
Reynolds - Underlayment
+
Crew A · cont.
+
+
+
Lunch break
+
All crews
+
+
+
Bennett - Shingle
+
Crew C
+
+
+ +
+
+
Storm assessment
+
3 leads queued
+
+
+
McKenna estimate
+
9:30 · drone
+
+
+
Anderson - Cleanup
+
Diego R.
+
+
+ +
+
+
Office: payroll
+
Admin
+
+
+
Whitfield - Full re-roof
+
All crews · 9:30-1:00
+
+
+ + +
+ 8:35 +
+ + +
+
+
+ +
+
+ Suggested actions + LynkedUp AI · just now +
+
+ +
+
+

+ Traffic is moderate on I-70 between Patel and Kim, adding ~14 min. Shift Kim's estimate to 9:45 AM and route Crew A through Cherry Creek to save 22 min of dead-mileage. +

+
+ + +
+
+
+
+
+
+
+ + + +
+
+ + +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ + +
+ + +
+
+ +

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+

$2000**

+ PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ + +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ + +
+
+ Deal Terms & Conditions +
+ +
+
+
+ + +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+
+ + + + + +
+
+
+
+ + + Founders Lifetime Deal closes in + +

The last roofing CRM you'll ever buy.

+

Join 3,000+ contractors who've ditched their monthly stack. One payment, one platform, one less thing to think about every billing cycle.

+ +
+
+
Deal ends Friday 11:59 PM PT
+
+
03
Days
+
14
Hours
+
27
Mins
+
42
Secs
+
+
+
+
+
+ + + 🔥 Founders Lifetime Deal - $2000 + + + +
+
+
© 2026 LynkedUp Inc · Built for roofers, by ex-roofers.
+
+
+

* Figures shown are illustrative and reflect beta-period targets; individual results vary.

+

** Founders Lifetime Deal is a one-time payment; limited founding-member availability.

+
+
+ +
+ + + + + + + + diff --git a/public/page/lp-v3.css b/public/page/lp-v3.css new file mode 100644 index 0000000..11d0104 --- /dev/null +++ b/public/page/lp-v3.css @@ -0,0 +1,3236 @@ +/* ========================================================== + LynkedUp Pro v3 — Dark brand-matched landing + ========================================================== */ +:root { + --bg-0: #020817; + --bg-1: #050f24; + --bg-2: #0a172e; + --bg-3: #0f2140; + + --line: rgba(56,189,248,.16); + --line-2: rgba(56,189,248,.10); + --line-3: rgba(56,189,248,.28); + + --ink: #e6edf6; + --ink-soft: #cbd5e1; + --body: #94a3b8; + --muted: #64748b; + --muted-2: #475569; + + --cyan: #22d3ee; + --cyan-2: #38bdf8; + --blue: #0ea5e9; + --blue-deep: #0369a1; + --orange: #f97316; + --orange-2: #fb923c; + --amber: #f59e0b; + --mint: #10b981; + --mint-2: #34d399; + --purple: #a78bfa; + + --r-sm: 8px; + --r-md: 12px; + --r-lg: 16px; + --r-xl: 24px; + + --glow-cyan: 0 0 0 1px rgba(56,189,248,.18), 0 12px 30px -10px rgba(2,132,199,.35); + --glow-orange: 0 12px 28px -10px rgba(249,115,22,.45), inset 0 1px 0 rgba(255,255,255,.18); +} + +* { box-sizing: border-box; } +html, body { margin: 0; padding: 0; } +body { + font-family: 'Inter', system-ui, -apple-system, sans-serif; + color: var(--ink); + background: var(--bg-0); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow-x: hidden; + padding-bottom: 88px; + line-height: 1.5; + font-feature-settings: "ss01", "cv11"; +} +h1, h2, h3, h4, h5, .sec-h, .hero h1, .brand-word { + font-family: 'Inter', system-ui, sans-serif; +} +.mono { font-family: 'JetBrains Mono', monospace; } + +/* ============== Ambient background ============== */ +.bg-stack { position: fixed; inset: 0; z-index: -1; overflow: hidden; pointer-events: none; } +.bg-grid { + position: absolute; inset: 0; + background-image: + linear-gradient(rgba(56,189,248,.06) 1px, transparent 1px), + linear-gradient(90deg, rgba(56,189,248,.06) 1px, transparent 1px); + background-size: 56px 56px; + mask-image: radial-gradient(ellipse 1200px 800px at 50% 0%, black 30%, transparent 80%); +} +.bg-orb { position: absolute; border-radius: 50%; filter: blur(120px); opacity: .65; } +.bg-orb.b-cyan { + width: 900px; height: 900px; left: -300px; top: -380px; + background: radial-gradient(circle, rgba(2,132,199,.55), rgba(2,132,199,0) 70%); +} +.bg-orb.b-orange { + width: 700px; height: 700px; right: -260px; top: 200px; + background: radial-gradient(circle, rgba(249,115,22,.35), rgba(249,115,22,0) 70%); +} +.bg-circuit { + position: absolute; inset: 0; + background: + radial-gradient(ellipse 800px 500px at 100% 80%, rgba(56,189,248,.10), transparent 70%), + radial-gradient(ellipse 700px 400px at 0% 30%, rgba(125,211,252,.08), transparent 70%); +} + +/* ============== Layout ============== */ +.wrap { max-width: 1280px; margin: 0 auto; padding: 0 32px; } +.sec-head { margin-bottom: 60px; } +.sec-center { text-align: center; } +.sec-center .sec-sub { max-width: 680px; margin-left: auto; margin-right: auto; } + +/* ============== Brand mark ============== */ +.brand { display: inline-flex; align-items: center; gap: 12px; text-decoration: none; color: var(--ink); } +.brand-img { height: 28px; width: auto; display: block; } +.brand-word { + font-family: 'Plus Jakarta Sans'; + font-weight: 700; letter-spacing: -.025em; font-size: 19px; +} +.brand-word .pro { color: var(--orange-2); font-weight: 800; } +.brand-hex { display: inline-flex; } +.brand-hex.tiny svg { width: 22px; height: 24px; } + +/* ============== Nav ============== */ +.nav { + position: sticky; top: 0; z-index: 50; + backdrop-filter: blur(16px) saturate(160%); + -webkit-backdrop-filter: blur(16px) saturate(160%); + background: rgba(5,15,36,.75); + border-bottom: 1px solid var(--line); +} +.nav-inner { + display: flex; align-items: center; justify-content: space-between; + height: 76px; +} +.nav-links { display: flex; gap: 32px; } +.nav-links a { + color: var(--ink-soft); text-decoration: none; + font-size: 14px; font-weight: 500; + display: inline-flex; align-items: center; gap: 6px; + transition: color .2s; +} +.nav-links a:hover { color: var(--cyan-2); } +.nav-links .chev { width: 8px; height: 8px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg); display: inline-block; margin-bottom: 3px; opacity: .6; } +.nav-cta { display: flex; align-items: center; gap: 10px; } + +/* ============== Buttons ============== */ +.btn { + display: inline-flex; align-items: center; justify-content: center; gap: 8px; + font-family: inherit; font-weight: 600; font-size: 14.5px; line-height: 1; + padding: 12px 20px; border-radius: 999px; border: 1px solid transparent; + cursor: pointer; transition: transform .15s ease, box-shadow .25s ease, background .2s; + text-decoration: none; white-space: nowrap; + position: relative; +} +.btn:hover { transform: translateY(-1px); } +.btn .arr { transition: transform .2s; } +.btn:hover .arr { transform: translateX(3px); } +.btn-ghost { + color: var(--ink-soft); + background: rgba(255,255,255,.04); + border: 1px solid var(--line-3); +} +.btn-ghost:hover { background: rgba(56,189,248,.08); border-color: rgba(56,189,248,.5); color: #fff; } +.btn-ghost .play { + width: 22px; height: 22px; border-radius: 50%; + background: rgba(56,189,248,.16); color: var(--cyan-2); + display: grid; place-items: center; + padding-left: 2px; +} +.btn-orange { + color: #fff; + background: linear-gradient(180deg, #fb923c 0%, #f97316 50%, #ea580c 100%); + box-shadow: var(--glow-orange); +} +.btn-orange:hover { + box-shadow: 0 16px 36px -10px rgba(249,115,22,.6), inset 0 1px 0 rgba(255,255,255,.22); +} +.btn-cyan { + color: #fff; + background: linear-gradient(180deg, #38bdf8 0%, #0284c7 100%); + box-shadow: 0 10px 24px -10px rgba(2,132,199,.6), inset 0 1px 0 rgba(255,255,255,.2); +} +.btn-lg { padding: 14px 22px; font-size: 14.5px; } +.btn-xl { padding: 18px 28px; font-size: 15.5px; font-weight: 700; } + +/* ============== Pills & eyebrows ============== */ +.ltd-pill { + display: inline-flex; align-items: center; gap: 10px; + padding: 7px 8px 7px 14px; border-radius: 999px; + background: rgba(249,115,22,.10); + border: 1px solid rgba(249,115,22,.35); + font-size: 13px; font-weight: 600; color: var(--orange-2); + box-shadow: 0 0 0 1px rgba(249,115,22,.05), 0 6px 18px -8px rgba(249,115,22,.4); +} +.ltd-pill b { color: #fed7aa; font-weight: 700; } +.ltd-pill .dot { + width: 7px; height: 7px; border-radius: 50%; background: var(--orange); + box-shadow: 0 0 0 4px rgba(249,115,22,.2); + animation: pulse 2.2s infinite; +} +.ltd-pill .badge { + background: linear-gradient(180deg, #fb923c, #ea580c); color: #fff; + font-weight: 700; font-size: 11px; padding: 4px 10px; border-radius: 999px; + letter-spacing: .04em; box-shadow: inset 0 1px 0 rgba(255,255,255,.2); +} +@keyframes pulse { + 0%, 100% { box-shadow: 0 0 0 4px rgba(249,115,22,.2); } + 50% { box-shadow: 0 0 0 9px rgba(249,115,22,.07); } +} + +.eyebrow { + display: inline-flex; align-items: center; gap: 8px; + padding: 6px 13px 6px 10px; border-radius: 999px; + background: rgba(56,189,248,.08); + border: 1px solid rgba(56,189,248,.25); + color: var(--cyan-2); + font-size: 12px; font-weight: 600; letter-spacing: .01em; +} +.eyebrow .d { width: 6px; height: 6px; border-radius: 50%; background: var(--cyan-2); box-shadow: 0 0 8px var(--cyan-2); } +.eyebrow-orange { + color: var(--orange-2); background: rgba(249,115,22,.08); border-color: rgba(249,115,22,.3); +} +.eyebrow-orange .d { background: var(--orange-2); box-shadow: 0 0 8px var(--orange-2); } +.eyebrow-cyan { color: var(--cyan); } + +/* ============== Section H ============== */ +.sec-h { + font-family: 'Plus Jakarta Sans'; + /* Fluid typography — scales between mobile (28px) and desktop (42px) */ + font-size: clamp(1.75rem, 3.2vw + 1rem, 2.625rem); + line-height: 1.15; letter-spacing: -.03em; font-weight: 700; + color: #fff; + margin: 18px 0 14px; + text-wrap: balance; +} +.sec-sub { + font-size: clamp(0.9375rem, 0.25vw + 0.875rem, 1rem); + line-height: 1.6; color: var(--body); text-wrap: pretty; +} +.g-blue { + background: linear-gradient(180deg, #38bdf8 0%, #0284c7 100%); + -webkit-background-clip: text; background-clip: text; color: transparent; +} +.g-blue-light { + background: linear-gradient(180deg, #7dd3fc 0%, #38bdf8 100%); + -webkit-background-clip: text; background-clip: text; color: transparent; +} +.g-orange { + background: linear-gradient(180deg, #fbbf24 0%, #f97316 100%); + -webkit-background-clip: text; background-clip: text; color: transparent; +} + +/* ============== HERO ============== */ +.hero { padding: 60px 0 80px; position: relative; } +.hero-inner { + display: flex; flex-direction: column; + align-items: center; gap: 64px; + text-align: center; +} +.hero-copy { + padding-right: 0; + max-width: 820px; + margin: 0 auto; +} +.hero h1 { + font-family: 'Inter', system-ui, sans-serif; + /* Fluid headline — 34px on small phones up to 60px on desktop */ + font-size: clamp(2.125rem, 5.5vw + 1rem, 3.75rem); + line-height: 1.05; letter-spacing: -.035em; font-weight: 700; + margin: 22px auto 20px; color: #fff; text-wrap: balance; + max-width: 880px; +} +.hero .sub { + font-size: clamp(0.9375rem, 0.5vw + 0.85rem, 1.0625rem); + line-height: 1.6; color: var(--body); + max-width: 640px; margin: 0 auto 32px; +} +.hero-ctas { display: flex; gap: 12px; align-items: center; justify-content: center; flex-wrap: wrap; } +.hero-trust { + display: flex; align-items: center; gap: 18px; margin-top: 30px; + color: var(--muted); font-size: 13px; flex-wrap: wrap; + justify-content: center; +} +.hero-trust .t-stars { display: flex; align-items: center; gap: 8px; } +.hero-trust .t-stars .stars { color: var(--amber); letter-spacing: 1px; font-size: 13px; } +.hero-trust .t-stars b { color: #fff; font-weight: 700; } +.hero-trust .t-it { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-soft); } +.hero-trust .t-it svg { color: var(--mint-2); } +.hero-trust .sep { width: 1px; height: 14px; background: var(--line); } + +/* Hero artwork — full-width landscape banner */ +.hero-art { + position: relative; + width: 100%; + max-width: 1180px; + aspect-ratio: 21 / 9; + margin: 0 auto; + padding: 0; +} +.hero-model-img { + width: 100% !important; + height: 100% !important; + display: block !important; + border: 1px solid var(--line-3) !important; + border-radius: 24px !important; + box-shadow: + 0 50px 100px -30px rgba(2,132,199,.35), + 0 70px 140px -50px rgba(0,0,0,.7), + 0 0 0 1px rgba(56,189,248,.18) inset !important; +} +.hero-model-overlay { + position: absolute; + inset: 0; + border-radius: 24px; + overflow: hidden; + pointer-events: none; + z-index: 2; +} +.hmo-grid { + position: absolute; inset: 0; + width: 100%; height: 100%; + opacity: .35; + mix-blend-mode: screen; +} +/* CAD / LiDAR dimension overlay */ +.hmo-dims { + position: absolute; inset: 0; + width: 100%; height: 100%; + filter: drop-shadow(0 0 5px rgba(34,211,238,.55)); +} +.hmo-dims .dim { + opacity: 0; + animation: dimFade .7s ease forwards; +} +.hmo-dims .dim:nth-child(1) { animation-delay: .35s; } +.hmo-dims .dim:nth-child(2) { animation-delay: .5s; } +.hmo-dims .dim:nth-child(3) { animation-delay: .65s; } +.hmo-dims .dim:nth-child(4) { animation-delay: .8s; } +.hmo-dims .dim:nth-child(5) { animation-delay: .95s; } +.hmo-dims .dln { + stroke: #22d3ee; stroke-width: 2.4; +} +.hmo-dims .ext { + stroke: rgba(56,189,248,.55); stroke-width: 1.6; stroke-dasharray: 5 6; +} +.hmo-dims .arw { + fill: none; stroke: #22d3ee; stroke-width: 2.6; + stroke-linecap: round; stroke-linejoin: round; +} +.hmo-dims .lbl rect { + fill: rgba(5,15,36,.82); + stroke: rgba(56,189,248,.5); stroke-width: 1.4; +} +.hmo-dims .lbl text { + fill: #e0f7ff; + font-family: "JetBrains Mono", monospace; + font-size: 26px; font-weight: 600; + text-anchor: middle; + paint-order: stroke; +} +@keyframes dimFade { + from { opacity: 0; transform: translateY(6px); } + to { opacity: 1; transform: translateY(0); } +} + +.hero-model-overlay .corner { + position: absolute; + width: 32px; height: 32px; + border: 1.5px solid var(--cyan-2); + filter: drop-shadow(0 0 8px rgba(56,189,248,.7)); +} +.hero-model-overlay .corner.tl { top: 20px; left: 20px; border-right: 0; border-bottom: 0; } +.hero-model-overlay .corner.tr { top: 20px; right: 20px; border-left: 0; border-bottom: 0; } +.hero-model-overlay .corner.bl { bottom: 20px; left: 20px; border-right: 0; border-top: 0; } +.hero-model-overlay .corner.br { bottom: 20px; right: 20px; border-left: 0; border-top: 0; } +.hero-model-overlay .scan-line { + position: absolute; + left: 4%; right: 4%; height: 2px; + background: linear-gradient(90deg, transparent 0%, rgba(34,211,238,0) 10%, rgba(34,211,238,.9) 50%, rgba(34,211,238,0) 90%, transparent 100%); + box-shadow: 0 0 12px rgba(34,211,238,.8); + animation: scanY 4s linear infinite; + top: 0; +} +@keyframes scanY { + 0% { top: 8%; opacity: 0; } + 10% { opacity: 1; } + 90% { opacity: 1; } + 100% { top: 92%; opacity: 0; } +} +.art-chip { + position: absolute; + background: rgba(5,15,36,.78); + border: 1px solid rgba(56,189,248,.3); + border-radius: 12px; + padding: 10px 14px; + display: flex; align-items: center; gap: 10px; + backdrop-filter: blur(12px) saturate(160%); + -webkit-backdrop-filter: blur(12px) saturate(160%); + box-shadow: 0 10px 30px -10px rgba(0,0,0,.5), 0 0 0 1px rgba(56,189,248,.15) inset; + color: var(--ink); + font-size: 11px; +} +.art-chip .l { color: var(--muted); font-size: 10.5px; font-weight: 500; } +.art-chip .v { color: #fff; font-weight: 700; font-size: 13px; letter-spacing: -.01em; } +.art-chip .pulse { + width: 8px; height: 8px; border-radius: 50%; background: var(--cyan); + box-shadow: 0 0 12px var(--cyan), 0 0 0 4px rgba(34,211,238,.2); + animation: pulse 1.8s infinite; +} +.art-chip-tl { top: 28px; left: 28px; color: var(--mint-2); } +.art-chip-tl svg { color: var(--mint-2); } +.art-chip-tr { top: 28px; right: 28px; color: var(--orange-2); } +.art-chip-tr svg { color: var(--orange-2); } +.art-chip-br { bottom: 28px; right: 28px; } + +/* Stat ribbon */ +.stat-ribbon { + margin-top: 60px; + display: grid; grid-template-columns: repeat(4, 1fr); + background: rgba(5,15,36,.7); + border: 1px solid var(--line); + border-radius: 18px; + padding: 6px; + backdrop-filter: blur(12px) saturate(140%); + box-shadow: 0 30px 60px -30px rgba(0,0,0,.6), inset 0 1px 0 rgba(56,189,248,.08); +} +.stat-it { + padding: 18px 22px; display: flex; align-items: center; gap: 14px; + border-right: 1px solid var(--line-2); +} +.stat-it:last-child { border-right: 0; } +.stat-it .t { font-size: 14px; font-weight: 700; color: #fff; letter-spacing: -.01em; } +.stat-it .s { font-size: 12px; color: var(--muted); margin-top: 2px; } +.stat-it .ic { + width: 40px; height: 40px; border-radius: 10px; + display: grid; place-items: center; flex: none; + border: 1px solid; +} +.ic-orange { background: rgba(249,115,22,.10); color: var(--orange-2); border-color: rgba(249,115,22,.3); } +.ic-cyan { background: rgba(56,189,248,.10); color: var(--cyan-2); border-color: rgba(56,189,248,.3); } +.ic-mint { background: rgba(16,185,129,.10); color: var(--mint-2); border-color: rgba(16,185,129,.3); } +.ic-purple { background: rgba(167,139,250,.10); color: var(--purple); border-color: rgba(167,139,250,.3); } + +/* ============== LOGOS BAND ============== */ +.logos-band { + padding: 32px 0 0; +} +.logos-inner { + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + padding: 26px 0; + display: flex; align-items: center; justify-content: space-between; gap: 24px; +} +.logos-l { + color: var(--muted); font-size: 12.5px; font-weight: 600; + letter-spacing: .12em; text-transform: uppercase; white-space: nowrap; +} +.logos-l b { color: #fff; font-weight: 700; } +.logos-row { display: flex; gap: 56px; align-items: center; flex: 1; justify-content: center; opacity: .7; flex-wrap: wrap; row-gap: 12px; } +.logos-row span { color: #94a3b8; font-weight: 700; font-size: 17px; letter-spacing: -.01em; white-space: nowrap; } +.logos-row .lg-1 { font-style: italic; font-family: 'JetBrains Mono'; font-weight: 800; } +.logos-row .lg-3 { letter-spacing: .3em; font-weight: 600; font-size: 13px; } +.logos-row .lg-5 { font-weight: 800; } + +/* ============== PLATFORM / DASHBOARD WINDOW ============== */ +.sec-platform { padding: 130px 0 100px; } + +.dash-window { + max-width: 1180px; margin: 0 auto; + background: + radial-gradient(ellipse 600px 400px at 80% 100%, rgba(167,139,250,.10), transparent 70%), + radial-gradient(ellipse 500px 350px at 0% 0%, rgba(56,189,248,.08), transparent 70%), + rgba(10,15,28,.92); + border: 1px solid var(--line); + border-radius: 24px; + overflow: hidden; + box-shadow: + 0 50px 100px -40px rgba(0,0,0,.7), + 0 30px 60px -30px rgba(167,139,250,.25), + 0 0 0 1px rgba(56,189,248,.12) inset; + backdrop-filter: blur(14px) saturate(140%); +} + +/* Browser bar */ +.dw-bar { + display: grid; grid-template-columns: 80px 1fr 80px; + align-items: center; + padding: 14px 18px; + border-bottom: 1px solid var(--line-2); + background: rgba(2,8,23,.4); +} +.dw-dots { display: flex; gap: 7px; } +.dw-dots i { width: 11px; height: 11px; border-radius: 50%; display: block; } +.dw-dots i:nth-child(1) { background: #fb7185; } +.dw-dots i:nth-child(2) { background: #fbbf24; } +.dw-dots i:nth-child(3) { background: #34d399; } +.dw-url { + justify-self: center; + display: inline-flex; align-items: center; gap: 8px; + max-width: 460px; width: 100%; + padding: 7px 14px; border-radius: 999px; + background: rgba(15,33,64,.65); + border: 1px solid var(--line-2); + font-size: 12.5px; color: var(--ink-soft); font-weight: 500; + justify-content: center; +} +.dw-url svg { color: var(--mint-2); } + +/* Body */ +.dw-body { padding: 30px 32px 32px; } + +/* KPI strip */ +.dw-kpis { + display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; + margin-bottom: 28px; +} +.dw-kpi { + position: relative; + padding: 22px 18px; + background: rgba(15,33,64,.4); + border: 1px solid var(--line-2); + border-radius: 16px; + text-align: center; + transition: border-color .2s, transform .2s, background .2s; +} +.dw-kpi:hover { + border-color: rgba(56,189,248,.35); + background: rgba(15,33,64,.6); + transform: translateY(-2px); +} +.dw-kpi-l { + font-size: 10.5px; font-weight: 600; + color: var(--muted); + letter-spacing: .12em; text-transform: uppercase; + margin-bottom: 14px; +} +.dw-kpi-v { + font-size: 36px; font-weight: 800; + letter-spacing: -.035em; line-height: 1; + margin-bottom: 10px; +} +.dw-kpi-d { + font-size: 12px; font-weight: 600; + color: var(--mint-2); +} + +/* Color utility classes used in KPI numbers + activity values */ +.c-cyan { color: var(--cyan); } +.c-purple { color: var(--purple); } +.c-mint { color: var(--mint-2); } +.c-orange { color: var(--orange-2); } + +/* Chart + activity split */ +.dw-split { + display: grid; grid-template-columns: 1.6fr 1fr; + gap: 16px; + align-items: stretch; +} + +.dw-chart { + background: rgba(15,33,64,.35); + border: 1px solid var(--line-2); + border-radius: 16px; + padding: 20px 22px; + display: flex; flex-direction: column; + min-height: 280px; +} +.dw-chart-h { + display: flex; justify-content: space-between; align-items: baseline; + margin-bottom: 12px; +} +.dw-chart-h h4 { + font-size: 14px; font-weight: 700; color: #fff; + letter-spacing: -.01em; margin: 0; +} +.dw-chart-h h4 .dim { color: var(--muted); font-weight: 500; } +.dw-chart-meta { font-size: 11.5px; color: var(--muted); } + +.dw-chart-stage { flex: 1; display: flex; flex-direction: column; } +.dw-chart-svg { + width: 100%; flex: 1; + min-height: 180px; +} +.dw-chart-x { + display: flex; justify-content: space-around; + margin-top: 4px; + font-size: 11px; color: var(--muted); font-weight: 500; +} + +/* Activity stack */ +.dw-act { + display: flex; flex-direction: column; gap: 10px; +} +.dw-act-item { + background: rgba(15,33,64,.35); + border: 1px solid var(--line-2); + border-radius: 14px; + padding: 14px 18px; + transition: border-color .2s, transform .2s, background .2s; +} +.dw-act-item:hover { + border-color: rgba(56,189,248,.35); + background: rgba(15,33,64,.55); + transform: translateX(2px); +} +.dw-act-row { + display: flex; justify-content: space-between; align-items: center; + gap: 10px; +} +.dw-act-row.sub { margin-top: 6px; } +.dw-act-t { + font-size: 14px; font-weight: 700; color: #fff; letter-spacing: -.01em; +} +.dw-act-v { + font-size: 14px; font-weight: 700; letter-spacing: -.01em; +} +.dw-act-row.sub > div { + font-size: 11.5px; color: var(--muted); +} +.dw-act-row.sub .status { font-weight: 600; } + +/* ============== Dashboard window — product screenshot tabs ============== */ +.dw-tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 18px 22px 0; + position: relative; + z-index: 1; +} +.dw-tab { + display: inline-flex; align-items: center; gap: 8px; + padding: 9px 16px; + border-radius: 999px; + font: 600 12.5px/1 'Plus Jakarta Sans', sans-serif; + letter-spacing: -.005em; + color: var(--ink-soft); + background: rgba(15,33,64,.55); + border: 1px solid var(--line-2); + cursor: pointer; + transition: color .2s, background .2s, border-color .2s, box-shadow .2s, transform .15s; + -webkit-tap-highlight-color: transparent; +} +.dw-tab:hover { + color: #fff; + border-color: rgba(56,189,248,.4); + background: rgba(15,33,64,.78); + transform: translateY(-1px); +} +.dw-tab:focus-visible { + outline: 2px solid var(--cyan-2); + outline-offset: 2px; +} +.dw-tab.is-active { + color: #fff; + background: linear-gradient(180deg, rgba(56,189,248,.22), rgba(56,189,248,.08)); + border-color: rgba(56,189,248,.5); + box-shadow: + inset 0 0 0 1px rgba(56,189,248,.18), + 0 8px 22px -10px rgba(56,189,248,.55); +} +.dw-tab svg { color: var(--cyan-2); flex: none; } +.dw-tab.is-active svg { color: #7dd3fc; } + +/* Screenshot stage — sized to match the screenshot's native ratio (~16:8.85) + so the whole image fits without cropping. */ +.dw-stage { + position: relative; + margin: 18px 22px 22px; + padding: 0; + border-radius: 16px; + overflow: hidden; + border: 1px solid var(--line-2); + background: + radial-gradient(ellipse 600px 280px at 50% 0%, rgba(56,189,248,.08), transparent 70%), + rgba(2,8,23,.7); + aspect-ratio: 1693 / 929; + width: auto; + max-width: 100%; + box-shadow: + 0 30px 60px -30px rgba(0,0,0,.7), + 0 0 0 1px rgba(56,189,248,.1) inset, + 0 0 80px -30px rgba(56,189,248,.25); +} +.dw-shot { + position: absolute; inset: 0; + width: 100%; height: 100%; + max-width: 100%; max-height: 100%; + object-fit: contain; + object-position: center; + display: block; + opacity: 0; + transform: scale(1.008); + transition: opacity .42s ease, transform .42s ease; + pointer-events: none; +} +.dw-shot.is-active { + opacity: 1; + transform: scale(1); + pointer-events: auto; +} +/* Subtle scan corners on the stage to keep the brand HUD feel */ +.dw-corner { + position: absolute; width: 18px; height: 18px; + border: 2px solid var(--cyan-2); + opacity: .55; + pointer-events: none; + z-index: 2; +} +.dw-corner.tl { top: 10px; left: 10px; border-right: 0; border-bottom: 0; border-top-left-radius: 6px; } +.dw-corner.tr { top: 10px; right: 10px; border-left: 0; border-bottom: 0; border-top-right-radius: 6px; } +.dw-corner.bl { bottom: 10px; left: 10px; border-right: 0; border-top: 0; border-bottom-left-radius: 6px; } +.dw-corner.br { bottom: 10px; right: 10px; border-left: 0; border-top: 0; border-bottom-right-radius: 6px; } + +/* ============== old laptop styles (kept harmless) ============== */ + +/* Card placement */ +.b-hero { grid-column: 1 / 9; grid-row: 1; min-height: 460px; } +.b-schedule { grid-column: 9 / 13; grid-row: 1; min-height: 460px; } +.b-ai { grid-column: 1 / 6; grid-row: 2; min-height: 280px; } +.b-donut { grid-column: 6 / 9; grid-row: 2; min-height: 280px; } +.b-map { grid-column: 9 / 13; grid-row: 2; min-height: 280px; } + +/* Card header */ +.bc-head { + display: flex; justify-content: space-between; align-items: center; + padding-bottom: 14px; margin-bottom: 16px; + border-bottom: 1px solid var(--line-2); +} +.bc-title { + display: flex; align-items: center; gap: 9px; + font-size: 13px; font-weight: 700; color: #fff; letter-spacing: -.01em; +} +.bc-title > svg { color: var(--cyan-2); } +.bc-sub { color: var(--muted); font-weight: 500; font-size: 12px; } +.bc-dot.live { + width: 7px; height: 7px; border-radius: 50%; + background: var(--mint-2); + box-shadow: 0 0 10px var(--mint-2); + animation: pulse 1.8s infinite; +} +.bc-meta { + font-size: 11px; color: var(--muted); + font-family: 'JetBrains Mono'; +} +.bc-url { + display: inline-flex; align-items: center; gap: 5px; + padding: 4px 10px; border-radius: 999px; + background: rgba(2,8,23,.6); + border: 1px solid var(--line-2); + color: var(--ink-soft); +} +.bc-url svg { color: var(--mint-2); } + +/* ===== Hero card ===== */ +.b-kpis { + display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; + margin-bottom: 22px; +} +.b-kpi { + padding: 12px 14px; + background: rgba(5,15,36,.5); + border: 1px solid var(--line-2); + border-radius: 12px; +} +.b-kpi-l { font-size: 10.5px; color: var(--muted); font-weight: 500; } +.b-kpi-v { + font-size: 22px; font-weight: 800; color: #fff; + letter-spacing: -.025em; margin: 2px 0 3px; +} +.b-kpi-v span { font-size: 14px; color: var(--ink-soft); font-weight: 700; } +.b-kpi-d { + font-size: 10.5px; font-weight: 600; + display: inline-flex; align-items: center; gap: 3px; +} +.b-kpi-d.up { color: var(--mint-2); } +.b-kpi-d.am { color: var(--orange-2); } + +.b-chart { flex: 1; display: flex; flex-direction: column; } +.b-chart-h { + display: flex; justify-content: space-between; align-items: center; + margin-bottom: 10px; +} +.b-chart-t { font-size: 12px; color: var(--ink-soft); font-weight: 600; } +.b-chart-legend { + display: flex; gap: 14px; font-size: 11px; color: var(--muted); +} +.b-chart-legend span { display: inline-flex; align-items: center; gap: 5px; } +.b-chart-legend i { width: 12px; height: 2px; display: inline-block; } +.b-chart-svg { width: 100%; height: 130px; overflow: visible; } +.b-chart-x { + display: flex; justify-content: space-between; + margin-top: 6px; + font-size: 10px; color: var(--muted-2); font-family: 'JetBrains Mono'; +} + +/* ===== Schedule card ===== */ +.b-sched { + flex: 1; + display: flex; flex-direction: column; gap: 10px; + overflow: hidden; +} +.b-s-row { + display: grid; grid-template-columns: 40px 1fr; gap: 10px; + align-items: center; +} +.b-s-time { + font-family: 'JetBrains Mono'; font-size: 11px; + color: var(--muted); font-weight: 600; + text-align: right; +} +.b-s-event { + padding: 8px 12px; border-radius: 9px; + border-left: 3px solid; + background: rgba(56,189,248,.06); +} +.b-s-event .t { font-size: 12.5px; font-weight: 700; color: #fff; letter-spacing: -.005em; } +.b-s-event .s { font-size: 10.5px; color: var(--ink-soft); margin-top: 2px; opacity: .85; } +.b-s-orange { border-left-color: var(--orange-2); background: rgba(249,115,22,.10); } +.b-s-orange .t { color: var(--orange-2); } +.b-s-cyan { border-left-color: var(--cyan-2); background: rgba(56,189,248,.10); } +.b-s-cyan .t { color: var(--cyan-2); } +.b-s-mint { border-left-color: var(--mint-2); background: rgba(16,185,129,.10); } +.b-s-mint .t { color: var(--mint-2); } +.b-s-purple { border-left-color: var(--purple); background: rgba(167,139,250,.10); } +.b-s-purple .t { color: var(--purple); } + +.b-sched-foot { + display: flex; justify-content: space-between; align-items: center; + margin-top: 14px; padding-top: 14px; + border-top: 1px solid var(--line-2); + font-size: 11px; color: var(--muted); +} +.b-link { color: var(--cyan-2); text-decoration: none; font-weight: 600; font-size: 11.5px; } + +/* ===== AI card ===== */ +.b-ai { background: linear-gradient(135deg, rgba(167,139,250,.12) 0%, rgba(10,23,46,.7) 60%); border-color: rgba(167,139,250,.25); } +.b-ai-pulse { + position: absolute; top: -40px; right: -40px; + width: 140px; height: 140px; + background: radial-gradient(circle, rgba(167,139,250,.4), transparent 70%); + filter: blur(20px); pointer-events: none; +} +.b-ai-ic { + width: 22px; height: 22px; border-radius: 7px; + background: linear-gradient(135deg, #38bdf8, #a78bfa); + display: grid; place-items: center; color: #fff; + box-shadow: 0 3px 10px -2px rgba(167,139,250,.5); +} +.b-ai-msg { + font-size: 13.5px; line-height: 1.55; color: var(--ink-soft); + margin: 0 0 16px; +} +.b-ai-msg b { color: #fff; } +.b-ai-msg .hl { + background: rgba(249,115,22,.18); color: var(--orange-2); + padding: 1px 6px; border-radius: 4px; font-weight: 700; +} +.b-ai-spark { + display: flex; justify-content: space-between; align-items: center; + margin-bottom: 14px; + padding: 10px 12px; border-radius: 10px; + background: rgba(5,15,36,.5); + border: 1px solid var(--line-2); +} +.b-ai-spark-l .lbl { display: block; font-size: 10px; color: var(--muted); font-weight: 500; } +.b-ai-spark-l .val { font-size: 18px; font-weight: 800; color: var(--purple); letter-spacing: -.02em; } +.b-ai-spark-l .val small { font-size: 11px; color: var(--ink-soft); } +.b-ai-spark-svg { width: 70px; height: 28px; } + +.b-ai-act { display: flex; gap: 8px; margin-top: auto; } +.b-ai-btn { + flex: 1; padding: 8px 12px; border-radius: 8px; + font-family: inherit; font-size: 12px; font-weight: 600; + background: rgba(5,15,36,.6); border: 1px solid var(--line); + color: var(--ink-soft); cursor: pointer; + display: inline-flex; align-items: center; justify-content: center; gap: 5px; +} +.b-ai-btn.pri { + background: linear-gradient(180deg, #a78bfa, #7c3aed); + color: #fff; border-color: transparent; + box-shadow: 0 4px 12px -4px rgba(167,139,250,.5); +} + +/* ===== Donut card ===== */ +.b-donut-wrap { + flex: 1; + display: flex; align-items: center; gap: 14px; +} +.b-donut-svg { width: 110px; height: 110px; flex: none; } +.b-donut-legend { + list-style: none; padding: 0; margin: 0; + display: flex; flex-direction: column; gap: 7px; + flex: 1; min-width: 0; +} +.b-donut-legend li { + display: flex; align-items: center; gap: 8px; + font-size: 11.5px; color: var(--ink-soft); +} +.b-donut-legend li .sw { width: 8px; height: 8px; border-radius: 2px; flex: none; } +.b-donut-legend li b { margin-left: auto; color: #fff; font-weight: 700; } + +/* ===== Map card ===== */ +.b-map-stage { position: relative; flex: 1; border-radius: 10px; overflow: hidden; } +.b-map-svg { width: 100%; height: 100%; display: block; } +.b-map-overlay { + position: absolute; bottom: 10px; left: 10px; right: 10px; +} +.b-map-pin { + display: flex; align-items: center; gap: 10px; + background: rgba(2,8,23,.85); + border: 1px solid var(--line); + padding: 8px 12px; border-radius: 10px; + backdrop-filter: blur(8px); +} +.b-map-pin .dot { + width: 8px; height: 8px; border-radius: 50%; + box-shadow: 0 0 8px currentColor; + flex: none; +} +.b-map-pin .dot.orange { background: var(--orange-2); color: var(--orange-2); } +.b-map-pin b { display: block; font-size: 11.5px; color: #fff; font-weight: 700; } +.b-map-pin span:not(.dot) { display: block; font-size: 10px; color: var(--muted); } + +/* ============== old laptop styles (kept harmless) ============== */ + +.laptop-frame { + margin: 0 auto; + max-width: 1180px; + position: relative; + filter: drop-shadow(0 40px 80px rgba(0,0,0,.6)) drop-shadow(0 0 80px rgba(2,132,199,.18)); +} +.laptop-screen { + background: linear-gradient(180deg, #475569 0%, #334155 100%); + border-radius: 14px 14px 6px 6px; + padding: 12px 12px 0; + border: 1px solid #1e293b; + border-bottom: 0; +} +.laptop-base { + height: 16px; + background: linear-gradient(180deg, #475569 0%, #1e293b 100%); + border-radius: 0 0 18px 18px; + width: 110%; margin-left: -5%; + position: relative; +} +.laptop-base::after { + content:""; position: absolute; top: 0; left: 50%; transform: translateX(-50%); + width: 100px; height: 8px; background: #0f172a; border-radius: 0 0 8px 8px; +} + +/* Browser top bar */ +.lf-bar { + display: flex; align-items: center; gap: 12px; + padding: 0 16px 0 12px; height: 36px; + background: #0a172e; + border-radius: 6px 6px 0 0; +} +.lf-bar .dots { display: flex; gap: 6px; } +.lf-bar .dots i { width: 10px; height: 10px; border-radius: 50%; background: #475569; } +.lf-bar .url { + flex: 1; max-width: 380px; margin: 0 auto; + height: 22px; background: rgba(255,255,255,.04); + border: 1px solid var(--line); + border-radius: 6px; padding: 0 12px; + display: flex; align-items: center; gap: 8px; + font-size: 11.5px; color: var(--muted); +} +.lf-bar .url svg { color: var(--mint-2); } + +/* Owners Box */ +.ob { + background: var(--bg-1); + display: grid; grid-template-columns: 220px 1fr; + height: 660px; +} +.ob-side { + background: var(--bg-2); + border-right: 1px solid var(--line-2); + padding: 18px 12px; + overflow: hidden; +} +.ob-brand { + display: flex; align-items: center; gap: 9px; + padding: 0 6px 16px; + font-size: 14px; font-weight: 700; color: #fff; + border-bottom: 1px solid var(--line-2); margin-bottom: 10px; +} +.ob-side-list { display: flex; flex-direction: column; gap: 1px; } +.ob-i { + display: flex; align-items: center; gap: 10px; + padding: 7px 10px; border-radius: 7px; + font-size: 12.5px; color: var(--ink-soft); font-weight: 500; + cursor: pointer; +} +.ob-i svg { color: var(--muted); flex: none; } +.ob-i:hover { background: rgba(56,189,248,.06); color: #fff; } +.ob-i.active { + background: rgba(56,189,248,.10); + color: var(--cyan-2); + font-weight: 600; +} +.ob-i.active svg { color: var(--cyan-2); } +.ob-i.ai svg { color: var(--purple); } +.ob-i .c { + margin-left: auto; font-size: 10.5px; font-weight: 700; + background: rgba(56,189,248,.15); color: var(--cyan-2); + padding: 1px 6px; border-radius: 4px; +} + +/* Main */ +.ob-main { padding: 18px 22px; overflow: hidden; } +.ob-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 18px; } +.ob-hi { font-size: 16px; font-weight: 700; color: #fff; letter-spacing: -.015em; } +.ob-sub { font-size: 12px; color: var(--muted); margin-top: 2px; } +.ob-top-r { display: flex; align-items: center; gap: 10px; } +.ob-btn { + background: var(--bg-3); color: var(--ink-soft); + border: 1px solid var(--line); padding: 7px 11px; border-radius: 7px; + font-size: 11.5px; font-weight: 600; cursor: pointer; font-family: inherit; +} +.ob-bell { + position: relative; width: 30px; height: 30px; + border-radius: 8px; background: var(--bg-3); border: 1px solid var(--line); + color: var(--ink-soft); display: grid; place-items: center; cursor: pointer; +} +.ob-bell .badge-dot { + position: absolute; top: 6px; right: 6px; + width: 7px; height: 7px; border-radius: 50%; + background: var(--orange); + box-shadow: 0 0 0 2px var(--bg-3); +} +.av-j { + width: 30px; height: 30px; border-radius: 50%; + background: linear-gradient(135deg, #fb923c, #ea580c); + display: grid; place-items: center; color: #fff; + font-size: 12px; font-weight: 700; +} + +/* KPIs */ +.ob-kpis { display: grid; grid-template-columns: repeat(4,1fr); gap: 10px; margin-bottom: 16px; } +.kpi { + background: var(--bg-2); border: 1px solid var(--line-2); + border-radius: 12px; padding: 12px 14px; + display: flex; align-items: center; gap: 12px; +} +.kpi-ic { + width: 36px; height: 36px; border-radius: 9px; + display: grid; place-items: center; flex: none; +} +.kpi-ic-orange { background: rgba(249,115,22,.12); color: var(--orange-2); } +.kpi-ic-cyan { background: rgba(56,189,248,.12); color: var(--cyan-2); } +.kpi-ic-mint { background: rgba(16,185,129,.12); color: var(--mint-2); } +.kpi-ic-purple { background: rgba(167,139,250,.12); color: var(--purple); } +.kpi-l { font-size: 11px; color: var(--muted); font-weight: 500; } +.kpi-v { font-size: 18px; font-weight: 800; color: #fff; letter-spacing: -.02em; margin-top: 1px; } +.kpi-s { font-size: 10.5px; font-weight: 600; color: var(--muted); } +.kpi-s.up { color: var(--mint-2); } + +/* Grid */ +.ob-grid { display: grid; grid-template-columns: 1.4fr 1fr; grid-template-rows: auto auto; gap: 12px; } +.ob-card { + background: var(--bg-2); border: 1px solid var(--line-2); + border-radius: 12px; padding: 14px 16px; +} +.ob-sched { grid-row: span 2; } +.ob-card-h { + display: flex; justify-content: space-between; align-items: center; + margin-bottom: 12px; + font-size: 13px; font-weight: 700; color: #fff; letter-spacing: -.01em; +} +.ob-card-h-r { font-size: 11px; color: var(--muted); display: flex; align-items: center; gap: 6px; } +.ob-card-h-r .tab { + padding: 3px 8px; border-radius: 5px; cursor: pointer; font-weight: 500; + font-size: 10.5px; +} +.ob-card-h-r .tab.on { background: rgba(56,189,248,.12); color: var(--cyan-2); font-weight: 600; } +.ob-card-h-r .link { color: var(--cyan-2); font-weight: 600; cursor: pointer; } + +/* Schedule */ +.sched-list { display: flex; flex-direction: column; gap: 8px; } +.sched-row { display: grid; grid-template-columns: 44px 1fr; gap: 12px; align-items: center; } +.sched-row .time { font-family: 'JetBrains Mono'; font-size: 11px; color: var(--muted); font-weight: 600; } +.sched-card { + padding: 8px 12px; border-radius: 8px; border-left: 3px solid; + background: rgba(56,189,248,.06); +} +.sched-card .t { font-size: 12.5px; font-weight: 700; color: #fff; } +.sched-card .s { font-size: 11px; color: var(--ink-soft); margin-top: 2px; } +.sched-orange { background: rgba(249,115,22,.10); border-left-color: var(--orange-2); } +.sched-orange .t { color: var(--orange-2); } +.sched-cyan { background: rgba(56,189,248,.10); border-left-color: var(--cyan-2); } +.sched-cyan .t { color: var(--cyan-2); } +.sched-mint { background: rgba(16,185,129,.10); border-left-color: var(--mint-2); } +.sched-mint .t { color: var(--mint-2); } +.sched-purple { background: rgba(167,139,250,.10); border-left-color: var(--purple); } +.sched-purple .t { color: var(--purple); } + +/* Donut */ +.donut-wrap { display: flex; align-items: center; gap: 18px; } +.donut-legend { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; font-size: 11.5px; color: var(--ink-soft); } +.donut-legend .sw { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 8px; vertical-align: middle; } + +/* Activity */ +.act-list { display: flex; flex-direction: column; gap: 9px; } +.act { display: grid; grid-template-columns: 24px 1fr; gap: 10px; align-items: flex-start; font-size: 11.5px; color: var(--ink-soft); } +.act b { color: #fff; font-weight: 700; } +.act .d { color: var(--muted); font-size: 10px; } +.act .ic { width: 22px; height: 22px; border-radius: 6px; display: grid; place-items: center; } +.act .ic.cyan { background: rgba(56,189,248,.12); color: var(--cyan-2); } +.act .ic.mint { background: rgba(16,185,129,.12); color: var(--mint-2); } +.act .ic.purple { background: rgba(167,139,250,.12); color: var(--purple); } +.act .ic.orange { background: rgba(249,115,22,.12); color: var(--orange-2); } + +/* Mini map */ +.ob-map .map-stage { position: relative; border-radius: 8px; overflow: hidden; } +.mini-map { width: 100%; display: block; } +.map-stat { + position: absolute; bottom: 8px; left: 10px; right: 10px; + background: rgba(5,15,36,.85); border: 1px solid var(--line); + padding: 6px 10px; border-radius: 6px; + font-size: 11px; color: var(--ink-soft); +} +.map-stat b { color: var(--cyan-2); } + +/* Mobile companion */ +.mobile-companion { + margin-top: 90px; + display: grid; grid-template-columns: 1fr 280px 1fr; + gap: 60px; + align-items: center; + background: linear-gradient(180deg, rgba(10,23,46,.5) 0%, rgba(5,15,36,.6) 100%); + border: 1px solid var(--line); + border-radius: 24px; + padding: 56px 56px; + position: relative; + overflow: hidden; +} +.mc-img-wrap { + position: relative; + border-radius: 18px; + overflow: hidden; + border: 1px solid var(--line-3); + aspect-ratio: 4/5; + box-shadow: 0 30px 60px -20px rgba(0,0,0,.5); +} +.mc-img-wrap img { + width: 100%; height: 100%; object-fit: cover; display: block; +} +.mc-img-wrap::after { + content:""; position: absolute; inset: 0; + background: + linear-gradient(180deg, transparent 50%, rgba(2,8,23,.75) 100%), + linear-gradient(45deg, rgba(2,132,199,.15), transparent 60%); + pointer-events: none; +} +/* Variant: when the wrap shows a CRM screenshot (landscape) instead of a portrait photo. + Aspect ratio matches the actual screenshot so the whole image fits without cropping. */ +.mc-img-wrap.mc-img-shot { + aspect-ratio: 1693 / 929; + background: + radial-gradient(ellipse 380px 200px at 50% 0%, rgba(56,189,248,.10), transparent 70%), + rgba(2,8,23,.85); + border-color: rgba(56,189,248,.22); + box-shadow: + 0 30px 60px -20px rgba(0,0,0,.55), + 0 0 80px -30px rgba(56,189,248,.25); +} +.mc-img-wrap.mc-img-shot img { + width: 100%; height: 100%; + max-width: 100%; max-height: 100%; + object-fit: contain; + object-position: center; +} +.mc-img-wrap.mc-img-shot::after { + background: + linear-gradient(180deg, transparent 70%, rgba(2,8,23,.55) 100%), + linear-gradient(45deg, rgba(56,189,248,.08), transparent 60%); +} +.mc-img-tag { + position: absolute; bottom: 16px; left: 16px; right: 16px; + display: flex; align-items: center; gap: 10px; + background: rgba(2,8,23,.75); backdrop-filter: blur(12px); + border: 1px solid var(--line-3); + padding: 8px 12px; border-radius: 10px; + font-size: 11px; color: var(--ink-soft); z-index: 2; +} +.mc-img-tag .dot { + width: 7px; height: 7px; border-radius: 50%; background: var(--cyan); + box-shadow: 0 0 8px var(--cyan); animation: pulse 1.8s infinite; flex: none; +} +.mc-img-tag b { color: var(--cyan-2); font-weight: 700; } +.mobile-companion::before { + content:""; position: absolute; right: -100px; top: -120px; + width: 400px; height: 400px; border-radius: 50%; + background: radial-gradient(circle, rgba(56,189,248,.15), transparent 70%); +} +.mc-l h3 { font-size: 28px; line-height: 1.15; letter-spacing: -.025em; font-weight: 700; color: #fff; margin: 14px 0 10px; } +.mc-l p { font-size: 14.5px; color: var(--body); margin: 0 0 22px; line-height: 1.6; max-width: 500px; } +.mc-feats { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; } +.mc-feats li { display: flex; align-items: center; gap: 10px; font-size: 14.5px; color: var(--ink-soft); } +.mc-feats li svg { color: var(--mint-2); flex: none; } + +/* Phone */ +.phone-shell { + position: relative; + width: 260px; aspect-ratio: 9/19.5; + background: #0f172a; + border-radius: 38px; + padding: 6px; + box-shadow: 0 40px 80px -20px rgba(0,0,0,.6), 0 0 0 1px rgba(56,189,248,.2), inset 0 0 0 1px rgba(255,255,255,.04); + border: 1px solid #1e293b; +} +.phone-notch { + position: absolute; top: 14px; left: 50%; transform: translateX(-50%); + width: 80px; height: 22px; background: #000; border-radius: 999px; z-index: 2; +} +.phone-screen { + width: 100%; height: 100%; border-radius: 32px; overflow: hidden; + background: #050f24; position: relative; + display: flex; flex-direction: column; + padding: 8px 10px 12px; + color: var(--ink); +} +.phone-screen-img { padding: 0; } +.phone-img { width: 100%; height: 100%; display: block; object-fit: cover; } +.ph-status { + display: flex; justify-content: space-between; align-items: center; + font-size: 10px; font-weight: 700; color: #fff; + padding: 6px 14px 12px; +} +.ph-status .ph-r { display: flex; align-items: center; gap: 4px; color: #fff; font-size: 9px; } +.ph-back { + display: flex; align-items: center; gap: 8px; + font-size: 12px; font-weight: 600; color: #fff; + padding: 0 4px 8px; +} +.ph-back svg { color: var(--cyan-2); } +.ph-addr { font-size: 9.5px; color: var(--muted); padding: 0 4px 8px; } +.ph-tabs { + display: flex; gap: 14px; padding: 4px 4px 10px; + border-bottom: 1px solid var(--line-2); +} +.ph-tabs span { + font-size: 10px; color: var(--muted); font-weight: 600; + padding-bottom: 4px; +} +.ph-tabs .on { color: #fff; border-bottom: 2px solid var(--cyan-2); } +.ph-roof { padding: 12px 4px 8px; } +.ph-roof-svg { width: 100%; height: auto; display: block; } +.ph-stat { padding: 12px 4px 10px; border-bottom: 1px solid var(--line-2); } +.ph-stat .l { font-size: 9.5px; color: var(--muted); font-weight: 500; } +.ph-stat .v { font-size: 16px; font-weight: 800; color: var(--cyan-2); letter-spacing: -.02em; margin-top: 2px; } +.ph-stat .v small { font-size: 9px; color: var(--muted); font-weight: 500; } +.ph-cta { + margin: 14px 4px 0; + padding: 10px; border-radius: 10px; border: 0; + background: linear-gradient(180deg, #38bdf8, #0284c7); + color: #fff; font-weight: 700; font-size: 12px; cursor: pointer; + font-family: inherit; + box-shadow: 0 6px 16px -6px rgba(2,132,199,.5); +} + +/* ============== 6 CORE SYSTEMS ============== */ +.sec-systems { padding: 100px 0; } +.sys-grid { + display: grid; grid-template-columns: repeat(3, 1fr); + gap: 16px; +} +.sys-card { + position: relative; + background: rgba(10,23,46,.6); + border: 1px solid var(--line-2); + border-radius: 20px; + padding: 30px 28px 28px; + backdrop-filter: blur(10px); + transition: transform .2s ease, border-color .2s, box-shadow .2s; + overflow: hidden; +} +.sys-card::before { + content:""; position: absolute; inset: 0; border-radius: inherit; + background: linear-gradient(140deg, rgba(56,189,248,.08), transparent 50%); + opacity: .7; + pointer-events: none; +} +.sys-card:hover { + transform: translateY(-4px); + border-color: rgba(56,189,248,.4); + box-shadow: 0 30px 60px -30px rgba(2,132,199,.4); +} +.sys-num { + position: absolute; top: 26px; right: 28px; + font-family: 'JetBrains Mono'; font-size: 12px; color: var(--muted-2); + font-weight: 600; +} +.sys-ic { + width: 56px; height: 56px; border-radius: 14px; + display: grid; place-items: center; + border: 1px solid; + margin-bottom: 24px; +} +.sys-cyan .sys-ic { background: rgba(56,189,248,.10); border-color: rgba(56,189,248,.3); color: var(--cyan-2); box-shadow: 0 0 24px -6px rgba(56,189,248,.4); } +.sys-orange .sys-ic { background: rgba(249,115,22,.10); border-color: rgba(249,115,22,.3); color: var(--orange-2); box-shadow: 0 0 24px -6px rgba(249,115,22,.4); } +.sys-mint .sys-ic { background: rgba(16,185,129,.10); border-color: rgba(16,185,129,.3); color: var(--mint-2); box-shadow: 0 0 24px -6px rgba(16,185,129,.4); } +.sys-purple .sys-ic { background: rgba(167,139,250,.10); border-color: rgba(167,139,250,.3); color: var(--purple); box-shadow: 0 0 24px -6px rgba(167,139,250,.4); } + +.sys-card h3 { + font-size: 19px; font-weight: 700; letter-spacing: -.02em; + color: #fff; margin: 0 0 8px; +} +.sys-card p { + font-size: 13.5px; line-height: 1.55; color: var(--body); + margin: 0 0 16px; +} +.sys-tag { + display: inline-flex; align-items: center; + font-size: 11.5px; font-weight: 600; + padding: 5px 11px; border-radius: 999px; + background: rgba(56,189,248,.10); color: var(--cyan-2); + border: 1px solid rgba(56,189,248,.2); +} +.sys-orange .sys-tag { background: rgba(249,115,22,.10); color: var(--orange-2); border-color: rgba(249,115,22,.25); } +.sys-mint .sys-tag { background: rgba(16,185,129,.10); color: var(--mint-2); border-color: rgba(16,185,129,.25); } +.sys-purple .sys-tag { background: rgba(167,139,250,.10); color: var(--purple); border-color: rgba(167,139,250,.25); } + +/* ============== CALENDAR ============== */ +.sec-calendar { padding: 100px 0; } +.cal-row { + display: grid; grid-template-columns: 0.85fr 1.15fr; + gap: 60px; align-items: center; +} +.cal-points { display: flex; flex-direction: column; gap: 24px; margin-top: 32px; } +.cal-pt { display: flex; gap: 16px; align-items: flex-start; } +.cal-pt-ic { + width: 42px; height: 42px; border-radius: 11px; flex: none; + display: grid; place-items: center; + background: rgba(56,189,248,.10); color: var(--cyan-2); + border: 1px solid rgba(56,189,248,.25); +} +.cal-pt-ic.cyan { background: rgba(56,189,248,.10); color: var(--cyan); border-color: rgba(34,211,238,.3); box-shadow: 0 0 20px -6px rgba(34,211,238,.5); } +.cal-pt-ic.mint { background: rgba(16,185,129,.10); color: var(--mint-2); border-color: rgba(16,185,129,.3); } +.cal-pt h4 { font-size: 15px; font-weight: 700; color: #fff; margin: 0 0 3px; letter-spacing: -.01em; } +.cal-pt p { font-size: 13px; color: var(--body); margin: 0; line-height: 1.55; } + +/* Calendar window */ +.cal-stage { position: relative; } +.cal-window { + background: var(--bg-1); + border: 1px solid var(--line); + border-radius: 20px; + overflow: hidden; + box-shadow: 0 40px 80px -30px rgba(0,0,0,.6), 0 0 0 1px rgba(56,189,248,.1) inset; + position: relative; +} +.cal-w-head { + display: grid; grid-template-columns: 100px 1fr 110px; + padding: 14px 16px; border-bottom: 1px solid var(--line-2); + background: rgba(10,23,46,.5); + align-items: center; gap: 12px; +} +.cal-w-l { + display: flex; align-items: center; gap: 8px; + font-size: 13px; font-weight: 700; color: #fff; +} +.cal-w-l svg { color: var(--cyan-2); } +.cal-w-c { + display: flex; align-items: center; gap: 10px; + justify-content: center; + font-size: 13px; color: var(--ink); font-weight: 600; +} +.cal-w-r { + display: flex; align-items: center; gap: 8px; justify-content: flex-end; +} +.cal-w-r .seg { + padding: 5px 11px; border-radius: 6px; + background: var(--bg-3); border: 1px solid var(--line); + font-size: 12px; color: var(--ink-soft); font-weight: 600; +} +.navb { + width: 26px; height: 26px; border-radius: 7px; + background: var(--bg-3); border: 1px solid var(--line); + color: var(--ink-soft); display: grid; place-items: center; cursor: pointer; +} +.cal-w-days { + display: grid; grid-template-columns: 60px repeat(7, 1fr); + border-bottom: 1px solid var(--line-2); + background: rgba(15,33,64,.4); +} +.cal-w-days > div { + padding: 10px 8px; text-align: center; + font-size: 10.5px; color: var(--muted); font-weight: 600; letter-spacing: .08em; + border-left: 1px solid var(--line-2); +} +.cal-w-days > div:first-child { border-left: 0; } +.cal-w-days > div b { display: block; color: #fff; font-size: 16px; margin-top: 4px; font-weight: 700; letter-spacing: -.01em; } +.cal-w-days .tod { color: var(--cyan-2); } +.cal-w-days .tod b { color: var(--cyan-2); } + +.cal-w-body { + position: relative; + display: grid; grid-template-columns: 60px repeat(7, 1fr); + height: 360px; + background: + linear-gradient(var(--line-2) 1px, transparent 1px) 0 0/100% 51.4px; +} +.cal-w-time { + display: flex; flex-direction: column; +} +.cal-w-time span { + flex: 1; padding: 4px 8px 0 0; text-align: right; + font-size: 10px; color: var(--muted); font-family: 'JetBrains Mono'; +} +.cal-w-col { border-left: 1px solid var(--line-2); position: relative; } +.cal-e { + position: absolute; left: 4px; right: 4px; + border-radius: 7px; padding: 6px 8px; + background: rgba(56,189,248,.10); + border-left: 3px solid var(--cyan-2); + font-size: 10px; +} +.cal-e .t { font-weight: 700; font-size: 10.5px; color: var(--cyan-2); } +.cal-e .s { font-size: 9.5px; color: var(--ink-soft); margin-top: 1px; line-height: 1.3; } +.cal-e.cyan .t { color: var(--cyan-2); } +.cal-e.orange { background: rgba(249,115,22,.12); border-left-color: var(--orange-2); } +.cal-e.orange .t { color: var(--orange-2); } +.cal-e.mint { background: rgba(16,185,129,.12); border-left-color: var(--mint-2); } +.cal-e.mint .t { color: var(--mint-2); } + +/* AI popover */ +.ai-pop { + position: absolute; + top: 152px; left: 38%; + width: 320px; + background: rgba(5,15,36,.92); + border: 1px solid rgba(56,189,248,.35); + border-radius: 14px; + padding: 16px; + box-shadow: 0 20px 60px -10px rgba(0,0,0,.7), 0 0 30px -10px rgba(56,189,248,.4); + z-index: 4; + backdrop-filter: blur(16px); +} +.ai-pop::before { + content:""; position: absolute; left: -7px; top: 30px; + width: 12px; height: 12px; + background: inherit; + border-left: 1px solid rgba(56,189,248,.35); + border-bottom: 1px solid rgba(56,189,248,.35); + transform: rotate(45deg); +} +.ai-pop-h { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; } +.ai-ic { + width: 32px; height: 32px; border-radius: 10px; + background: linear-gradient(135deg, #38bdf8, #a78bfa); + display: grid; place-items: center; + color: #fff; + box-shadow: 0 4px 14px -4px rgba(56,189,248,.5); +} +.ai-pop-h .t { font-size: 14px; font-weight: 700; color: var(--cyan-2); } +.ai-pop-h .s { font-size: 11px; color: var(--muted); margin-top: 1px; } +.ai-pop p { + font-size: 13px; color: var(--ink-soft); line-height: 1.5; + margin: 0 0 14px; +} +.ai-pop p b { color: #fff; } +.ai-pop p .hl { + background: rgba(249,115,22,.18); color: var(--orange-2); + padding: 1px 6px; border-radius: 4px; font-weight: 700; +} +.ai-act { display: flex; gap: 8px; } +.ai-btn { + flex: 1; padding: 8px 10px; border-radius: 8px; + background: var(--bg-3); color: var(--ink-soft); + border: 1px solid var(--line); font-family: inherit; + font-size: 12px; font-weight: 600; cursor: pointer; + display: inline-flex; align-items: center; justify-content: center; gap: 6px; +} +.ai-btn.pri { + background: linear-gradient(180deg, #38bdf8, #0284c7); + color: #fff; border-color: transparent; + box-shadow: 0 4px 12px -4px rgba(2,132,199,.5); +} + +/* Integration chips */ +.cal-int { + margin-top: 22px; + display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; +} +.cal-int .int { + display: inline-flex; align-items: center; gap: 8px; + padding: 8px 14px; border-radius: 999px; + background: rgba(10,23,46,.7); border: 1px solid var(--line); + font-size: 12.5px; font-weight: 600; color: var(--ink-soft); +} +.cal-int .int svg { color: var(--cyan-2); } + +/* ============== MEASUREMENTS ============== */ +.sec-measure { padding: 100px 0; } +.meas-stage { + position: relative; + display: grid; grid-template-columns: 1.4fr 280px; + gap: 60px; align-items: center; + background: + radial-gradient(ellipse 600px 400px at 30% 50%, rgba(56,189,248,.10), transparent 70%); + padding: 40px 20px; +} +.meas-art { + position: relative; + background: var(--bg-1); + border: 1px solid var(--line); + border-radius: 20px; + padding: 0; + overflow: hidden; +} +.meas-svg { width: 100%; height: auto; display: block; max-width: 100%; object-fit: cover; border-radius: 0; } +/* img.meas-svg { aspect-ratio: 3 / 2; } */ +.meas-pill { + position: absolute; + background: rgba(5,15,36,.92); + border: 1px solid var(--line-3); + border-radius: 12px; + padding: 12px 14px; + display: flex; align-items: center; gap: 12px; + backdrop-filter: blur(12px); + box-shadow: 0 10px 30px -10px rgba(0,0,0,.5); + max-width: 240px; +} +.meas-pill .ic { + width: 32px; height: 32px; border-radius: 9px; flex: none; + background: rgba(56,189,248,.12); color: var(--cyan-2); + display: grid; place-items: center; +} +.meas-pill b { display: block; font-size: 13px; color: #fff; font-weight: 700; letter-spacing: -.01em; } +.meas-pill span { font-size: 11.5px; color: var(--muted); display: block; margin-top: 2px; line-height: 1.4; } +.meas-pill-tl { top: 36px; left: 36px; } +.meas-pill-bl { bottom: 36px; left: 36px; } + +/* Performance row */ +.perf-row { + margin-top: 60px; + display: grid; grid-template-columns: repeat(5, 1fr); + background: rgba(10,23,46,.6); + border: 1px solid var(--line); + border-radius: 20px; + padding: 8px; +} +.perf-it { + padding: 22px 18px; text-align: center; + border-right: 1px solid var(--line-2); +} +.perf-it:last-child { border-right: 0; } +.perf-ic { + width: 48px; height: 48px; margin: 0 auto 14px; + border-radius: 12px; + background: rgba(56,189,248,.10); + color: var(--cyan-2); + display: grid; place-items: center; + border: 1px solid rgba(56,189,248,.25); +} +.perf-v { font-size: 16px; font-weight: 700; color: #fff; letter-spacing: -.02em; margin-bottom: 4px; } +.perf-l { font-size: 11.5px; color: var(--body); line-height: 1.45; } + +/* Measurement Summary on phone */ +.ms-block { padding: 8px 4px 4px; } +.ms-block .l { font-size: 9.5px; color: var(--muted); font-weight: 500; } +.ms-block .v { font-size: 18px; font-weight: 800; color: var(--cyan-2); letter-spacing: -.02em; margin-top: 1px; } +.ms-block .v small { font-size: 9px; color: var(--muted); font-weight: 500; } +.ms-tabs { + display: flex; gap: 4px; padding: 8px 4px; + border-bottom: 1px solid var(--line-2); + margin-top: 4px; +} +.ms-tabs span { + flex: 1; text-align: center; padding: 5px 0; border-radius: 6px; + font-size: 9.5px; color: var(--muted); font-weight: 600; +} +.ms-tabs .on { background: rgba(56,189,248,.15); color: var(--cyan-2); } +.ms-planes { padding: 8px 4px; flex: 1; overflow: hidden; } +.ms-pl { + display: flex; justify-content: space-between; align-items: center; + padding: 6px 0; border-bottom: 1px solid var(--line-2); + font-size: 10px; color: var(--ink-soft); +} +.ms-pl b { color: #fff; font-weight: 600; } +.ms-cta { + margin: 8px 4px 4px; + padding: 10px; border-radius: 10px; border: 0; + background: linear-gradient(180deg, #38bdf8, #0284c7); + color: #fff; font-weight: 700; font-size: 11px; cursor: pointer; + font-family: inherit; + box-shadow: 0 6px 16px -6px rgba(2,132,199,.5); +} + +/* ============== CONNECTED ============== */ +.sec-connected { padding: 100px 0; } +.connected-stage { + position: relative; + display: grid; grid-template-columns: 1fr 460px 1fr; + align-items: center; gap: 40px; +} +.conn-side { display: flex; flex-direction: column; gap: 22px; } +.conn-side.right { padding-left: 20px; } +.conn-feat { + display: flex; gap: 14px; align-items: flex-start; + padding: 16px 18px; + background: rgba(10,23,46,.6); + border: 1px solid var(--line-2); + border-radius: 14px; + transition: border-color .2s, transform .2s; +} +.conn-feat:hover { border-color: rgba(56,189,248,.4); transform: translateX(4px); } +.conn-side.right .conn-feat:hover { transform: translateX(-4px); } +.conn-ic { + width: 40px; height: 40px; border-radius: 10px; flex: none; + background: rgba(56,189,248,.10); color: var(--cyan-2); + border: 1px solid rgba(56,189,248,.25); + display: grid; place-items: center; +} +.conn-feat h4 { font-size: 14px; font-weight: 700; color: #fff; margin: 0 0 3px; letter-spacing: -.01em; } +.conn-feat p { font-size: 12px; color: var(--body); margin: 0; line-height: 1.45; } +.conn-center { position: relative; } +.conn-svg { width: 100%; height: auto; display: block; } + +/* Benefit row */ +.benefit-row { + margin-top: 60px; + display: grid; grid-template-columns: repeat(3, 1fr); + gap: 14px; +} +.ben-it { + display: flex; gap: 16px; align-items: center; + padding: 22px 24px; + background: rgba(10,23,46,.6); + border: 1px solid var(--line-2); + border-radius: 16px; +} +.ben-ic { + width: 44px; height: 44px; border-radius: 11px; + background: rgba(56,189,248,.10); color: var(--cyan-2); + border: 1px solid rgba(56,189,248,.25); + display: grid; place-items: center; flex: none; +} +.ben-it h4 { font-size: 14.5px; font-weight: 700; color: #fff; margin: 0 0 3px; letter-spacing: -.01em; } +.ben-it p { font-size: 12.5px; color: var(--body); margin: 0; line-height: 1.45; } + +/* ============== PRICING ============== */ +.sec-pricing { padding: 100px 0; } +.pricing-grid { + display: grid; grid-template-columns: 1fr 1fr 1.15fr; + gap: 16px; + align-items: stretch; + max-width: 1180px; margin: 0 auto; +} +.p-card { + background: rgba(10,23,46,.6); + border: 1px solid var(--line); + border-radius: 22px; + padding: 32px 30px; + display: flex; flex-direction: column; + position: relative; + backdrop-filter: blur(10px); +} +.p-muted { + background: rgba(5,15,36,.5); +} +.p-card h4 { + font-size: 12.5px; font-weight: 700; + color: var(--muted); letter-spacing: .08em; text-transform: uppercase; + margin: 0 0 8px; +} +.p-name { + font-size: 18px; font-weight: 700; letter-spacing: -.02em; color: #fff; + margin: 0 0 10px; +} +.p-muted .p-name { + color: var(--muted-2); text-decoration: line-through; + text-decoration-color: rgba(239,68,68,.65); text-decoration-thickness: 2px; +} +.p-desc { + font-size: 13.5px; color: var(--body); line-height: 1.5; + margin: 0 0 22px; min-height: 56px; +} +.p-price { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; } +.p-price .amt { font-size: 40px; font-weight: 800; letter-spacing: -.03em; color: #fff; } +.p-price .per { font-size: 13.5px; color: var(--muted); } +.p-price.cross .amt { + color: var(--muted-2); + text-decoration: line-through; + text-decoration-color: rgba(239,68,68,.7); + text-decoration-thickness: 2px; +} +.p-note { + font-size: 12.5px; color: var(--muted); margin-bottom: 22px; +} +.p-btn { width: 100%; } +.p-feats { + list-style: none; padding: 22px 0 0; margin: 22px 0 0; + border-top: 1px solid var(--line-2); + display: flex; flex-direction: column; gap: 10px; +} +.p-feats li { + font-size: 13.5px; color: var(--ink-soft); display: flex; gap: 10px; align-items: flex-start; + line-height: 1.4; +} +.p-feats li b { color: #fff; font-weight: 700; } +.p-feats li.x { color: var(--muted); } +.p-feats li .ck { flex: none; margin-top: 2px; color: var(--mint-2); } +.p-feats li .ck.mu { color: var(--muted-2); } +.p-feats li .ck.o { color: var(--orange-2); } + +/* LTD */ +.p-ltd { + background: + radial-gradient(ellipse 360px 200px at 50% 0%, rgba(249,115,22,.15), transparent 70%), + linear-gradient(180deg, rgba(45,22,5,.6) 0%, rgba(10,23,46,.7) 60%); + border: 2px solid var(--orange); + box-shadow: + 0 0 0 1px rgba(249,115,22,.2) inset, + 0 40px 80px -30px rgba(249,115,22,.45), + 0 20px 40px -20px rgba(0,0,0,.5); + padding: 36px 32px; + margin: -12px 0; +} +.p-ribbon { + position: absolute; top: -15px; left: 50%; transform: translateX(-50%); + background: linear-gradient(180deg, #fb923c 0%, #f97316 60%, #ea580c 100%); + color: #fff; font-weight: 700; font-size: 12px; + padding: 8px 16px; border-radius: 999px; + display: inline-flex; align-items: center; gap: 8px; + box-shadow: 0 10px 20px -6px rgba(249,115,22,.6); + white-space: nowrap; +} +.p-ltd h4 { color: var(--orange-2); } +.p-ltd .p-price .amt { + background: linear-gradient(180deg, #fbbf24, #f97316); + -webkit-background-clip: text; background-clip: text; color: transparent; +} +.p-save { + display: inline-flex; align-items: center; gap: 6px; + background: rgba(249,115,22,.15); color: var(--orange-2); + border: 1px solid rgba(249,115,22,.35); + padding: 4px 10px; border-radius: 999px; + font-size: 11.5px; font-weight: 700; align-self: flex-start; + margin-bottom: 14px; +} + +/* Pricing trust */ +.p-trust { + margin-top: 40px; + display: flex; align-items: center; justify-content: center; + gap: 30px; flex-wrap: wrap; + color: var(--body); font-size: 13px; +} +.p-trust .t-it { display: inline-flex; align-items: center; gap: 8px; color: var(--ink-soft); } +.p-trust .t-it svg { color: var(--mint-2); } + +/* ============== REVIEWS ============== */ +.sec-reviews { padding: 100px 0 80px; } +.reviews-grid { + columns: 3; column-gap: 18px; +} +.rev { + break-inside: avoid; + background: rgba(10,23,46,.6); + border: 1px solid var(--line-2); + border-radius: 16px; + padding: 22px; + margin-bottom: 18px; + backdrop-filter: blur(8px); +} +.rev .stars { color: var(--amber); letter-spacing: 1px; font-size: 13px; margin-bottom: 12px; } +.rev p { font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); margin: 0 0 16px; } +.rev-m { display: flex; align-items: center; gap: 10px; } +.rev .av { + width: 36px; height: 36px; border-radius: 50%; flex: none; +} +.av-1 { background: linear-gradient(135deg, #fcd34d, #f59e0b); } +.av-2 { background: linear-gradient(135deg, #7dd3fc, #0284c7); } +.av-3 { background: linear-gradient(135deg, #6ee7b7, #10b981); } +.av-4 { background: linear-gradient(135deg, #fbcfe8, #ec4899); } +.av-5 { background: linear-gradient(135deg, #ddd6fe, #7c3aed); } +.av-6 { background: linear-gradient(135deg, #fed7aa, #ea580c); } +.av-7 { background: linear-gradient(135deg, #a5f3fc, #0891b2); } +.av-8 { background: linear-gradient(135deg, #fecaca, #dc2626); } +.av-9 { background: linear-gradient(135deg, #e9d5ff, #9333ea); } +.rev .who { font-size: 13px; font-weight: 700; color: #fff; letter-spacing: -.01em; } +.rev .role { font-size: 11.5px; color: var(--muted); margin-top: 1px; } +.rev .badge { + display: inline-flex; align-items: center; gap: 4px; + background: rgba(16,185,129,.15); color: var(--mint-2); + font-size: 10px; font-weight: 700; padding: 3px 7px; border-radius: 4px; + margin-left: auto; +} +.rev-feat { + background: linear-gradient(180deg, rgba(2,132,199,.25), rgba(10,23,46,.7)); + border-color: rgba(56,189,248,.4); + box-shadow: 0 20px 60px -20px rgba(2,132,199,.4); +} +.rev-feat p { font-size: 15px; color: #e0f2fe; font-weight: 500; line-height: 1.55; } + +/* ============== FINAL CTA ============== */ +.sec-final { padding: 80px 0 60px; } +.final-card { + position: relative; + background: + radial-gradient(ellipse 600px 360px at 90% 90%, rgba(249,115,22,.20), transparent 60%), + radial-gradient(ellipse 800px 460px at 0% 0%, rgba(56,189,248,.18), transparent 60%), + linear-gradient(180deg, rgba(10,23,46,.85) 0%, rgba(5,15,36,.95) 100%); + border: 1px solid var(--line-3); + border-radius: 28px; + padding: 70px 64px; + display: grid; grid-template-columns: 1.4fr 1fr; + align-items: center; gap: 50px; + overflow: hidden; + box-shadow: 0 40px 80px -30px rgba(0,0,0,.6); +} +.countdown { + background: rgba(5,15,36,.7); + border: 1px solid rgba(249,115,22,.3); + border-radius: 18px; + padding: 22px; + backdrop-filter: blur(14px); +} +.cd-h { + font-size: 12px; font-weight: 700; color: var(--orange-2); + letter-spacing: .08em; text-transform: uppercase; + display: flex; align-items: center; gap: 8px; margin-bottom: 16px; +} +.cd-h .d { width: 8px; height: 8px; border-radius: 50%; background: var(--orange); + box-shadow: 0 0 0 4px rgba(249,115,22,.2); } +.cd-grid { + display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; + margin-bottom: 14px; +} +.cd-cell { + background: rgba(255,255,255,.04); + border: 1px solid rgba(249,115,22,.18); + border-radius: 12px; + padding: 14px 6px; text-align: center; +} +.cd-cell .n { + font-family: 'JetBrains Mono'; font-size: 24px; font-weight: 700; + color: #fff; letter-spacing: -.02em; +} +.cd-cell .l { + font-size: 9.5px; color: var(--muted); margin-top: 4px; + letter-spacing: .08em; text-transform: uppercase; font-weight: 600; +} +.cd-foot { font-size: 11.5px; color: var(--ink-soft); } +.cd-foot .left { display: block; margin-bottom: 6px; } +.cd-bar { + height: 6px; background: rgba(255,255,255,.05); + border-radius: 999px; overflow: hidden; + border: 1px solid var(--line-2); +} +.cd-bar i { + display: block; height: 100%; + background: linear-gradient(90deg, #fbbf24, #f97316); + border-radius: 999px; +} + +/* ============== FOOTER ============== */ +.footer { + border-top: 1px solid var(--line); + padding: 70px 0 30px; + background: rgba(2,8,23,.7); +} +.foot-top { + display: grid; grid-template-columns: 1.2fr 3fr; + gap: 60px; padding-bottom: 50px; + border-bottom: 1px solid var(--line-2); +} +.foot-brand p { + font-size: 13.5px; color: var(--body); line-height: 1.55; + margin: 16px 0 18px; max-width: 320px; +} +.foot-cert { + display: flex; gap: 14px; flex-wrap: wrap; +} +.foot-cert span { + display: inline-flex; align-items: center; gap: 6px; + padding: 5px 10px; border-radius: 999px; + background: rgba(56,189,248,.06); + border: 1px solid var(--line); + font-size: 11.5px; font-weight: 600; color: var(--ink-soft); +} +.foot-cert svg { color: var(--mint-2); } +.foot-cols { + display: grid; grid-template-columns: repeat(4, 1fr); gap: 32px; +} +.foot-cols h5 { + font-size: 12px; font-weight: 700; color: #fff; + letter-spacing: .08em; text-transform: uppercase; + margin: 0 0 16px; +} +.foot-cols a { + display: block; color: var(--body); text-decoration: none; + font-size: 13.5px; padding: 5px 0; + transition: color .2s; +} +.foot-cols a:hover { color: var(--cyan-2); } +.foot-bot { + padding-top: 26px; + display: flex; justify-content: space-between; align-items: center; + color: var(--muted); font-size: 12.5px; +} +.foot-bot .tagline { + font-weight: 700; font-size: 13px; color: #fff; letter-spacing: .02em; +} + +/* ============== STICKY CTA ============== */ +.sticky-cta { + position: fixed; bottom: 0; left: 0; right: 0; z-index: 60; + background: rgba(2,8,23,.92); + backdrop-filter: blur(18px) saturate(160%); + -webkit-backdrop-filter: blur(18px) saturate(160%); + border-top: 1px solid rgba(249,115,22,.3); + box-shadow: 0 -10px 30px -10px rgba(0,0,0,.5); + transform: translateY(110%); + transition: transform .35s cubic-bezier(.2,.7,.2,1); +} +.sticky-cta.show { transform: translateY(0); } +.sticky-inner { + display: flex; align-items: center; gap: 28px; + padding: 14px 32px; + max-width: 1400px; margin: 0 auto; +} +.sticky-l { display: flex; align-items: center; gap: 14px; flex: 1; } +.s-pulse { + width: 10px; height: 10px; border-radius: 50%; background: var(--orange); + box-shadow: 0 0 0 5px rgba(249,115,22,.18), 0 0 12px var(--orange); + animation: pulse 2.2s infinite; flex: none; +} +.s-t { font-size: 14px; font-weight: 700; color: #fff; } +.s-t b { color: var(--orange-2); } +.s-s { font-size: 12px; color: var(--muted); margin-top: 2px; } +.sticky-cd { display: flex; gap: 6px; } +.sticky-cd .c { + background: rgba(249,115,22,.08); + border: 1px solid rgba(249,115,22,.25); + padding: 6px 10px; border-radius: 8px; + font-family: 'JetBrains Mono'; + display: flex; flex-direction: column; align-items: center; + min-width: 38px; +} +.sticky-cd .c b { font-size: 13px; font-weight: 700; color: #fff; } +.sticky-cd .c span { font-size: 8.5px; color: var(--orange-2); text-transform: uppercase; } +.sticky-r { display: flex; align-items: center; gap: 8px; } +.sticky-close { + background: transparent; border: 0; cursor: pointer; + color: var(--muted); padding: 6px; +} +.sticky-close:hover { color: #fff; } + +/* ============== VIDEO / DEMO SECTION ============== */ +.sec-video { padding: 100px 0; } +.video-stage { + position: relative; + max-width: 1100px; margin: 0 auto; +} +.video-frame { + position: relative; + border-radius: 24px; + overflow: hidden; + border: 1px solid var(--line-3); + background: var(--bg-2); + box-shadow: + 0 60px 120px -40px rgba(0,0,0,.6), + 0 0 0 1px rgba(56,189,248,.15) inset, + 0 30px 60px -30px rgba(2,132,199,.4); + aspect-ratio: 16 / 9; +} +.video-poster, .video-el { + position: absolute; inset: 0; width: 100%; height: 100%; +} +.video-el { display: none; background: #000; } +.video-frame.playing .video-poster { display: none; } +.video-frame.playing .video-el { display: block; } + +.video-poster image-slot { + background: linear-gradient(135deg, #0c2e52 0%, #050f24 50%, #0a172e 100%) !important; + width: 100% !important; + height: 100% !important; + display: block !important; +} +.video-overlay { + position: absolute; inset: 0; + background: + radial-gradient(ellipse 60% 50% at 50% 50%, rgba(0,0,0,0) 30%, rgba(0,0,0,.45) 90%), + linear-gradient(180deg, rgba(2,8,23,.1) 0%, rgba(2,8,23,.55) 100%); + pointer-events: none; +} +/* decorative neon HUD chips on poster */ +.vh { + position: absolute; z-index: 2; + padding: 7px 12px; border-radius: 999px; + background: rgba(2,8,23,.75); + border: 1px solid rgba(56,189,248,.35); + backdrop-filter: blur(10px); + font-size: 11.5px; color: var(--ink-soft); font-weight: 500; + display: inline-flex; align-items: center; gap: 8px; + box-shadow: 0 8px 24px -8px rgba(0,0,0,.5); +} +.vh-d { + width: 7px; height: 7px; border-radius: 50%; + background: var(--cyan); box-shadow: 0 0 10px var(--cyan); + animation: pulse 1.8s infinite; +} +.vh-1 { top: 24px; left: 24px; color: var(--cyan-2); } +.vh-2 { top: 24px; right: 24px; color: var(--orange-2); border-color: rgba(249,115,22,.4); } +.vh-3 { bottom: 84px; right: 24px; } + +.video-play { + position: absolute; top: 50%; left: 50%; + transform: translate(-50%, -50%); + width: 96px; height: 96px; + background: transparent; border: 0; cursor: pointer; + display: grid; place-items: center; + z-index: 3; +} +.video-play .play-ring, +.video-play .play-ring.r2 { + position: absolute; inset: 0; border-radius: 50%; + background: rgba(249,115,22,.18); + animation: ringPulse 2.4s ease-out infinite; +} +.video-play .play-ring.r2 { animation-delay: 1.2s; } +.video-play .play-btn { + position: relative; z-index: 2; + width: 72px; height: 72px; border-radius: 50%; + background: linear-gradient(180deg, #fb923c 0%, #f97316 60%, #ea580c 100%); + display: grid; place-items: center; + box-shadow: 0 14px 36px -8px rgba(249,115,22,.7), inset 0 1px 0 rgba(255,255,255,.25); + padding-left: 5px; + transition: transform .2s ease, box-shadow .2s ease; +} +.video-play:hover .play-btn { + transform: scale(1.08); + box-shadow: 0 18px 48px -10px rgba(249,115,22,.85), inset 0 1px 0 rgba(255,255,255,.3); +} +@keyframes ringPulse { + 0% { opacity: 1; transform: scale(.8); } + 100% { opacity: 0; transform: scale(1.6); } +} +.video-meta { + position: absolute; bottom: 20px; left: 20px; + display: flex; align-items: center; gap: 10px; + z-index: 2; + padding: 8px 14px; border-radius: 999px; + background: rgba(2,8,23,.75); + border: 1px solid var(--line-3); + backdrop-filter: blur(12px); + font-size: 12px; color: var(--ink-soft); +} +.video-meta .v-dur { + font-family: 'JetBrains Mono'; + color: var(--orange-2); font-weight: 700; +} +.video-meta .v-label { color: #fff; font-weight: 500; } + +.video-chips { + margin-top: 20px; + display: grid; grid-template-columns: repeat(4, 1fr); + gap: 10px; +} +.vc { + background: rgba(10,23,46,.6); + border: 1px solid var(--line-2); + border-radius: 12px; + padding: 14px 16px; + cursor: pointer; transition: border-color .2s, transform .15s, background .2s; +} +.vc:hover { + border-color: rgba(249,115,22,.4); + background: rgba(249,115,22,.06); + transform: translateY(-2px); +} +.vc .n { + display: block; font-family: 'JetBrains Mono'; + font-size: 11px; font-weight: 700; color: var(--cyan-2); + margin-bottom: 4px; +} +.vc .t { + display: block; font-size: 13px; color: var(--ink-soft); font-weight: 500; + line-height: 1.4; +} + +/* Hero — add side photo behind blueprint */ +.hero-photo { + position: absolute; bottom: -20px; left: -10px; + width: 220px; aspect-ratio: 4/5; + border-radius: 16px; + overflow: hidden; + border: 1px solid var(--line-3); + box-shadow: 0 30px 60px -20px rgba(0,0,0,.6), 0 0 0 1px rgba(56,189,248,.15) inset; + z-index: 3; + transform: rotate(-3deg); +} +.hero-photo img { width: 100%; height: 100%; object-fit: cover; display: block; } +.hero-photo::after { + content:""; position: absolute; inset: 0; + background: linear-gradient(180deg, transparent 40%, rgba(2,8,23,.6) 100%); +} +.hero-photo .tag { + position: absolute; bottom: 12px; left: 12px; right: 12px; + font-size: 10.5px; color: #fff; + display: flex; align-items: center; gap: 6px; + z-index: 2; +} +.hero-photo .tag .d { + width: 6px; height: 6px; border-radius: 50%; background: var(--mint-2); + box-shadow: 0 0 6px var(--mint-2); +} + +/* Real review avatars (replaces gradient .av-N) */ +.rev-av { + width: 36px; height: 36px; border-radius: 50%; flex: none; + object-fit: cover; + border: 1px solid var(--line-3); +} + +/* Video poster image */ +.video-poster-img { + width: 100%; height: 100%; object-fit: cover; display: block; +} + +/* Connected section background photo */ +.sec-connected { position: relative; } +.connected-bg { + position: absolute; inset: 0; z-index: -1; overflow: hidden; + pointer-events: none; + opacity: .25; + mask-image: radial-gradient(ellipse 800px 400px at 50% 50%, black 30%, transparent 75%); + -webkit-mask-image: radial-gradient(ellipse 800px 400px at 50% 50%, black 30%, transparent 75%); +} +.connected-bg img { width: 100%; height: 100%; object-fit: cover; filter: blur(4px) saturate(120%); } + +/* Tweaks root */ +#tweaks-root { position: fixed; bottom: 96px; right: 20px; z-index: 1000; } + +/* ============== Theme toggle button ============== */ +.theme-toggle { + width: 38px; height: 38px; border-radius: 10px; + background: rgba(255,255,255,.04); + border: 1px solid var(--line-3); + color: var(--ink-soft); cursor: pointer; + display: grid; place-items: center; + position: relative; + transition: background .2s, border-color .2s, transform .15s; +} +.theme-toggle:hover { background: rgba(56,189,248,.10); border-color: rgba(56,189,248,.5); color: #fff; transform: translateY(-1px); } +.theme-toggle svg { position: absolute; transition: opacity .25s ease, transform .35s ease; } +.theme-toggle .ti-sun { opacity: 0; transform: rotate(-90deg) scale(.6); } +.theme-toggle .ti-moon { opacity: 1; transform: rotate(0) scale(1); } +[data-theme="light"] .theme-toggle .ti-sun { opacity: 1; transform: rotate(0) scale(1); } +[data-theme="light"] .theme-toggle .ti-moon { opacity: 0; transform: rotate(90deg) scale(.6); } + +/* ============== LIGHT THEME ============== */ +[data-theme="light"] { + --bg-0: #ffffff; + --bg-1: #f8fafc; + --bg-2: #ffffff; + --bg-3: #f1f5f9; + --line: rgba(15,23,42,.10); + --line-2: rgba(15,23,42,.06); + --line-3: rgba(2,132,199,.30); + --ink: #0f172a; + --ink-soft: #1e293b; + --body: #475569; + --muted: #64748b; + --muted-2: #94a3b8; +} +[data-theme="light"] body { background: #ffffff; color: #0f172a; } +[data-theme="light"] h1, [data-theme="light"] h2, [data-theme="light"] h3, +[data-theme="light"] h4, [data-theme="light"] h5, +[data-theme="light"] .sec-h, [data-theme="light"] .hero h1 { color: #0f172a; } + +/* Background ambient */ +[data-theme="light"] .bg-orb.b-cyan { opacity: .35; background: radial-gradient(circle, rgba(2,132,199,.30), rgba(2,132,199,0) 70%); } +[data-theme="light"] .bg-orb.b-orange { opacity: .25; background: radial-gradient(circle, rgba(249,115,22,.22), rgba(249,115,22,0) 70%); } +[data-theme="light"] .bg-grid { + background-image: + linear-gradient(rgba(15,23,42,.04) 1px, transparent 1px), + linear-gradient(90deg, rgba(15,23,42,.04) 1px, transparent 1px); +} +[data-theme="light"] .bg-circuit { display: none; } + +/* Nav */ +[data-theme="light"] .nav { + background: rgba(255,255,255,.85); + border-bottom-color: var(--line); +} +[data-theme="light"] .nav-links a { color: #334155; } +[data-theme="light"] .nav-links a:hover { color: #0284c7; } + +/* Buttons */ +[data-theme="light"] .btn-ghost { + background: #ffffff; border-color: var(--line); color: #334155; + box-shadow: 0 1px 2px rgba(15,23,42,.05); +} +[data-theme="light"] .btn-ghost:hover { background: #f8fafc; color: #0f172a; } + +/* Eyebrows */ +[data-theme="light"] .eyebrow { background: #ffffff; border-color: var(--line); box-shadow: 0 1px 2px rgba(15,23,42,.04); } +[data-theme="light"] .ltd-pill { background: #fffbeb; border-color: rgba(249,115,22,.35); } +[data-theme="light"] .ltd-pill b { color: #b45309; } + +/* Hero trust */ +[data-theme="light"] .hero-trust .t-it { color: #475569; } +[data-theme="light"] .hero-trust .t-stars b { color: #0f172a; } +[data-theme="light"] .hero-trust .sep { background: var(--line); } + +/* Stat ribbon */ +[data-theme="light"] .stat-ribbon { + background: #ffffff; + border-color: var(--line); + box-shadow: 0 1px 2px rgba(15,23,42,.04), 0 20px 40px -20px rgba(15,23,42,.10); +} +[data-theme="light"] .stat-it .t { color: #0f172a; } +[data-theme="light"] .stat-it .s { color: #64748b; } +[data-theme="light"] .stat-it { border-right-color: var(--line); } + +/* Logos band */ +[data-theme="light"] .logos-inner { border-top-color: var(--line); border-bottom-color: var(--line); } +[data-theme="light"] .logos-l { color: #64748b; } +[data-theme="light"] .logos-l b { color: #0f172a; } +[data-theme="light"] .logos-row span { color: #94a3b8; } + +/* Theme toggle button itself */ +[data-theme="light"] .theme-toggle { + background: #ffffff; border-color: var(--line); color: #334155; + box-shadow: 0 1px 2px rgba(15,23,42,.05); +} +[data-theme="light"] .theme-toggle:hover { background: #f8fafc; color: #0f172a; border-color: rgba(2,132,199,.4); } + +/* Dashboard window */ +[data-theme="light"] .dash-window { + background: + radial-gradient(ellipse 600px 400px at 80% 100%, rgba(167,139,250,.10), transparent 70%), + radial-gradient(ellipse 500px 350px at 0% 0%, rgba(56,189,248,.08), transparent 70%), + linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); + border-color: var(--line); + box-shadow: 0 50px 100px -40px rgba(15,23,42,.18), 0 30px 60px -30px rgba(2,132,199,.15); +} +[data-theme="light"] .dw-bar { background: #f8fafc; border-bottom-color: var(--line); } +[data-theme="light"] .dw-url { background: #ffffff; border-color: var(--line); color: #475569; } +[data-theme="light"] .dw-kpi { background: #f8fafc; border-color: var(--line); } +[data-theme="light"] .dw-kpi:hover { background: #ffffff; border-color: rgba(2,132,199,.35); } +[data-theme="light"] .dw-kpi-l { color: #64748b; } +[data-theme="light"] .dw-chart, [data-theme="light"] .dw-act-item { background: #f8fafc; border-color: var(--line); } +[data-theme="light"] .dw-act-item:hover { background: #ffffff; border-color: rgba(2,132,199,.35); } +[data-theme="light"] .dw-act-t { color: #0f172a; } +[data-theme="light"] .dw-chart-h h4 { color: #0f172a; } +[data-theme="light"] .dw-chart-svg g[stroke="#1e293b"] { stroke: #e2e8f0 !important; } + +/* Dashboard window — tabs + screenshot stage on light theme */ +[data-theme="light"] .dw-tab { + background: #f1f5f9; + border-color: var(--line); + color: #475569; +} +[data-theme="light"] .dw-tab:hover { + background: #ffffff; + color: #0f172a; + border-color: rgba(2,132,199,.35); +} +[data-theme="light"] .dw-tab.is-active { + color: #0f172a; + background: linear-gradient(180deg, rgba(56,189,248,.22), rgba(56,189,248,.08)); + border-color: rgba(2,132,199,.45); + box-shadow: + inset 0 0 0 1px rgba(56,189,248,.18), + 0 8px 22px -10px rgba(2,132,199,.35); +} +[data-theme="light"] .dw-tab svg { color: #0284c7; } +[data-theme="light"] .dw-tab.is-active svg { color: #0369a1; } +[data-theme="light"] .dw-stage { + background: + radial-gradient(ellipse 600px 280px at 50% 0%, rgba(56,189,248,.10), transparent 70%), + #0a172e; + border-color: rgba(15,23,42,.10); + box-shadow: + 0 30px 60px -25px rgba(15,23,42,.22), + 0 0 0 1px rgba(15,23,42,.05) inset, + 0 0 80px -30px rgba(2,132,199,.22); +} +[data-theme="light"] .dw-corner { opacity: .8; } + +/* Mobile companion — screenshot variant on light theme */ +[data-theme="light"] .mc-img-wrap.mc-img-shot { + background: + radial-gradient(ellipse 380px 200px at 50% 0%, rgba(56,189,248,.12), transparent 70%), + #0a172e; + border-color: rgba(15,23,42,.12); + box-shadow: + 0 30px 60px -25px rgba(15,23,42,.2), + 0 0 80px -30px rgba(2,132,199,.22); +} +[data-theme="light"] .mc-img-wrap.mc-img-shot::after { + background: + linear-gradient(180deg, transparent 62%, rgba(2,8,23,.55) 100%), + linear-gradient(45deg, rgba(56,189,248,.08), transparent 60%); +} + +/* Generic dark cards → white */ +[data-theme="light"] .sys-card, +[data-theme="light"] .conn-feat, +[data-theme="light"] .ben-it, +[data-theme="light"] .rev, +[data-theme="light"] .perf-row, +[data-theme="light"] .vc, +[data-theme="light"] .meas-pill, +[data-theme="light"] .foot-cert span, +[data-theme="light"] .cal-int .int { + background: #ffffff; + border-color: var(--line); + box-shadow: 0 1px 2px rgba(15,23,42,.04), 0 8px 24px -12px rgba(15,23,42,.08); +} +[data-theme="light"] .sys-card h3, [data-theme="light"] .cal-pt h4, +[data-theme="light"] .conn-feat h4, [data-theme="light"] .ben-it h4, +[data-theme="light"] .perf-v, [data-theme="light"] .rev .who, +[data-theme="light"] .meas-pill b { color: #0f172a; } +[data-theme="light"] .sys-card p, [data-theme="light"] .cal-pt p, +[data-theme="light"] .conn-feat p, [data-theme="light"] .ben-it p, +[data-theme="light"] .rev p, [data-theme="light"] .perf-l, +[data-theme="light"] .meas-pill span { color: #475569; } +[data-theme="light"] .perf-it { border-right-color: var(--line); } + +/* Mobile companion */ +[data-theme="light"] .mobile-companion { + background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); + border-color: var(--line); +} +[data-theme="light"] .mc-l h3 { color: #0f172a; } +[data-theme="light"] .mc-l p { color: #475569; } +[data-theme="light"] .mc-feats li { color: #334155; } + +/* Calendar window */ +[data-theme="light"] .cal-window { + background: #ffffff; border-color: var(--line); + box-shadow: 0 40px 80px -30px rgba(15,23,42,.18); +} +[data-theme="light"] .cal-w-head { background: #f8fafc; border-bottom-color: var(--line); } +[data-theme="light"] .cal-w-l, [data-theme="light"] .cal-w-c { color: #0f172a; } +[data-theme="light"] .cal-w-r .seg { background: #ffffff; border-color: var(--line); color: #334155; } +[data-theme="light"] .navb { background: #ffffff; border-color: var(--line); color: #334155; } +[data-theme="light"] .cal-w-days { background: #f8fafc; border-bottom-color: var(--line); } +[data-theme="light"] .cal-w-days > div { color: #64748b; border-left-color: var(--line); } +[data-theme="light"] .cal-w-days > div b { color: #0f172a; } +[data-theme="light"] .cal-w-body { + background-image: linear-gradient(rgba(15,23,42,.06) 1px, transparent 1px); +} +[data-theme="light"] .cal-w-col { border-left-color: var(--line); } +[data-theme="light"] .ai-pop { background: rgba(255,255,255,.98); border-color: rgba(2,132,199,.3); box-shadow: 0 20px 60px -10px rgba(15,23,42,.2); } +[data-theme="light"] .ai-pop p { color: #1e293b; } +[data-theme="light"] .ai-pop p b { color: #0f172a; } +[data-theme="light"] .ai-btn { background: #ffffff; border-color: var(--line); color: #334155; } + +/* Measurements section */ +[data-theme="light"] .meas-art { + background: #ffffff; border-color: var(--line); + box-shadow: 0 30px 60px -30px rgba(15,23,42,.15); +} + +/* Pricing */ +[data-theme="light"] .p-card { + background: #ffffff; border-color: var(--line); + box-shadow: 0 8px 24px -12px rgba(15,23,42,.10); +} +[data-theme="light"] .p-name { color: #0f172a; } +[data-theme="light"] .p-desc { color: #475569; } +[data-theme="light"] .p-price .amt { color: #0f172a; } +[data-theme="light"] .p-feats li { color: #334155; } +[data-theme="light"] .p-feats li b { color: #0f172a; } +[data-theme="light"] .p-trust .t-it { color: #475569; } + +/* Final CTA */ +[data-theme="light"] .final-card { + background: + radial-gradient(ellipse 600px 360px at 90% 90%, rgba(249,115,22,.12), transparent 60%), + radial-gradient(ellipse 800px 460px at 0% 0%, rgba(56,189,248,.10), transparent 60%), + linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); + border-color: var(--line-3); + box-shadow: 0 40px 80px -30px rgba(15,23,42,.18); +} +[data-theme="light"] .countdown { background: #ffffff; border-color: rgba(249,115,22,.3); } +[data-theme="light"] .cd-cell { background: #fffbeb; } +[data-theme="light"] .cd-cell .n { color: #0f172a; } +[data-theme="light"] .cd-foot { color: #475569; } + +/* Footer */ +[data-theme="light"] .footer { background: #f8fafc; border-top-color: var(--line); } +[data-theme="light"] .foot-top { border-bottom-color: var(--line); } +[data-theme="light"] .foot-cols a { color: #475569; } +[data-theme="light"] .foot-cols a:hover { color: #0284c7; } +[data-theme="light"] .foot-cols h5 { color: #0f172a; } +[data-theme="light"] .foot-brand p { color: #475569; } +[data-theme="light"] .foot-bot .tagline { color: #0f172a; } +[data-theme="light"] .foot-cert span { color: #334155; } + +/* Sticky CTA */ +[data-theme="light"] .sticky-cta { + background: rgba(255,255,255,.95); + border-top-color: rgba(249,115,22,.3); + box-shadow: 0 -10px 30px -10px rgba(15,23,42,.15); +} +[data-theme="light"] .s-t { color: #0f172a; } +[data-theme="light"] .sticky-cd .c { background: #fffbeb; } +[data-theme="light"] .sticky-cd .c b { color: #0f172a; } +[data-theme="light"] .sticky-close { color: #94a3b8; } +[data-theme="light"] .sticky-close:hover { color: #0f172a; } + +/* Video / field */ +[data-theme="light"] .video-frame { + background: #f8fafc; border-color: var(--line); + box-shadow: 0 50px 100px -40px rgba(15,23,42,.18); +} +[data-theme="light"] .vc .t { color: #334155; } +[data-theme="light"] .field-card { + background: #f8fafc; border-color: var(--line); + box-shadow: 0 8px 24px -12px rgba(15,23,42,.10); +} + +/* Bento (old/unused but kept) */ +[data-theme="light"] .bento-card { + background: #ffffff; border-color: var(--line); + box-shadow: 0 8px 24px -12px rgba(15,23,42,.10); +} + +/* ============== BUILT FOR THE FIELD ============== */ +.sec-field { padding: 100px 0; } +.field-grid { + display: grid; + grid-template-columns: 1.6fr 1fr 1fr; + grid-template-rows: 240px 240px; + gap: 18px; + max-width: 1180px; margin: 0 auto; +} +.field-card { + position: relative; + overflow: hidden; + border-radius: 20px; + border: 1px solid var(--line); + text-decoration: none; + display: block; + box-shadow: + 0 30px 60px -30px rgba(0,0,0,.55), + 0 0 0 1px rgba(56,189,248,.08) inset; + transition: transform .25s ease, border-color .25s, box-shadow .25s; + background: var(--bg-2); +} +.field-card:hover { + transform: translateY(-3px); + border-color: rgba(56,189,248,.4); + box-shadow: + 0 40px 80px -30px rgba(2,132,199,.4), + 0 0 0 1px rgba(56,189,248,.2) inset; +} +.field-card img { + position: absolute; inset: 0; + width: 100%; height: 100%; object-fit: cover; display: block; + transition: transform .6s cubic-bezier(.2,.7,.2,1); +} +.field-card:hover img { transform: scale(1.05); } +.field-overlay { + position: absolute; inset: 0; + background: + linear-gradient(180deg, rgba(2,8,23,0) 30%, rgba(2,8,23,.4) 65%, rgba(2,8,23,.92) 100%); + pointer-events: none; +} +.field-meta { + position: absolute; left: 22px; right: 22px; bottom: 22px; + z-index: 2; +} +.field-meta h3 { + font-size: 19px; font-weight: 700; color: #fff; + margin: 0 0 4px; letter-spacing: -.015em; + text-shadow: 0 1px 2px rgba(0,0,0,.5); +} +.field-meta p { + font-size: 12.5px; color: var(--ink-soft); margin: 0; + line-height: 1.5; + text-shadow: 0 1px 2px rgba(0,0,0,.4); +} +.field-tag { + display: inline-flex; align-items: center; + padding: 5px 12px; border-radius: 999px; + background: rgba(2,8,23,.65); + border: 1px solid rgba(56,189,248,.5); + color: var(--cyan-2); + font-size: 11px; font-weight: 600; + backdrop-filter: blur(8px); + margin-bottom: 12px; +} +.field-hero { + grid-column: 1; + grid-row: 1 / 3; +} +.field-hero .field-meta h3 { font-size: 24px; } +.field-hero .field-meta p { font-size: 13.5px; } + +/* ========================================================== + RESPONSIVE SYSTEM — mobile-first overrides + ---------------------------------------------------------- + Breakpoints: + • base (≤767px) : mobile-first defaults below + • md (≥768px) : tablet + • lg (≥1024px) : laptop + • xl (≥1280px) : large desktop (current design width) + ========================================================== */ + +/* -------- Hamburger nav-toggle button (hidden on desktop) -------- */ +.nav-toggle { + display: none; + width: 42px; height: 42px; border-radius: 10px; + background: rgba(255,255,255,.04); + border: 1px solid var(--line-3); + color: var(--ink-soft); cursor: pointer; + padding: 0; + align-items: center; justify-content: center; + flex-direction: column; gap: 4px; + transition: background .2s, border-color .2s; +} +.nav-toggle:hover { background: rgba(56,189,248,.10); border-color: rgba(56,189,248,.5); } +.nav-toggle span { + display: block; width: 18px; height: 2px; + background: currentColor; border-radius: 2px; + transition: transform .25s ease, opacity .25s ease; +} +.nav-toggle.is-open span:nth-child(1) { transform: translateY(6px) rotate(45deg); } +.nav-toggle.is-open span:nth-child(2) { opacity: 0; } +.nav-toggle.is-open span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); } + +/* Mobile slide-out menu backdrop */ +.nav-overlay { + display: none; + position: fixed; inset: 0; + background: rgba(2,8,23,.55); + backdrop-filter: blur(4px); + z-index: 49; + opacity: 0; pointer-events: none; + transition: opacity .25s ease; +} +.nav-overlay.is-open { opacity: 1; pointer-events: auto; } +.nav-mobile-cta { display: none !important; } +body.nav-locked { overflow: hidden; } + +/* ========================================================== + BASE / MOBILE (< 768px) + ========================================================== */ + +/* Wrap padding shrinks on phones to remove horizontal cramp */ +.wrap { padding: 0 16px; } + +/* ----- NAV ----- */ +.nav-inner { height: 64px; gap: 8px; } +.brand-img { height: 26px; } +.nav-links { display: none; } /* hide horizontal links on mobile */ +.nav-cta { gap: 8px; } +.nav-desktop-cta { display: none; } /* hide desktop CTAs on mobile */ +.nav-toggle { display: inline-flex; } /* show hamburger */ +.nav-overlay { display: block; } + +/* Slide-out menu panel (mobile) */ +.nav-links.is-open { + display: flex; + flex-direction: column; + gap: 4px; + position: fixed; + top: 64px; right: 0; + width: min(86vw, 340px); + height: calc(100dvh - 64px); + padding: 22px 22px 28px; + background: rgba(5,15,36,.98); + backdrop-filter: blur(20px) saturate(160%); + border-left: 1px solid var(--line-3); + box-shadow: -20px 0 60px -10px rgba(0,0,0,.6); + z-index: 50; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + animation: navSlideIn .25s ease; +} +.nav-links.is-open a { + padding: 14px 4px; + font-size: 16px; + border-bottom: 1px solid var(--line-2); + width: 100%; +} +.nav-links.is-open a:last-of-type { border-bottom: 0; } +.nav-links.is-open .nav-mobile-cta { + display: inline-flex !important; + border-bottom: 0; + margin-top: 8px; + justify-content: center; +} +@keyframes navSlideIn { + from { transform: translateX(20px); opacity: 0; } + to { transform: translateX(0); opacity: 1; } +} + +/* Touch-friendly hit-area for nav and buttons */ +[data-theme="light"] .nav-links.is-open { background: rgba(255,255,255,.98); } + +/* ----- BUTTONS — keep tap targets >= 44px ----- */ +.btn { min-height: 44px; padding: 12px 18px; font-size: 14.5px; } +.btn-lg { padding: 13px 20px; } +.btn-xl { padding: 16px 22px; font-size: 15px; } + +/* ----- HERO ----- */ +.hero { padding: 32px 0 56px; } +.hero-inner { gap: 36px; } +.hero-ctas { width: 100%; } +.hero-ctas .btn { width: 100%; } +.hero-trust { gap: 10px 14px; font-size: 12px; } +.hero-trust .sep { display: none; } +.ltd-pill { + font-size: 11.5px; padding: 6px 6px 6px 10px; + flex-wrap: wrap; justify-content: center; gap: 6px; +} +.ltd-pill .badge { font-size: 10px; padding: 3px 7px; } + +/* Hero artwork — wider aspect for landscape banner on small screens */ +.hero-art { aspect-ratio: 16 / 11; border-radius: 16px; } +.hero-model-img { border-radius: 16px !important; } +.hero-model-overlay { border-radius: 16px; } +.hero-model-overlay .corner { + width: 22px; height: 22px; +} +.hero-model-overlay .corner.tl, +.hero-model-overlay .corner.tr, +.hero-model-overlay .corner.bl, +.hero-model-overlay .corner.br { top: auto; bottom: auto; } +.hero-model-overlay .corner.tl { top: 10px; left: 10px; } +.hero-model-overlay .corner.tr { top: 10px; right: 10px; } +.hero-model-overlay .corner.bl { bottom: 10px; left: 10px; } +.hero-model-overlay .corner.br { bottom: 10px; right: 10px; } + +/* Floating chips become tiny on mobile */ +.art-chip { + padding: 7px 10px; gap: 7px; font-size: 10px; + border-radius: 9px; +} +.art-chip .l { font-size: 9px; } +.art-chip .v { font-size: 11px; } +.art-chip-tl { top: 10px; left: 10px; } +.art-chip-tr { top: 10px; right: 10px; } +.art-chip-br { bottom: 10px; right: 10px; } +.art-chip svg { width: 12px; height: 12px; flex: none; } + +/* Stat ribbon — 2 cols on mobile, full grid on desktop */ +.stat-ribbon { + grid-template-columns: 1fr 1fr; + gap: 0; margin-top: 36px; + border-radius: 14px; +} +.stat-it { + padding: 14px 12px; gap: 10px; + border-right: 1px solid var(--line-2); + border-bottom: 1px solid var(--line-2); +} +.stat-it:nth-child(2n) { border-right: 0; } +.stat-it:nth-last-child(-n+2) { border-bottom: 0; } +.stat-it:last-child { border-right: 0; } +.stat-it .ic { width: 34px; height: 34px; border-radius: 8px; } +.stat-it .ic svg { width: 16px; height: 16px; } +.stat-it .t { font-size: 12.5px; } +.stat-it .s { font-size: 11px; } + +/* ----- LOGOS BAND ----- */ +.logos-inner { + flex-direction: column; + align-items: center; + gap: 14px; padding: 22px 0; +} +.logos-l { + white-space: normal; + font-size: 11px; + text-align: center; + width: 100%; +} +.logos-row { + gap: 18px 22px; justify-content: center; + width: 100%; flex-wrap: wrap; +} +.logos-row span { font-size: 13px; white-space: nowrap; } +.logos-row .lg-3 { font-size: 11px; letter-spacing: .2em; } + +/* ----- PLATFORM / DASHBOARD ----- */ +.sec-platform { padding: 72px 0 60px; } +.sec-head { margin-bottom: 40px; } + +.dash-window { border-radius: 14px; } +.dw-bar { + grid-template-columns: auto 1fr; + padding: 10px 12px; gap: 10px; +} +.dw-spacer { display: none; } +.dw-dots i { width: 9px; height: 9px; } +.dw-url { + font-size: 11px; + padding: 6px 10px; + max-width: 100%; +} +.dw-body { padding: 18px 14px 18px; } + +.dw-kpis { + grid-template-columns: 1fr 1fr; + gap: 10px; margin-bottom: 18px; +} +.dw-kpi { padding: 14px 10px; border-radius: 12px; } +.dw-kpi-l { font-size: 9.5px; margin-bottom: 8px; letter-spacing: .08em; } +.dw-kpi-v { font-size: 24px; margin-bottom: 6px; } +.dw-kpi-d { font-size: 11px; } + +.dw-split { grid-template-columns: 1fr; gap: 12px; } +.dw-chart { min-height: 0; padding: 16px 14px; } +.dw-chart-svg { min-height: 140px; } +.dw-chart-h h4 { font-size: 13px; } +.dw-chart-x { font-size: 10px; } +.dw-act-item { padding: 12px 14px; } +.dw-act-t, .dw-act-v { font-size: 13px; } + +/* Tabs + stage on mobile */ +.dw-tabs { gap: 6px; padding: 14px 14px 0; } +.dw-tab { padding: 8px 12px; font-size: 11.5px; gap: 6px; } +.dw-tab svg { width: 12px; height: 12px; } +.dw-stage { margin: 14px 14px 14px; border-radius: 12px; } +.dw-corner { width: 14px; height: 14px; } + +/* ----- Mobile companion section ----- */ +.mobile-companion { + margin-top: 56px; + grid-template-columns: 1fr; + gap: 32px; + padding: 32px 22px; + border-radius: 18px; + text-align: center; +} +.mobile-companion::before { display: none; } +.mc-l { order: 1; } +.phone-shell { order: 2; margin: 0 auto; width: min(240px, 76vw); } +.mc-img-wrap { order: 3; aspect-ratio: 4/3; max-width: 460px; margin: 0 auto; width: 100%; } +.mc-l h3 { font-size: 22px; } +.mc-l p { font-size: 14px; max-width: none; } +.mc-feats li { font-size: 13.5px; justify-content: center; text-align: left; } + +/* ----- VIDEO SECTION ----- */ +.sec-video { padding: 60px 0 56px; } +.video-frame { border-radius: 16px; } +.video-play { width: 70px; height: 70px; } +.video-play .play-btn { width: 56px; height: 56px; } +.video-play .play-btn svg { width: 20px; height: 20px; } +.video-meta { + bottom: 12px; left: 12px; + padding: 6px 10px; font-size: 11px; +} +.vh { font-size: 10px; padding: 5px 9px; } +.vh-1 { top: 12px; left: 12px; } +.vh-2 { top: 12px; right: 12px; } +.vh-3 { bottom: 56px; right: 12px; } +.video-chips { + grid-template-columns: 1fr; + gap: 8px; margin-top: 14px; +} +.vc { padding: 12px 14px; } +.vc .t { font-size: 12.5px; } + +/* ----- SYSTEMS GRID ----- */ +.sec-systems { padding: 60px 0; } +.sys-grid { + grid-template-columns: 1fr; + gap: 14px; +} +.sys-card { padding: 24px 22px; border-radius: 16px; } +.sys-ic { width: 48px; height: 48px; margin-bottom: 18px; border-radius: 12px; } +.sys-card h3 { font-size: 17px; } +.sys-card p { font-size: 13px; } +.sys-num { top: 22px; right: 24px; font-size: 11px; } + +/* ----- CALENDAR ----- */ +.sec-calendar { padding: 56px 0; } +.cal-row { grid-template-columns: 1fr; gap: 36px; } +.cal-points { gap: 18px; margin-top: 22px; } +.cal-pt-ic { width: 38px; height: 38px; border-radius: 10px; } +.cal-pt h4 { font-size: 14.5px; } +.cal-pt p { font-size: 12.5px; } + +/* Calendar widget — make it scroll horizontally on small screens + so the 7-day grid never breaks the layout */ +.cal-stage { width: 100%; } +.cal-window { border-radius: 14px; } +.cal-w-head { + grid-template-columns: 1fr auto; + padding: 12px 12px; +} +.cal-w-l { font-size: 12px; } +.cal-w-l svg { width: 14px; height: 14px; } +.cal-w-c { + grid-column: 1 / -1; + order: 3; + font-size: 12px; gap: 6px; +} +.cal-w-r { gap: 6px; } +.cal-w-r .seg { padding: 4px 9px; font-size: 11px; } + +/* The grid itself is allowed to scroll horizontally on phones */ +.cal-w-days, .cal-w-body { + grid-template-columns: 44px repeat(7, minmax(60px, 1fr)); + min-width: 520px; +} +.cal-stage { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +.cal-w-days > div { padding: 8px 4px; font-size: 9.5px; } +.cal-w-days > div b { font-size: 14px; } +.cal-w-time span { font-size: 9px; padding-right: 4px; } +.cal-e { padding: 4px 6px; font-size: 9.5px; } +.cal-e .t { font-size: 10px; } +.cal-e .s { font-size: 9px; } + +/* AI popover — anchored bottom on mobile */ +.ai-pop { + position: static; + width: auto; + margin: 14px 12px 12px; + border-radius: 12px; + padding: 14px; +} +.ai-pop::before { display: none; } +.ai-pop p { font-size: 12.5px; } + +.cal-int { margin-top: 16px; gap: 8px; } +.cal-int .int { padding: 7px 12px; font-size: 12px; } + +/* ----- MEASUREMENTS ----- */ +.sec-measure { padding: 60px 0; } +.meas-stage { + grid-template-columns: 1fr; + gap: 28px; + padding: 14px 0; + text-align: center; +} +.meas-art { padding: 0; border-radius: 16px; } +/* .meas-svg { max-height: 520px; } */ +.meas-pill { position: static; max-width: none; margin: 12px; justify-content: flex-start; } +.meas-pill-tl, .meas-pill-bl { position: static; } +.meas-phone { margin: 0 auto; } +.meas-phone .phone-shell { width: min(240px, 76vw); } + +/* Performance row — 2 cols on small, 5 on desktop */ +.perf-row { + grid-template-columns: 1fr 1fr; + gap: 0; margin-top: 36px; + border-radius: 16px; +} +.perf-it { + padding: 18px 12px; + border-right: 1px solid var(--line-2); + border-bottom: 1px solid var(--line-2); +} +.perf-it:nth-child(2n) { border-right: 0; } +.perf-it:last-child { + grid-column: 1 / -1; + border-right: 0; border-bottom: 0; +} +.perf-it:nth-last-child(2):nth-child(odd) { + border-bottom: 0; +} +.perf-ic { width: 40px; height: 40px; margin-bottom: 10px; border-radius: 10px; } +.perf-ic svg { width: 18px; height: 18px; } +.perf-v { font-size: 14.5px; } +.perf-l { font-size: 11px; } + +/* ----- CONNECTED ----- */ +.sec-connected { padding: 60px 0; } +.connected-stage { + grid-template-columns: 1fr; + gap: 22px; +} +.conn-side.right { padding-left: 0; } +.conn-feat { padding: 14px 16px; border-radius: 12px; } +.conn-feat:hover, .conn-side.right .conn-feat:hover { transform: none; } +.conn-center { order: -1; max-width: 360px; margin: 0 auto; } +.benefit-row { + grid-template-columns: 1fr; + gap: 10px; margin-top: 36px; +} +.ben-it { padding: 18px 20px; border-radius: 14px; } + +/* ----- PRICING ----- */ +.sec-pricing { padding: 60px 0; } +.pricing-grid { + grid-template-columns: 1fr; + gap: 16px; +} +.p-card { padding: 26px 22px; border-radius: 18px; } +.p-ltd { + padding: 30px 22px; + margin: 6px 0; /* remove negative margins on mobile to keep ribbon visible */ +} +.p-ribbon { font-size: 11px; padding: 7px 14px; } +.p-desc { min-height: 0; } +.p-price .amt { font-size: 34px; } +.p-trust { + gap: 14px; flex-direction: column; align-items: center; + margin-top: 28px; +} +.p-feats li { font-size: 13px; } + +/* ----- FIELD ----- */ +.sec-field { padding: 60px 0; } +.field-grid { + grid-template-columns: 1fr; + grid-template-rows: auto; + gap: 14px; +} +.field-card { + min-height: 220px; + border-radius: 16px; +} +.field-hero { + grid-column: 1; + grid-row: auto; + min-height: 260px; +} +.field-meta { left: 16px; right: 16px; bottom: 16px; } +.field-meta h3 { font-size: 17px; } +.field-hero .field-meta h3 { font-size: 20px; } + +/* ----- REVIEWS ----- */ +.sec-reviews { padding: 60px 0 56px; } +.reviews-grid { + columns: 1; column-gap: 0; +} +.rev { padding: 20px; border-radius: 14px; margin-bottom: 14px; } +.rev p { font-size: 13px; } +.rev-feat p { font-size: 14px; } + +/* ----- FINAL CTA ----- */ +.sec-final { padding: 50px 0 40px; } +.final-card { + grid-template-columns: 1fr; + padding: 36px 22px; gap: 28px; + border-radius: 20px; +} +.cd-grid { gap: 6px; } +.cd-cell { padding: 12px 4px; border-radius: 10px; } +.cd-cell .n { font-size: 20px; } +.cd-cell .l { font-size: 9px; } +.countdown { padding: 18px; } + +/* ----- FOOTER ----- */ +.footer { padding: 48px 0 24px; } +.foot-top { + grid-template-columns: 1fr; + gap: 32px; padding-bottom: 32px; +} +.foot-cols { + grid-template-columns: 1fr 1fr; + gap: 24px 18px; +} +.foot-bot { + flex-direction: column; + gap: 12px; text-align: center; +} +.foot-brand p { max-width: none; } + +/* ----- STICKY CTA ----- */ +.sticky-inner { + flex-direction: column; + align-items: stretch; + padding: 10px 14px; gap: 10px; +} +.sticky-l { gap: 10px; } +.s-t { font-size: 12.5px; } +.s-s { font-size: 11px; } +.sticky-cd { justify-content: center; } +.sticky-cd .c { padding: 5px 9px; min-width: 34px; } +.sticky-r { justify-content: space-between; } +.sticky-r .btn { flex: 1; } + +/* Increase body bottom padding for taller mobile sticky CTA */ +body { padding-bottom: 120px; } + +/* Section heading top margin */ +.eyebrow { font-size: 11px; padding: 5px 12px 5px 9px; } + +/* SVG / image safeguards */ +img, video, svg { max-width: 100%; height: auto; } +image-slot { max-width: 100%; } + +/* ========================================================== + TABLET (≥ 768px) + ========================================================== */ +@media (min-width: 768px) { + .wrap { padding: 0 24px; } + + /* Hero */ + .hero { padding: 48px 0 70px; } + .hero-ctas .btn { width: auto; } + + /* Stat ribbon — 4 cols starting at tablet */ + .stat-ribbon { grid-template-columns: repeat(4, 1fr); margin-top: 48px; } + .stat-it { + padding: 16px 18px; + border-bottom: 0; + border-right: 1px solid var(--line-2); + } + .stat-it:last-child { border-right: 0; } + .stat-it:nth-child(2n) { border-right: 1px solid var(--line-2); } + + /* Logos band returns to row */ + .logos-inner { flex-direction: row; gap: 24px; padding: 24px 0; flex-wrap: wrap; } + .logos-l { text-align: center; white-space: nowrap; font-size: 12px; } + .logos-row { justify-content: center; gap: 12px 22px; flex-wrap: wrap; } + .logos-row span { font-size: 14px; } + + /* Dashboard */ + .sec-platform { padding: 90px 0 80px; } + .dw-body { padding: 22px 22px 24px; } + .dw-kpis { grid-template-columns: repeat(4, 1fr); } + .dw-kpi-v { font-size: 30px; } + .dw-split { grid-template-columns: 1fr; gap: 14px; } + .dw-tabs { padding: 18px 22px 0; gap: 8px; } + .dw-tab { padding: 9px 14px; font-size: 12.5px; } + .dw-tab svg { width: 14px; height: 14px; } + .dw-stage { margin: 18px 22px 22px; border-radius: 14px; } + .dw-corner { width: 16px; height: 16px; } + + /* Mobile companion — 2 col layout (copy left, phone right) */ + .mobile-companion { + grid-template-columns: 1fr 240px; + text-align: left; + padding: 40px 36px; + gap: 36px; + } + .mc-img-wrap { + grid-column: 1 / -1; + aspect-ratio: 21/9; + max-width: none; + } + .mc-feats li { justify-content: flex-start; } + + /* Video chips — 2 cols */ + .video-chips { grid-template-columns: 1fr 1fr; gap: 10px; } + + /* Systems — 2 cols */ + .sys-grid { grid-template-columns: 1fr 1fr; } + + /* Calendar — keep stacked but calendar widget fits naturally */ + .cal-w-days, .cal-w-body { + grid-template-columns: 60px repeat(7, 1fr); + min-width: 0; + } + .cal-stage { overflow: visible; } + .cal-w-head { grid-template-columns: auto 1fr auto; } + .cal-w-c { grid-column: auto; order: 0; } + .ai-pop { + position: absolute; + top: 152px; left: 38%; + width: 320px; + margin: 0; + } + .ai-pop::before { display: block; } + + /* Measurements */ + .meas-stage { + grid-template-columns: 1.4fr 280px; + gap: 40px; + padding: 30px 18px; + text-align: left; + } + .meas-pill { position: absolute; max-width: 240px; margin: 0; } + .meas-pill-tl { top: 24px; left: 24px; } + .meas-pill-bl { bottom: 24px; left: 24px; } + + /* Perf row — 3 cols */ + .perf-row { grid-template-columns: repeat(3, 1fr); } + .perf-it { border-bottom: 1px solid var(--line-2); } + .perf-it:nth-last-child(-n+2) { border-bottom: 1px solid var(--line-2); } + .perf-it:last-child { grid-column: auto; border-bottom: 0; } + .perf-it:nth-child(3n) { border-right: 0; } + .perf-it:nth-last-child(2):nth-child(odd) { border-bottom: 1px solid var(--line-2); } + + /* Connected — 2 col with center first */ + .connected-stage { grid-template-columns: 1fr 1fr; gap: 28px; } + .conn-center { grid-column: 1 / -1; order: 0; max-width: 460px; } + .benefit-row { grid-template-columns: repeat(3, 1fr); gap: 14px; } + + /* Pricing — 2 cols, LTD spans both */ + .pricing-grid { grid-template-columns: 1fr 1fr; gap: 16px; } + .p-ltd { grid-column: 1 / -1; margin: 0; } + + /* Field — 2x2 + hero */ + .field-grid { + grid-template-columns: 1fr 1fr; + grid-template-rows: 220px 220px 220px; + } + .field-hero { grid-column: 1 / -1; grid-row: 1; min-height: 0; } + + /* Reviews — 2 cols */ + .reviews-grid { columns: 2; column-gap: 16px; } + + /* Final CTA */ + .final-card { padding: 50px 40px; } + + /* Footer */ + .foot-top { grid-template-columns: 1fr 2fr; gap: 40px; } + .foot-cols { grid-template-columns: repeat(4, 1fr); gap: 24px; } + .foot-bot { flex-direction: row; text-align: left; } + + /* Sticky CTA — back to row */ + .sticky-inner { flex-direction: row; padding: 12px 22px; gap: 18px; } + .sticky-r { justify-content: flex-end; } + .sticky-r .btn { flex: none; } + body { padding-bottom: 96px; } + + /* Nav */ + .nav-inner { height: 70px; } + .brand-img { height: 28px; } +} + +/* ========================================================== + LAPTOP (≥ 1024px) + ========================================================== */ +@media (min-width: 1024px) { + /* Reveal desktop nav, hide hamburger */ + .nav-links { + display: flex; + gap: 24px; + position: static; + width: auto; height: auto; + padding: 0; background: transparent; + box-shadow: none; border: 0; + overflow: visible; + flex-direction: row; + animation: none; + } + .nav-links a { + padding: 0; font-size: 14px; + border-bottom: 0; width: auto; + } + .nav-mobile-cta { display: none !important; } + .nav-desktop-cta { display: inline-flex; } + .nav-toggle { display: none; } + .nav-overlay { display: none; } + body.nav-locked { overflow: auto; } + .nav-inner { height: 76px; gap: 16px; } + + /* Hero — return to centered hero with side art */ + .hero { padding: 56px 0 76px; } + .hero-inner { gap: 48px; } + .hero-trust { gap: 18px; font-size: 13px; } + .hero-trust .sep { display: block; } + + /* Dashboard split — back to chart + activity side-by-side */ + .dw-split { grid-template-columns: 1.6fr 1fr; gap: 16px; } + .dw-bar { grid-template-columns: 80px 1fr 80px; padding: 14px 18px; } + .dw-spacer { display: block; } + .dw-body { padding: 28px 28px 30px; } + .dw-kpi-v { font-size: 32px; } + + /* Mobile companion — 3 col layout (copy / phone / photo) */ + .mobile-companion { + grid-template-columns: 1fr 260px 1fr; + padding: 48px 48px; + gap: 48px; + text-align: left; + } + .mc-img-wrap { + grid-column: auto; + aspect-ratio: 4/5; + max-width: none; + } + + /* Video chips */ + .video-chips { grid-template-columns: repeat(4, 1fr); } + + /* Systems — 3 cols */ + .sys-grid { grid-template-columns: repeat(3, 1fr); gap: 16px; } + + /* Calendar — 2 col */ + .cal-row { grid-template-columns: 0.85fr 1.15fr; gap: 48px; } + + /* Measurements */ + .meas-stage { padding: 40px 20px; gap: 50px; } + + /* Perf row — 5 cols */ + .perf-row { grid-template-columns: repeat(5, 1fr); } + .perf-it { border-bottom: 0; border-right: 1px solid var(--line-2); } + .perf-it:last-child { border-right: 0; } + .perf-it:nth-child(n) { border-right: 1px solid var(--line-2); border-bottom: 0; } + .perf-it:last-child { border-right: 0; } + + /* Connected — 3 col with center */ + .connected-stage { grid-template-columns: 1fr 420px 1fr; gap: 32px; } + .conn-center { grid-column: auto; order: 0; max-width: none; } + .conn-side.right { padding-left: 16px; } + + /* Pricing — 3 cols */ + .pricing-grid { grid-template-columns: 1fr 1fr 1.15fr; } + .p-ltd { grid-column: auto; margin: -8px 0; } + .p-trust { flex-direction: row; gap: 24px; } + + /* Field — desktop bento */ + .field-grid { + grid-template-columns: 1.6fr 1fr 1fr; + grid-template-rows: 240px 240px; + gap: 18px; + } + .field-hero { grid-column: 1; grid-row: 1 / 3; } + + /* Reviews — 3 cols */ + .reviews-grid { columns: 3; column-gap: 18px; } + + /* Final CTA — 2 col */ + .final-card { grid-template-columns: 1.4fr 1fr; padding: 60px 52px; gap: 44px; } + + /* Footer */ + .foot-top { grid-template-columns: 1.2fr 3fr; gap: 50px; } +} + +/* ========================================================== + LARGE DESKTOP (≥ 1280px) — original design width + ========================================================== */ +@media (min-width: 1280px) { + .wrap { padding: 0 32px; } + .hero { padding: 60px 0 80px; } + .hero-inner { gap: 64px; } + .sec-platform { padding: 130px 0 100px; } + .sec-systems, + .sec-calendar, + .sec-measure, + .sec-connected, + .sec-pricing, + .sec-field { padding: 100px 0; } + .sec-reviews { padding: 100px 0 80px; } + .dw-body { padding: 30px 32px 32px; } + .mobile-companion { padding: 56px 56px; gap: 60px; } + .final-card { padding: 70px 64px; gap: 50px; } + .footer { padding: 70px 0 30px; } + .sec-head { margin-bottom: 60px; } + .cal-row { gap: 60px; } + .meas-stage { gap: 60px; padding: 40px 20px; } +} + +/* ========================================================== + REDUCED MOTION — respect user preference + ========================================================== */ +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } + .scan-line, .pulse, .s-pulse { animation: none !important; } + .hmo-dims .dim { animation: none !important; opacity: 1 !important; transform: none !important; } +} diff --git a/public/page/lp-v3.js b/public/page/lp-v3.js new file mode 100644 index 0000000..3da7c19 --- /dev/null +++ b/public/page/lp-v3.js @@ -0,0 +1,239 @@ +/* LynkedUp Pro v3 — interactivity */ + +// ---------- Mobile nav (hamburger toggle) ---------- +(function() { + const toggle = document.getElementById('navToggle'); + const links = document.getElementById('navLinks'); + const overlay = document.getElementById('navOverlay'); + if (!toggle || !links) return; + + function setOpen(open) { + toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); + toggle.classList.toggle('is-open', open); + links.classList.toggle('is-open', open); + if (overlay) overlay.classList.toggle('is-open', open); + document.body.classList.toggle('nav-locked', open); + } + + toggle.addEventListener('click', () => { + const open = toggle.getAttribute('aria-expanded') !== 'true'; + setOpen(open); + }); + if (overlay) overlay.addEventListener('click', () => setOpen(false)); + // Close on any link tap inside the panel + links.querySelectorAll('a').forEach(a => { + a.addEventListener('click', () => setOpen(false)); + }); + // Close when crossing back to desktop width + const mq = window.matchMedia('(min-width: 1024px)'); + mq.addEventListener('change', e => { if (e.matches) setOpen(false); }); + // Close on Escape + document.addEventListener('keydown', e => { + if (e.key === 'Escape') setOpen(false); + }); +})(); + +// ---------- Theme toggle (light/dark) ---------- +(function() { + const root = document.documentElement; + const key = 'lp-theme'; + const saved = localStorage.getItem(key); + if (saved === 'light' || saved === 'dark') { + root.setAttribute('data-theme', saved); + } else { + root.setAttribute('data-theme', 'dark'); // default + } + const btn = document.getElementById('themeToggle'); + if (btn) { + btn.addEventListener('click', () => { + const current = root.getAttribute('data-theme') || 'dark'; + const next = current === 'dark' ? 'light' : 'dark'; + root.setAttribute('data-theme', next); + localStorage.setItem(key, next); + }); + } +})(); + +// ---------- Countdown timer (both final card + sticky bar) ---------- +(function() { + let secs = 42, mins = 27, hours = 14, days = 3; + const get = id => document.getElementById(id); + const elFinal = { s: get('cdS'), m: get('cdM'), h: get('cdH'), d: get('cdD') }; + const elStk = { s: get('ssS'), m: get('ssM'), h: get('ssH'), d: get('ssD') }; + + function pad(n) { return String(n).padStart(2, '0'); } + function render() { + const v = { d: pad(days), h: pad(hours), m: pad(mins), s: pad(secs) }; + for (const k of ['d','h','m','s']) { + if (elFinal[k]) elFinal[k].textContent = v[k]; + if (elStk[k]) elStk[k].textContent = v[k]; + } + } + setInterval(() => { + secs--; + if (secs < 0) { secs = 59; mins--; + if (mins < 0) { mins = 59; hours--; + if (hours < 0) { hours = 23; days = Math.max(0, days - 1); } + } + } + render(); + }, 1000); + render(); +})(); + +// ---------- Sticky CTA reveal/hide ---------- +(function() { + const el = document.getElementById('stickyCta'); + const close = document.getElementById('stickyClose'); + if (!el || !close) return; + let dismissed = false; + window.addEventListener('scroll', () => { + if (dismissed) return; + if (window.scrollY > 700) el.classList.add('show'); + else el.classList.remove('show'); + }); + close.addEventListener('click', () => { + dismissed = true; + el.classList.remove('show'); + document.body.style.paddingBottom = '0'; + }); +})(); + +// ---------- Video player ---------- +(function() { + const frame = document.getElementById('videoFrame'); + const playBtn = document.getElementById('videoPlay'); + const videoEl = document.getElementById('videoEl'); + if (!frame || !playBtn || !videoEl) return; + + function play(at) { + frame.classList.add('playing'); + if (typeof at === 'number' && !isNaN(at)) { + try { videoEl.currentTime = at; } catch (e) {} + } + videoEl.play().catch(() => {}); + } + playBtn.addEventListener('click', () => play()); + document.querySelectorAll('.vc[data-seek]').forEach(chip => { + chip.addEventListener('click', () => { + const at = parseFloat(chip.dataset.seek); + play(at); + }); + }); +})(); + +// ---------- Dashboard product-view tabs ---------- +(function() { + const wrap = document.getElementById('dashWindow'); + if (!wrap) return; + const tabs = wrap.querySelectorAll('.dw-tab'); + const shots = wrap.querySelectorAll('.dw-shot'); + const urlText = document.getElementById('dwUrlText'); + + function activate(name) { + tabs.forEach(t => { + const on = t.dataset.tab === name; + t.classList.toggle('is-active', on); + t.setAttribute('aria-selected', on ? 'true' : 'false'); + if (on && urlText && t.dataset.url) urlText.textContent = t.dataset.url; + }); + shots.forEach(s => s.classList.toggle('is-active', s.dataset.shot === name)); + } + + tabs.forEach(t => { + t.addEventListener('click', () => activate(t.dataset.tab)); + }); +})(); + +// ---------- Smooth in-page nav ---------- +document.querySelectorAll('a[href^="#"]').forEach(a => { + a.addEventListener('click', (e) => { + const id = a.getAttribute('href'); + if (id.length < 2) return; + const t = document.querySelector(id); + if (!t) return; + e.preventDefault(); + window.scrollTo({ top: t.getBoundingClientRect().top + window.scrollY - 80, behavior: 'smooth' }); + }); +}); + +// ---------- Tweaks panel ---------- +(function() { + const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ + "accentOrange": "#f97316", + "accentCyan": "#22d3ee", + "bgIntensity": 0.65, + "showGrid": true + }/*EDITMODE-END*/; + + let state = { ...TWEAK_DEFAULTS }; + let active = false; + const root = document.getElementById('tweaks-root'); + + function applyState() { + document.documentElement.style.setProperty('--orange', state.accentOrange); + document.documentElement.style.setProperty('--cyan', state.accentCyan); + document.documentElement.style.setProperty('--cyan-2', state.accentCyan); + const orbs = document.querySelectorAll('.bg-orb'); + orbs.forEach(o => o.style.opacity = state.bgIntensity); + const grid = document.querySelector('.bg-grid'); + if (grid) grid.style.display = state.showGrid ? '' : 'none'; + } + applyState(); + + function render() { + if (!active) { root.innerHTML = ''; return; } + root.innerHTML = ` +
+
+ Tweaks + +
+ +
CTA Orange
+
+ ${['#f97316','#ef4444','#fbbf24','#ec4899'].map(c => ``).join('')} +
+ +
Accent Cyan
+
+ ${['#22d3ee','#38bdf8','#a78bfa','#10b981'].map(c => ``).join('')} +
+ +
Background glow · ${Math.round(state.bgIntensity*100)}%
+ + + +
+ `; + root.querySelector('#tw-close').onclick = () => { + active = false; render(); + window.parent.postMessage({type:'__edit_mode_dismissed'}, '*'); + }; + root.querySelectorAll('[data-orange]').forEach(b => b.onclick = () => { + state.accentOrange = b.dataset.orange; applyState(); render(); + window.parent.postMessage({type:'__edit_mode_set_keys', edits:{accentOrange: state.accentOrange}}, '*'); + }); + root.querySelectorAll('[data-cyan]').forEach(b => b.onclick = () => { + state.accentCyan = b.dataset.cyan; applyState(); render(); + window.parent.postMessage({type:'__edit_mode_set_keys', edits:{accentCyan: state.accentCyan}}, '*'); + }); + root.querySelector('#tw-bg').oninput = (e) => { + state.bgIntensity = parseFloat(e.target.value); applyState(); render(); + window.parent.postMessage({type:'__edit_mode_set_keys', edits:{bgIntensity: state.bgIntensity}}, '*'); + }; + root.querySelector('#tw-grid').onchange = (e) => { + state.showGrid = e.target.checked; applyState(); render(); + window.parent.postMessage({type:'__edit_mode_set_keys', edits:{showGrid: state.showGrid}}, '*'); + }; + } + + window.addEventListener('message', (e) => { + if (e.data?.type === '__activate_edit_mode') { active = true; render(); } + if (e.data?.type === '__deactivate_edit_mode') { active = false; render(); } + }); + window.parent.postMessage({type:'__edit_mode_available'}, '*'); +})(); diff --git a/public/page/uploads/1668be05-f2c0-4a29-ba79-2bac4bd5292b.jpg b/public/page/uploads/1668be05-f2c0-4a29-ba79-2bac4bd5292b.jpg new file mode 100644 index 0000000..7a5290e Binary files /dev/null and b/public/page/uploads/1668be05-f2c0-4a29-ba79-2bac4bd5292b.jpg differ diff --git a/public/page/uploads/22453.jpg b/public/page/uploads/22453.jpg new file mode 100644 index 0000000..64f8edb Binary files /dev/null and b/public/page/uploads/22453.jpg differ diff --git a/public/page/uploads/Group 1171275436.png b/public/page/uploads/Group 1171275436.png new file mode 100644 index 0000000..0458027 Binary files /dev/null and b/public/page/uploads/Group 1171275436.png differ diff --git a/public/page/uploads/bd44084c-3f19-4303-9d47-81226a555a19.jpg b/public/page/uploads/bd44084c-3f19-4303-9d47-81226a555a19.jpg new file mode 100644 index 0000000..acdc781 Binary files /dev/null and b/public/page/uploads/bd44084c-3f19-4303-9d47-81226a555a19.jpg differ diff --git a/public/page/uploads/c93ffce1-8a18-4485-960c-c32195230651.jpg b/public/page/uploads/c93ffce1-8a18-4485-960c-c32195230651.jpg new file mode 100644 index 0000000..b80c186 Binary files /dev/null and b/public/page/uploads/c93ffce1-8a18-4485-960c-c32195230651.jpg differ diff --git a/public/page/uploads/d500dc36-1339-403c-ab33-b18565b1af48.jpg b/public/page/uploads/d500dc36-1339-403c-ab33-b18565b1af48.jpg new file mode 100644 index 0000000..189d95f Binary files /dev/null and b/public/page/uploads/d500dc36-1339-403c-ab33-b18565b1af48.jpg differ diff --git a/public/page/uploads/pasted-1779881893297-0.png b/public/page/uploads/pasted-1779881893297-0.png new file mode 100644 index 0000000..a472ca5 Binary files /dev/null and b/public/page/uploads/pasted-1779881893297-0.png differ diff --git a/public/page/uploads/pasted-1779893225808-0.png b/public/page/uploads/pasted-1779893225808-0.png new file mode 100644 index 0000000..d8a1829 Binary files /dev/null and b/public/page/uploads/pasted-1779893225808-0.png differ diff --git a/public/sections.jsx b/public/sections.jsx new file mode 100644 index 0000000..d4a3073 --- /dev/null +++ b/public/sections.jsx @@ -0,0 +1,797 @@ +/* global React, Reveal, GlowCard, Icon, Sparkline, DonutChart, BlueprintHouse, Counter */ +// Analytics, Field Intelligence, Testimonials, CTA, Footer + +const { useEffect, useRef, useState } = React; + +// ----------- Animated bar chart ------------ +function BarChart({ data, max, color = "var(--cyan)", height = 180 }) { + return ( +
+ {data.map((d, i) => { + const h = (d.v / max) * (height - 30); + return ( +
+
+ {d.l} +
+ ); + })} +
+ ); +} + +// ----------- HUD ring widget -------------- +function HudRing({ value, label, color = "var(--cyan)", size = 140 }) { + const r = (size - 18) / 2; + const c = 2 * Math.PI * r; + const dash = (value / 100) * c; + return ( +
+ + + + {/* tick marks */} + {Array.from({ length: 60 }, (_, i) => { + const angle = (i / 60) * 2 * Math.PI; + const inner = r + 4, outer = r + 10; + const x1 = size/2 + inner * Math.cos(angle); + const y1 = size/2 + inner * Math.sin(angle); + const x2 = size/2 + outer * Math.cos(angle); + const y2 = size/2 + outer * Math.sin(angle); + return ; + })} + +
+ + + + {label} +
+
+ ); +} + +// ----------- Analytics Section ------------ +function Analytics() { + const bars = [ + { l: "MON", v: 32 }, { l: "TUE", v: 48 }, { l: "WED", v: 38 }, + { l: "THU", v: 62 }, { l: "FRI", v: 88, highlight: true }, + { l: "SAT", v: 54 }, { l: "SUN", v: 42 }, + ]; + return ( +
+
+
+ +
+
+ + §08 + ANALYTICS & CONTROL CENTER + +

+ Measure once.
+ Use everywhere. +

+

+ A cinematic, HUD-style enterprise dashboard built from your live + operational data, calibrated for executive decisions and field reality. +

+
+
+ // LIVE STREAM + ● 142 MS +
+
+
+ + + +
+
+ OWNERS BOX · ANALYTICS + LIVE STREAM +
+
+ Last sync: 142 ms ago + · + Q2 · 2026 +
+
+ +
+ {/* Left main panel */} +
+
+
+
WEEKLY REVENUE
+
+ $ +
+
+
+ ▲ +28.4% wow + vs. $155,763 last week +
+
+ + + +
+ {[ + { label: "GROSS MARGIN", v: 42, color: "var(--cyan)" }, + { label: "CYCLE TIME", v: 73, color: "var(--orange)" }, + { label: "CREW UTIL.", v: 87, color: "var(--green)" }, + { label: "PIPELINE HEALTH", v: 94, color: "var(--violet)" }, + ].map(s => ( +
+
{s.label}
+
+ +
+
+
+
+
+ ))} +
+
+ + {/* Right HUD column */} +
+
+ + +
+ + {/* Forecast list */} +
+
+ AI FORECAST · NEXT 14 DAYS + +
+ {[ + { l: "Estimated revenue", v: "$430K", c: "var(--cyan)" }, + { l: "Crews needed", v: "14", c: "var(--orange)" }, + { l: "Weather risk", v: "Low", c: "var(--green)" }, + { l: "Material orders", v: "23", c: "var(--violet)" }, + ].map((f, i) => ( +
+ {f.l} + {f.v} +
+ ))} +
+ + {/* Mini activity */} +
+ LIVE FEED + {[ + { c: "var(--green)", t: "Payment received", s: "$8,250 · Maple Project" }, + { c: "var(--cyan)", t: "Estimate accepted", s: "Pine Rd · $14,800" }, + { c: "var(--orange)", t: "Crew dispatched", s: "Diego's crew → 456 Oak" }, + ].map((a, i) => ( +
+ +
+ {a.t}{" "} + · {a.s} +
+
+ ))} +
+
+
+ + +
+
+ ); +} + +// ----------- Field Intelligence Section ---------- +function FieldIntelligence() { + return ( +
+
+
+ +
+
+ + §09 + FIELD INTELLIGENCE + +

+ Field intelligence.
+ Not just CRM. +

+

+ AI-powered measurements, photo evidence, claim-ready reports, + and on-site decisions in minutes, not days. +

+
+
+ // AI & LIDAR + // PRECISION MODE +
+
+
+ + {/* Big wireframe stage */} + +
+ {/* Stage floor grid */} +
+ + {/* Huge centered wireframe house */} +
+ +
+ + {/* Floating hex logo above */} +
+ LynkedUp Pro +
+ + {/* Side data overlays */} +
+
AI MEASUREMENT
+
+ SQ FT +
+
Roof area · 14 planes detected
+
+ ● SCAN COMPLETE · 24 PHOTOS +
+
+ +
+
+ + AI-POWERED +
+
Precision Mode
+
AI & LiDAR active
+
+ Confidence + 99.7% +
+
+ +
+
CLAIM READY
+
Xactimate®-style report
+
Photo evidence attached · Generated in 6m 42s
+
+ +
+
PLANES DETECTED
+
+ +
+
Largest: 425.32 sq ft
+
+
+ + + {/* Intelligence sub-cards */} +
+ {[ + { v: "10×", label: "FASTER", desc: "Measure in minutes, not hours.", color: "var(--cyan)", icon: "clock" }, + { v: "98.6%", label: "ACCURATE", desc: "AI & LiDAR precision you can rely on.", color: "var(--orange)", icon: "target" }, + { v: "6m 42s", label: "CLAIM READY", desc: "Evidence-backed reports that get paid.", color: "var(--green)", icon: "shield" }, + { v: "∞", label: "CLOUD SYNC", desc: "Real-time access across your team.", color: "var(--violet)", icon: "sync" }, + ].map((c, i) => ( + + +
+ +
{c.v}
+
{c.label}
+
{c.desc}
+
+
+
+ ))} +
+
+
+ ); +} + +// ----------- Testimonials ----------- +const TESTIMONIALS = [ + { + quote: "LynkedUp Pro turned our chaos into a clear, connected operation. We close jobs faster and our margins are visible for the first time.", + name: "Maya Patel", + title: "Operations Manager · Plano, TX", + init: "MP", + color: "var(--cyan)", + metric: "+42% revenue", + }, + { + quote: "It's the closest thing to having an extra ops director in the field. The AI Copilot has saved us from at least a dozen costly mistakes.", + name: "Daniel Cruz", + title: "Founder · Houston, TX", + init: "DC", + color: "var(--orange)", + metric: "−68% admin time", + }, + { + quote: "Field teams adopted it in a week. Reports that took our office two days now take 4-5 minutes. It is genuinely transformational software.", + name: "Ashley Reed", + title: "Operations Manager · Shreveport, LA", + init: "AR", + color: "var(--green)", + metric: "10K+ jobs synced", + }, +]; + +function Testimonials() { + return ( +
+
+
+ +
+
+ + §10 + CUSTOMER VOICES + +

+ Operators are betting on LynkedUp Pro. +

+
+ // 3,000+ TEAMS +
+
+
+ {TESTIMONIALS.map((t, i) => ( + + +
+
+

{t.quote}

+
+
+
{t.init}
+
+
{t.name}
+
{t.title}
+
+
+ {t.metric} +
+
+
+
+ ))} +
+
+
+ ); +} + +// ----------- Final CTA ------------- +function FinalCTA() { + return ( +
+
+
+ +
+ {/* Floor grid */} +
+ + {/* Floating light beams */} +
+
+ +
+ READY WHEN YOU ARE +

+ Run construction
+ without chaos. +

+

+ Join the operators replacing five tools, four spreadsheets, and a + whiteboard with one AI-powered command center built for the + modern construction enterprise. +

+ + +
+ No credit card + · + SOC 2 Type II + · + White-glove onboarding +
+
+
+ +
+
+ ); +} + +// ----------- Footer --------------- +function Footer() { + const cols = [ + { h: "Product", items: ["Platform overview", "AI Copilot", "Mobile app", "Pricing", "Changelog"] }, + { h: "Solutions", items: ["Roofing", "General contractors", "Infrastructure", "Enterprise", "Field teams"] }, + { h: "Integrations", items: ["QuickBooks", "Stripe", "Calendly", "iOS / Google", "Zapier"] }, + { h: "Resources", items: ["Documentation", "Customer stories", "Security", "Status", "API"] }, + { h: "Contact", items: ["Talk to sales", "Support", "Careers", "Partner program", "Press"] }, + ]; + return ( + + ); +} + +// ----------- Pricing / Lifetime Offer ------------ +function Pricing() { + return ( +
+
+ +
+ 🔥 Limited Founder Offer +

Own Your Roofing CRM. Pay Once.

+

Stop paying monthly for multiple disconnected tools. Get founders lifetime access + to LynkedUpPro and scale your roofing business with one intelligent platform.

+
+ +
+ +
+
+
MOST POPULAR
+

Founders Lifetime Access

+

One payment. Unlimited operational control.

+
+
+ $25,000 + Save $23,000 · 92% off +
+

$2000

+ PER LICENSE • PAY ONCE • USE FOREVER +
+
    +
  • Complete Roofing CRM
  • +
  • Lead Management System
  • +
  • Canvassing & Field Tracking
  • +
  • Insurance Workflow
  • +
  • Proposal & Inspection Tools
  • +
  • Team Management Dashboard
  • +
  • Unlimited Projects
  • +
  • Future Feature Updates
  • +
  • Priority Support
  • +
+ Claim Founders Lifetime Deal +
+
+ +
+
+ Why Roofers Choose LynkedUpPro +

Replace 5 Different Tools With One Roofing OS

+

Most roofing companies spend thousands yearly on disconnected + CRMs, canvassing apps, spreadsheets, proposal software, and field coordination tools.

+
+
More Revenue Visibility
+

Track leads, conversions, and team performance from one dashboard.

+
+
+
Less Operational Chaos
+

Eliminate scattered communication and disconnected workflows.

+
+
+
Built for Roofing Teams
+

Purpose-built for storm restoration, canvassing, insurance, and roofing operations.

+
+
+
+ +
+ +
+
+ Deal Terms & Conditions +
+
+

All claims, results, performance statements, platform capabilities, and customer references are provided for informational and promotional purposes only. Claims may be based on a combination of internal testing, platform development data, field-tested data, and feedback from founding users. Individual results may vary based on company size, user adoption, data quality, market conditions, workflow setup, and other business-specific factors.

+

Some user names, company names, examples, or identifying details may have been changed, modified, or withheld to protect user privacy, confidential business information, proprietary workflows, and trade secrets.

+

The Lifetime Founders License applies to one user license and one individual user account unless otherwise stated in writing. The Founders License includes access to core CRM features and the platform features made available under the applicable license terms. The Lifetime Founders License does not guarantee access to every future product, premium module, third-party integration, usage-based service, or separately priced feature.

+

SMS usage, data usage, storage, GPU processing, AI compute, automation volume, messaging volume, third-party API costs, and other usage-based services may incur additional monthly charges. These charges may be billed separately based on actual usage, service level, selected features, or third-party provider costs.

+

Advanced or specialized features, including but not limited to Campaign-X, LiDAR scans, digital twin technology, AI-generated content, 3D property scans, mapping tools, premium automation, and other enhanced modules, may require additional fees, setup costs, subscriptions, or usage-based billing.

+

Features, pricing, availability, and platform capabilities are subject to change. No statement shall be interpreted as a guarantee of revenue, cost savings, insurance savings, operational results, business growth, or specific customer outcomes. Use of the platform is subject to the final written agreement, subscription terms, billing terms, and applicable service terms provided by Lynked Up Technologies.

+
+
+
+
+ +
+

Roofing Moves Fast. Your CRM Should Too.

+

Join the next generation of roofing companies scaling with automation, + field intelligence, and operational visibility.

+ +
+ +
+ + +
+ ); +} + +Object.assign(window, { Analytics, FieldIntelligence, Testimonials, Pricing, FinalCTA, Footer }); diff --git a/public/square-checkout.js b/public/square-checkout.js new file mode 100644 index 0000000..1ab632e --- /dev/null +++ b/public/square-checkout.js @@ -0,0 +1,642 @@ +// Multi-step checkout wizard for the "Claim Founders Lifetime Deal" button +// (.deal-btn). Opens as a modal and walks the visitor through: +// +// Step 1 Registration - contact + company + email + phone + sales reps + +// number of licenses (1-10) + business address (with +// API autofill) + SMS consent. Submitting captures the +// record server-side (POST /api/register) BEFORE any +// branch, so no lead is ever lost. +// Branch on license count: +// <= 5 Step 2 Cart + Terms - order summary (licenses x $2,000), the Deal +// Terms & Conditions, and an "I agree" checkbox. Then +// "Continue to Secure Payment" -> POST /api/checkout -> +// redirect to Stripe. After payment Stripe returns the +// buyer to /thanks. +// > 5 Sales screen - "you may be eligible for a special discount" + +// "Talk to Sales". No online payment (bulk orders are +// handled by the sales team). +// +// WHY A CUSTOM FORM AND NOT STRIPE'S PAGE: +// Customers could complete an Apple Pay purchase without giving us any contact +// details, so there was no way to onboard buyers or distribute licenses. Stripe +// hosted Checkout can't fix this (no way to hide the Apple Pay express button; +// custom_fields enforcement there is undocumented) and SMS consent legally needs +// our own disclaimer text. Collecting first makes the payment method irrelevant. +// The server re-validates everything (api/_lead.js) — this form is UX only. +// +// Event delegation is used so this works on the static pages and the React home +// page (where the button mounts after this script loads). +(function () { + // --------------------------------------------------------------------------- + // TODO(client): replace with the exact SMS consent disclaimer Justin provided. + // PLACEHOLDER wording, no legal pass. When it changes, bump SMS_CONSENT_VERSION + // in api/checkout.js AND api/register.js so the CRM records the agreed version. + // --------------------------------------------------------------------------- + var SMS_CONSENT_TEXT = + "I agree to receive SMS messages from Lynked Up Technologies about my Founders " + + "License, onboarding, and product updates at the phone number provided. Message " + + "frequency varies. Message and data rates may apply. Reply STOP to opt out or HELP " + + "for help."; + + // TODO(client): confirm the sales inbox for >5-license (bulk) enquiries. + var SALES_EMAIL = "sales@lynkeduppro.com"; + + var SALES_REP_BUCKETS = ["1", "2-5", "6-10", "11-25", "26-50", "51+"]; + + // DISPLAY ONLY — the server owns the real charge (api/checkout.js). Keep in sync. + var UNIT_PRICE = 2000; // USD per license + var MAX_LICENSES = 10; // dropdown ceiling; must match api/_lead.js MAX_LICENSES + var SELF_SERVE_MAX = 5; // <= this pays online; above -> sales. Match api/_lead.js + + // Deal Terms & Conditions shown on the cart step. Mirrors the accordion text on + // the pricing sections. TODO(client): keep in sync with Justin's final legal T&C. + var TERMS = [ + "All claims, results, performance statements, platform capabilities, and customer references are provided for informational and promotional purposes only. Individual results may vary based on company size, user adoption, data quality, market conditions, workflow setup, and other business-specific factors.", + "The Lifetime Founders License applies to one user license and one individual user account unless otherwise stated in writing. It includes access to core CRM features and the platform features made available under the applicable license terms. It does not guarantee access to every future product, premium module, third-party integration, usage-based service, or separately priced feature.", + "SMS usage, data usage, storage, GPU processing, AI compute, automation volume, messaging volume, third-party API costs, and other usage-based services may incur additional monthly charges billed separately based on actual usage.", + "Advanced or specialized features, including but not limited to Campaign-X, LiDAR scans, digital twin technology, AI-generated content, 3D property scans, mapping tools, and premium automation, may require additional fees, setup costs, subscriptions, or usage-based billing.", + "Features, pricing, availability, and platform capabilities are subject to change. No statement shall be interpreted as a guarantee of revenue, cost savings, insurance savings, operational results, business growth, or specific customer outcomes. Use of the platform is subject to the final written agreement, subscription terms, billing terms, and applicable service terms provided by Lynked Up Technologies.", + ]; + + var FIELDS = [ + { name: "firstName", label: "First name", type: "text", autocomplete: "given-name", placeholder: "Jane" }, + { name: "lastName", label: "Last name", type: "text", autocomplete: "family-name", placeholder: "Smith" }, + { name: "companyName", label: "Company name", type: "text", autocomplete: "organization", placeholder: "Smith Roofing LLC" }, + { name: "email", label: "Email address", type: "email", autocomplete: "email", placeholder: "jane@smithroofing.com" }, + { name: "phone", label: "Phone number", type: "tel", autocomplete: "tel", placeholder: "(555) 010-9999" }, + { name: "salesReps", label: "Number of sales reps", type: "select", autocomplete: "off", options: SALES_REP_BUCKETS, empty: "Select…" }, + { name: "licenses", label: "Number of licenses", type: "select", autocomplete: "off", options: licenseOptions(), value: "1" }, + // Street is full-width with autocomplete; selecting a suggestion fills the + // city / state / zip fields below (which sit in their own 3-column row). + { name: "streetAddress", label: "Street address", type: "text", autocomplete: "off", full: true, placeholder: "Start typing your address…" }, + { name: "city", label: "City", type: "text", autocomplete: "off", col3: true, placeholder: "Plano" }, + { name: "state", label: "State", type: "text", autocomplete: "off", col3: true, placeholder: "TX" }, + { name: "zip", label: "ZIP code", type: "text", autocomplete: "off", col3: true, placeholder: "75074" }, + ]; + + function licenseOptions() { + var a = []; + for (var i = 1; i <= 10; i++) a.push(String(i)); + return a; + } + + var modal = null; // overlay element (built once) + var body = null; // the step container inside the modal + var activeBtn = null; // the .deal-btn that opened the modal + var lastFocused = null; // element to restore focus to on close + // plan: null = normal paid ($2,000/license). "demo" = fixed $1 Stripe test. + // "free" = $0 no-card demo (page/19.html): runs the whole flow but skips Stripe + // entirely and lands on /thanks, so the team can demo it without a card. + var state = { step: "form", values: null, plan: null }; + + function esc(s) { + return String(s).replace(/[&<>"']/g, function (c) { + return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; + }); + } + function money(n) { + return "$" + Number(n).toLocaleString("en-US"); + } + function digitCount(v) { + return (String(v).match(/\d/g) || []).length; + } + + // --------------------------------------------------------------------------- + // Validation. Mirrors api/_lead.js (server is authoritative; this is for UX). + // --------------------------------------------------------------------------- + function validate(values) { + var errors = {}; + if (values.firstName.length < 1) errors.firstName = "Please enter your first name."; + if (values.lastName.length < 1) errors.lastName = "Please enter your last name."; + if (values.companyName.length < 2) errors.companyName = "Please enter your company name."; + if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(values.email)) errors.email = "Please enter a valid email address."; + var d = digitCount(values.phone); + if (d < 10 || d > 15) errors.phone = "Please enter a valid phone number."; + if (SALES_REP_BUCKETS.indexOf(values.salesReps) === -1) errors.salesReps = "Please select how many sales reps you have."; + var lic = Number(values.licenses); + if (!Number.isInteger(lic) || lic < 1 || lic > MAX_LICENSES) errors.licenses = "Please choose 1 to " + MAX_LICENSES + " licenses."; + if (values.streetAddress.length < 3) errors.streetAddress = "Please enter your street address."; + if (values.city.length < 2) errors.city = "Please enter your city."; + if (values.state.length < 2) errors.state = "Please enter your state."; + if (!/^\d{5}(-\d{4})?$/.test(values.zip)) errors.zip = "Please enter a valid ZIP code."; + if (!values.smsConsent) errors.smsConsent = "Please agree to receive SMS updates to continue."; + return errors; + } + + function readFormValues() { + function val(n) { + var el = body.querySelector('[name="' + n + '"]'); + return el ? String(el.value || "").trim() : ""; + } + return { + firstName: val("firstName"), + lastName: val("lastName"), + companyName: val("companyName"), + email: val("email").toLowerCase(), + phone: val("phone"), + salesReps: val("salesReps"), + licenses: parseInt(val("licenses"), 10) || 1, + streetAddress: val("streetAddress"), + city: val("city"), + state: val("state"), + zip: val("zip"), + smsConsent: body.querySelector('[name="smsConsent"]').checked, + }; + } + + function showErrors(errors) { + var names = FIELDS.map(function (f) { return f.name; }).concat(["smsConsent"]); + var first = null; + names.forEach(function (name) { + var msgEl = body.querySelector('[data-err="' + name + '"]'); + var input = body.querySelector('[name="' + name + '"]'); + var msg = errors[name]; + if (msgEl) msgEl.textContent = msg || ""; + if (input) { + input.setAttribute("aria-invalid", msg ? "true" : "false"); + if (msg && !first) first = input; + } + }); + if (first && first.focus) first.focus(); + } + + // --------------------------------------------------------------------------- + // Address autocomplete. Provider: Photon (photon.komoot.io) — OpenStreetMap, + // FREE, no API key, CORS-enabled. Chosen because no provider key was supplied. + // TO SWAP FOR GOOGLE PLACES: replace geocode()'s body so it returns [{label}]. + // --------------------------------------------------------------------------- + function geocode(query) { + var url = "https://photon.komoot.io/api/?limit=5&lang=en&q=" + encodeURIComponent(query); + return fetch(url) + .then(function (r) { return r.ok ? r.json() : { features: [] }; }) + .then(function (data) { + return (data.features || []).map(function (f) { + var p = f.properties || {}; + var street = [p.housenumber, p.street].filter(Boolean).join(" ") || + (p.name && p.name !== (p.city || p.town) ? p.name : ""); + var city = p.city || p.town || p.village || p.county || ""; + var state = p.state || ""; + var zip = p.postcode || ""; + // Structured components used to fill the separate fields on select. + var comp = { street: street, city: city, state: state, zip: zip }; + var label = [street, city, [state, zip].filter(Boolean).join(" "), p.country] + .filter(Boolean).join(", "); + comp.label = label; + return comp; + }).filter(function (s) { return s.label; }); + }) + .catch(function () { return []; }); + } + + // Fill the street field plus city/state/zip from a chosen suggestion, and + // clear their error messages. + function fillAddress(comp) { + var map = { streetAddress: comp.street, city: comp.city, state: comp.state, zip: comp.zip }; + Object.keys(map).forEach(function (name) { + var el = body.querySelector('[name="' + name + '"]'); + if (el && map[name]) { + el.value = map[name]; + el.setAttribute("aria-invalid", "false"); + } + var msg = body.querySelector('[data-err="' + name + '"]'); + if (msg && map[name]) msg.textContent = ""; + }); + } + + function attachAddressAutocomplete(input) { + var box = document.createElement("ul"); + box.className = "lu-ac"; + box.setAttribute("hidden", ""); + input.parentNode.appendChild(box); + var timer = null, lastQuery = ""; + + function hide() { box.setAttribute("hidden", ""); box.innerHTML = ""; } + function render(items) { + box.innerHTML = ""; + if (!items.length) { hide(); return; } + items.forEach(function (it) { + var li = document.createElement("li"); + li.className = "lu-ac-item"; + li.textContent = it.label; + li.addEventListener("mousedown", function (e) { + e.preventDefault(); + // Prefer the parsed street; fall back to the full label if none. + input.value = it.street || it.label; + fillAddress(it); + hide(); + }); + box.appendChild(li); + }); + box.removeAttribute("hidden"); + } + + input.addEventListener("input", function () { + var q = input.value.trim(); + if (timer) clearTimeout(timer); + if (q.length < 4) { hide(); return; } + timer = setTimeout(function () { + if (q === lastQuery) return; + lastQuery = q; + geocode(q).then(function (items) { if (input.value.trim() === q) render(items); }); + }, 250); + }); + input.addEventListener("blur", function () { setTimeout(hide, 120); }); + input.addEventListener("keydown", function (e) { if (e.key === "Escape") hide(); }); + } + + // --------------------------------------------------------------------------- + // Markup helpers + // --------------------------------------------------------------------------- + function fieldHtml(f) { + var id = "lu-f-" + f.name; + var common = 'id="' + id + '" name="' + f.name + '" autocomplete="' + f.autocomplete + + '" aria-describedby="lu-e-' + f.name + '" class="lu-input"'; + var control; + if (f.type === "select") { + var opts = (f.empty ? '" : "") + + f.options.map(function (o) { + var sel = f.value === o ? " selected" : ""; + return '"; + }).join(""); + control = ""; + } else { + control = "'; + } + return ( + '
' + + '' + + control + + '
' + + "
" + ); + } + + // --------------------------------------------------------------------------- + // Step 1 — registration form + // --------------------------------------------------------------------------- + function renderForm() { + state.step = "form"; + body.innerHTML = + '

Claim your Founders License

' + + '

Tell us a bit about your business so we can set up your account and licenses.

' + + '
' + + '
' + FIELDS.filter(function (f) { return !f.col3; }).map(fieldHtml).join("") + "
" + + '
' + FIELDS.filter(function (f) { return f.col3; }).map(fieldHtml).join("") + "
" + + '
' + + '" + + '
' + + '' + + '

All fields are required. Next you\'ll review your order.

' + + "
"; + + // Restore previously entered values if the buyer stepped back. + if (state.values) { + Object.keys(state.values).forEach(function (k) { + var el = body.querySelector('[name="' + k + '"]'); + if (!el) return; + if (el.type === "checkbox") el.checked = !!state.values[k]; + else el.value = state.values[k]; + }); + } + + body.querySelector("form").addEventListener("submit", onFormSubmit); + var addr = body.querySelector('[name="streetAddress"]'); + if (addr) attachAddressAutocomplete(addr); + var lic = body.querySelector('[name="licenses"]'); + if (lic) { lic.addEventListener("change", updateSubtotal); } + updateSubtotal(); + focusFirst('[name="firstName"]'); + } + + function updateSubtotal() { + var el = body.querySelector("[data-subtotal]"); + var lic = body.querySelector('[name="licenses"]'); + if (!el || !lic) return; + var n = parseInt(lic.value, 10) || 1; + if (n > SELF_SERVE_MAX) { + el.innerHTML = '' + n + " licenses — you may qualify for special founder pricing. We'll take your details next."; + } else { + el.innerHTML = "" + n + " × " + money(UNIT_PRICE) + "" + money(UNIT_PRICE * n) + ""; + } + } + + function onFormSubmit(e) { + e.preventDefault(); + var values = readFormValues(); + var errors = validate(values); + body.querySelector("[data-form-err]").textContent = ""; + showErrors(errors); + if (Object.keys(errors).length) return; + state.values = values; + + setSubmitting(true, "Saving your details…"); + // Capture the record server-side FIRST (both branches), then route. + fetch("/api/register", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(values), + }) + .then(function (r) { return r.json().then(function (d) { return { ok: r.ok, data: d }; }); }) + .then(function (res) { + setSubmitting(false); + if (!res.ok) { + if (res.data && res.data.fields) { showErrors(res.data.fields); return; } + throw new Error((res.data && res.data.error) || "Could not save your details."); + } + var path = (res.data && res.data.path) || (values.licenses > SELF_SERVE_MAX ? "sales" : "checkout"); + if (path === "sales") renderSales(); + else renderCart(); + }) + .catch(function (err) { + setSubmitting(false); + console.error("Register error:", err); + var fe = body.querySelector("[data-form-err]"); + if (fe) fe.textContent = "Sorry, something went wrong. Please try again in a moment."; + }); + } + + // --------------------------------------------------------------------------- + // Step 2 — cart + terms (<= SELF_SERVE_MAX licenses) + // --------------------------------------------------------------------------- + function renderCart() { + state.step = "cart"; + var n = state.values.licenses; + var free = state.plan === "free"; + var unit = free ? 0 : UNIT_PRICE; + var total = unit * n; + body.innerHTML = + '' + + '

' + (free ? "Review your demo" : "Review your order") + "

" + + '

' + + (free + ? "Demo access — no payment and no card required." + : "Founders Lifetime License — one-time payment, use forever.") + + "

" + + (free ? '
🎬 Demo mode · $0 · no card
' : "") + + '
' + + '
Founders Lifetime License' + (free ? " (demo)" : "") + "" + money(unit) + " × " + n + "
" + + '
' + + '
Total today' + money(total) + "
" + + '
' + (free ? "Demo · no charge" : "One-time payment") + " · " + n + (n > 1 ? " licenses" : " license") + "
" + + "
" + + '
Deal Terms & Conditions
' + + '
' + TERMS.map(function (p) { return "

" + esc(p) + "

"; }).join("") + "
" + + '" + + '
' + + '" + + '

' + + (free + ? "No card needed — this is a demo of the full flow." + : "You'll be redirected to Stripe to complete payment securely.") + + "

"; + + body.querySelector("[data-back]").addEventListener("click", renderForm); + body.querySelector("[data-pay]").addEventListener("click", onPay); + focusFirst("[data-pay]"); + } + + function onPay() { + var agree = body.querySelector('[name="termsAgree"]'); + var errEl = body.querySelector('[data-err="termsAgree"]'); + if (!agree.checked) { + if (errEl) errEl.textContent = "Please agree to the terms to continue."; + agree.focus(); + return; + } + if (errEl) errEl.textContent = ""; + + // $0 no-card demo (page/19.html): the record was already captured at Step 1, + // so just land on the Thanks page — no Stripe, no card. Full flow, zero cost. + if (state.plan === "free") { + setSubmitting(true, "Finishing demo…", "[data-pay]"); + window.location.href = "/thanks?demo=1"; + return; + } + + setSubmitting(true, "Loading checkout…", "[data-pay]"); + + var plan = activeBtn ? activeBtn.getAttribute("data-plan") : null; + var promoEl = document.querySelector("[data-promo-input]"); + var promo = promoEl && promoEl.value ? promoEl.value.trim() : ""; + var qs = []; + if (plan) qs.push("plan=" + encodeURIComponent(plan)); + if (promo) qs.push("promo=" + encodeURIComponent(promo)); + var endpoint = "/api/checkout" + (qs.length ? "?" + qs.join("&") : ""); + + var payload = Object.assign({}, state.values, { termsAgreed: true }); + fetch(endpoint, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }) + .then(function (r) { return r.json().then(function (d) { return { ok: r.ok, status: r.status, data: d }; }); }) + .then(function (res) { + if (res.ok && res.data && res.data.url) { window.location.href = res.data.url; return; } + // Server guard: bulk orders route to sales even if we reach here. + if (res.data && res.data.path === "sales") { renderSales(); return; } + setSubmitting(false, null, "[data-pay]"); + var fe = body.querySelector("[data-form-err]"); + if (fe) fe.textContent = (res.data && res.data.error) || "We couldn't start checkout. Please try again."; + }) + .catch(function (err) { + setSubmitting(false, null, "[data-pay]"); + console.error("Checkout error:", err); + var fe = body.querySelector("[data-form-err]"); + if (fe) fe.textContent = "Sorry, we couldn't start the checkout. Please try again in a moment."; + }); + } + + // --------------------------------------------------------------------------- + // Sales screen (> SELF_SERVE_MAX licenses) + // --------------------------------------------------------------------------- + function buildMailto() { + var v = state.values || {}; + var name = [v.firstName, v.lastName].filter(Boolean).join(" "); + var address = [v.streetAddress, v.city, [v.state, v.zip].filter(Boolean).join(" ")] + .filter(Boolean).join(", "); + var subject = "Founders License — bulk order (" + (v.licenses || "") + " licenses)"; + var lines = [ + "Hi LynkedUp Pro team,", + "", + "I'd like to discuss a bulk Founders License order.", + "", + "Name: " + name, + "Company: " + (v.companyName || ""), + "Email: " + (v.email || ""), + "Phone: " + (v.phone || ""), + "Sales reps: " + (v.salesReps || ""), + "Licenses wanted: " + (v.licenses || ""), + "Business address: " + address, + ]; + return "mailto:" + SALES_EMAIL + "?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(lines.join("\n")); + } + + function renderSales() { + state.step = "sales"; + var n = state.values.licenses; + body.innerHTML = + '' + + '
🎉
' + + '

Congratulations — you may be eligible for a special discount

' + + '

You\'re looking at ' + n + " licenses. Orders above " + SELF_SERVE_MAX + + " licenses qualify for special founder pricing that isn't available online. Your details are saved — our team will reach out, or you can start the conversation now." + + "

" + + 'Talk to Sales' + + '

Prefer fewer licenses? Go back and choose ' + SELF_SERVE_MAX + " or fewer to check out instantly.

"; + body.querySelector("[data-back]").addEventListener("click", renderForm); + focusFirst(".lu-link-btn"); + } + + // --------------------------------------------------------------------------- + // Shared modal chrome + // --------------------------------------------------------------------------- + function focusFirst(sel) { + var el = body.querySelector(sel); + if (el && el.focus) el.focus(); + } + + function setSubmitting(on, label, sel) { + var b = body.querySelector(sel || ".lu-submit"); + if (!b) return; + b.disabled = !!on; + if (on) { b.dataset.orig = b.dataset.orig || b.textContent; b.textContent = label || "Loading…"; } + else if (b.dataset.orig) b.textContent = b.dataset.orig; + } + + var CSS = + ".lu-overlay{position:fixed;inset:0;z-index:2147483000;background:rgba(6,6,10,.78);backdrop-filter:blur(4px);display:flex;align-items:flex-start;justify-content:center;padding:24px 16px;overflow-y:auto;}" + + ".lu-overlay[hidden]{display:none;}" + + ".lu-modal{position:relative;width:100%;max-width:560px;margin:auto;background:#121216;border:1px solid rgba(255,255,255,.10);border-radius:18px;padding:28px;box-shadow:0 30px 80px rgba(0,0,0,.6);font-family:inherit;}" + + ".lu-close{position:absolute;top:14px;right:16px;width:32px;height:32px;border:0;border-radius:8px;background:rgba(255,255,255,.06);color:#fff;font-size:20px;line-height:1;cursor:pointer;z-index:2;}" + + ".lu-close:hover{background:rgba(255,255,255,.12);}" + + ".lu-back{background:none;border:0;color:#9a9aa2;font-size:13px;font-family:inherit;cursor:pointer;padding:0;margin:0 0 12px;}" + + ".lu-back:hover{color:#fff;}" + + ".lu-title{margin:0 0 6px;color:#fff;font-size:22px;font-weight:800;letter-spacing:-.01em;line-height:1.25;}" + + ".lu-center{text-align:center;}" + + ".lu-sub{margin:0 0 20px;color:#9a9aa2;font-size:13.5px;line-height:1.55;}" + + ".lu-sub strong{color:#fff;}" + + ".lu-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;}" + + ".lu-field-full{grid-column:1/-1;position:relative;}" + + ".lu-grid3{display:grid;grid-template-columns:2fr 1fr 1fr;gap:14px;margin-top:14px;}" + + "@media(max-width:560px){.lu-grid3{grid-template-columns:1fr 1fr;}}" + + ".lu-label{display:block;margin-bottom:6px;color:#e6e6ea;font-size:12.5px;font-weight:600;}" + + ".lu-req{color:#ff9321;}" + + ".lu-input{width:100%;box-sizing:border-box;padding:11px 13px;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);color:#fff;font-size:14px;font-family:inherit;outline:none;transition:border-color .15s,box-shadow .15s;}" + + ".lu-input::placeholder{color:#6f6f78;}" + + ".lu-input:focus{border-color:#4dc5ff;box-shadow:0 0 0 3px rgba(77,197,255,.15);}" + + '.lu-input[aria-invalid="true"]{border-color:#ff5f56;}' + + "select.lu-input{appearance:none;cursor:pointer;}select.lu-input option{background:#121216;color:#fff;}" + + ".lu-ac{position:absolute;left:0;right:0;top:100%;margin:4px 0 0;padding:4px;list-style:none;z-index:5;background:#1b1b21;border:1px solid rgba(255,255,255,.14);border-radius:10px;box-shadow:0 18px 40px rgba(0,0,0,.5);max-height:220px;overflow-y:auto;}" + + ".lu-ac[hidden]{display:none;}" + + ".lu-ac-item{padding:9px 11px;border-radius:7px;color:#e6e6ea;font-size:13px;cursor:pointer;}" + + ".lu-ac-item:hover{background:rgba(77,197,255,.14);}" + + ".lu-subtotal{display:flex;align-items:center;justify-content:space-between;margin:14px 0 2px;padding:10px 14px;border-radius:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);color:#c9c9d2;font-size:13px;}" + + ".lu-subtotal strong{color:#fff;font-size:16px;}" + + ".lu-subtotal-note{color:#ffb066;font-size:12.5px;line-height:1.4;}" + + ".lu-cart{margin:0 0 18px;padding:18px;border-radius:14px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.09);}" + + ".lu-cart-row{display:flex;align-items:center;justify-content:space-between;color:#e6e6ea;font-size:14px;}" + + ".lu-cart-line{height:1px;background:rgba(255,255,255,.10);margin:14px 0;}" + + ".lu-cart-total{font-weight:800;}" + + ".lu-cart-total span:last-child{font-size:24px;color:#fff;}" + + ".lu-cart-sub{color:#8a8a93;font-size:11.5px;margin-top:6px;}" + + ".lu-terms-label{color:#e6e6ea;font-size:12.5px;font-weight:700;margin:0 0 6px;}" + + ".lu-terms{max-height:150px;overflow-y:auto;padding:12px 14px;border-radius:10px;background:rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.08);color:#9a9aa2;font-size:11.5px;line-height:1.6;}" + + ".lu-terms p{margin:0 0 9px;}.lu-terms p:last-child{margin:0;}" + + ".lu-consent{margin:16px 0 4px;}" + + ".lu-check{display:flex;gap:10px;align-items:flex-start;cursor:pointer;}" + + ".lu-check input{margin-top:2px;width:16px;height:16px;flex:0 0 auto;accent-color:#4dc5ff;cursor:pointer;}" + + ".lu-consent-text{color:#9a9aa2;font-size:11.5px;line-height:1.5;}" + + ".lu-form-err{color:#ff6b61;font-size:12.5px;min-height:16px;margin:6px 0;}" + + ".lu-err{color:#ff6b61;font-size:11.5px;margin-top:4px;min-height:14px;}" + + ".lu-submit{display:block;width:100%;margin-top:8px;padding:14px 24px;border:0;border-radius:12px;color:#fff;font-size:15px;font-weight:700;font-family:inherit;cursor:pointer;text-align:center;text-decoration:none;box-sizing:border-box;background:linear-gradient(90deg,#ff9321,#4dc5ff);box-shadow:0 10px 25px rgba(0,0,0,.3);}" + + ".lu-submit:disabled{opacity:.6;cursor:default;}" + + ".lu-link-btn{margin-top:14px;}" + + ".lu-demo-flag{display:inline-block;margin:0 0 14px;padding:5px 12px;border-radius:999px;background:rgba(77,197,255,.14);border:1px solid rgba(77,197,255,.35);color:#8fd6ff;font-size:11.5px;font-weight:700;}" + + ".lu-celebrate{font-size:44px;text-align:center;margin:4px 0 10px;}" + + ".lu-fine{margin:12px 0 0;text-align:center;color:#6f6f78;font-size:11px;}" + + "@media(max-width:560px){.lu-modal{padding:22px 18px;}.lu-grid{grid-template-columns:1fr;}}"; + + function injectCss() { + if (document.getElementById("lu-checkout-css")) return; + var s = document.createElement("style"); + s.id = "lu-checkout-css"; + s.textContent = CSS; + document.head.appendChild(s); + } + + function build() { + var el = document.createElement("div"); + el.className = "lu-overlay"; + el.setAttribute("hidden", ""); + el.innerHTML = + '"; + el.addEventListener("click", function (e) { if (e.target === el) close(); }); + el.querySelector(".lu-close").addEventListener("click", close); + document.body.appendChild(el); + body = el.querySelector(".lu-body"); + return el; + } + + function open(btn) { + injectCss(); + if (!modal) modal = build(); + activeBtn = btn; + lastFocused = document.activeElement; + // keep prior entries if reopened; read the plan off the clicked button + state = { step: "form", values: state.values, plan: btn.getAttribute("data-plan") }; + modal.removeAttribute("hidden"); + document.body.style.overflow = "hidden"; + renderForm(); + document.addEventListener("keydown", onKeydown, true); + } + + function close() { + if (!modal || modal.hasAttribute("hidden")) return; + modal.setAttribute("hidden", ""); + document.body.style.overflow = ""; + document.removeEventListener("keydown", onKeydown, true); + if (lastFocused && lastFocused.focus) lastFocused.focus(); + activeBtn = null; + } + + function onKeydown(e) { + if (e.key === "Escape") { close(); return; } + if (e.key !== "Tab") return; + var f = modal.querySelectorAll("button, input, select, textarea, a[href]"); + var list = []; + for (var i = 0; i < f.length; i++) if (!f[i].disabled && f[i].offsetParent !== null) list.push(f[i]); + if (!list.length) return; + var firstEl = list[0], lastEl = list[list.length - 1]; + if (e.shiftKey && document.activeElement === firstEl) { e.preventDefault(); lastEl.focus(); } + else if (!e.shiftKey && document.activeElement === lastEl) { e.preventDefault(); firstEl.focus(); } + } + + // Re-enable a stuck button after a bfcache restore (e.g. back from Stripe). + window.addEventListener("pageshow", function (e) { + if (e.persisted && body) { var b = body.querySelector(".lu-submit"); if (b) { b.disabled = false; if (b.dataset.orig) b.textContent = b.dataset.orig; } } + }); + + document.addEventListener( + "click", + function (e) { + var target = e.target; + var btn = target && target.closest ? target.closest(".deal-btn") : null; + if (!btn) return; + e.preventDefault(); + open(btn); + }, + true + ); +})(); diff --git a/public/styles.css b/public/styles.css new file mode 100644 index 0000000..f781f96 --- /dev/null +++ b/public/styles.css @@ -0,0 +1,823 @@ +/* LynkedUp Pro — Cinematic Neon Design System */ + +:root { + --bg: #03060c; + --bg-2: #060c18; + --bg-3: #0a1326; + --ink: #e8f4ff; + --ink-2: #b6c8df; + --muted: rgba(232, 244, 255, 0.55); + --dim: rgba(232, 244, 255, 0.35); + + --cyan: #00d1ff; + --cyan-2: #38e6ff; + --cyan-deep: #0070a0; + --orange: #ff8a1e; + --orange-2: #ffb24d; + --green: #2bd49c; + --violet: #8a6bff; + --magenta: #ff5cf0; + + --glass: rgba(10, 22, 40, 0.55); + --glass-2: rgba(10, 22, 40, 0.35); + --border: rgba(0, 209, 255, 0.18); + --border-strong: rgba(0, 209, 255, 0.42); + + --r-sm: 10px; + --r-md: 14px; + --r-lg: 22px; + --r-xl: 32px; + + --shadow-cyan: 0 0 0 1px rgba(0, 209, 255, 0.25), 0 12px 60px -10px rgba(0, 209, 255, 0.45); + --shadow-cyan-soft: 0 0 0 1px rgba(0, 209, 255, 0.12), 0 18px 80px -20px rgba(0, 209, 255, 0.35); + + --font-display: "Space Grotesk", "Satoshi", "Inter", system-ui, sans-serif; + --font-body: "Inter", system-ui, sans-serif; + --font-mono: "JetBrains Mono", ui-monospace, monospace; +} + +* { box-sizing: border-box; } + +html, body { + margin: 0; + padding: 0; + background: var(--bg); + color: var(--ink); + font-family: var(--font-body); + font-feature-settings: "ss01", "cv11"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow-x: hidden; +} + +/* Page-wide animated backdrop --------------------------------- */ +.app { + position: relative; + isolation: isolate; + overflow: hidden; + min-height: 100vh; +} + +/* Floor + ceiling grid + ambient radial */ +.bg-layer { + position: fixed; + inset: 0; + z-index: -2; + pointer-events: none; + background: + radial-gradient(900px 600px at 18% -10%, rgba(0, 130, 200, 0.28), transparent 60%), + radial-gradient(1100px 700px at 95% 10%, rgba(120, 60, 255, 0.18), transparent 65%), + radial-gradient(800px 500px at 50% 120%, rgba(0, 209, 255, 0.18), transparent 60%), + linear-gradient(180deg, #03060c 0%, #04081a 50%, #03060c 100%); +} + +.bg-grid { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + background-image: + linear-gradient(rgba(0, 209, 255, 0.06) 1px, transparent 1px), + linear-gradient(90deg, rgba(0, 209, 255, 0.06) 1px, transparent 1px); + background-size: 60px 60px; + mask-image: radial-gradient(ellipse 100% 70% at 50% 30%, #000 30%, transparent 80%); + animation: gridPan 60s linear infinite; +} + +@keyframes gridPan { + to { background-position: 60px 60px; } +} + +/* Mouse-follow spotlight */ +.cursor-glow { + position: fixed; + z-index: 0; + width: 520px; + height: 520px; + border-radius: 50%; + pointer-events: none; + background: radial-gradient(circle, rgba(0, 209, 255, 0.18), rgba(0, 209, 255, 0) 60%); + transform: translate(-50%, -50%); + mix-blend-mode: screen; + transition: opacity 0.4s ease; + opacity: 0.9; +} + +/* Floating particles */ +.particles { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; +} +.particle { + position: absolute; + width: 2px; height: 2px; + background: var(--cyan); + border-radius: 50%; + box-shadow: 0 0 8px var(--cyan), 0 0 18px rgba(0, 209, 255, 0.6); + opacity: 0.5; + animation: floatUp linear infinite; +} +@keyframes floatUp { + 0% { transform: translateY(0) translateX(0); opacity: 0; } + 10% { opacity: 0.7; } + 90% { opacity: 0.7; } + 100% { transform: translateY(-110vh) translateX(40px); opacity: 0; } +} + +/* Typography ---------------------------------------------------- */ +h1, h2, h3, h4 { + font-family: var(--font-display); + margin: 0; + letter-spacing: -0.02em; + font-weight: 600; +} + +.eyebrow { + display: inline-flex; + align-items: center; + gap: 8px; + font-family: var(--font-mono); + text-transform: uppercase; + letter-spacing: 0.22em; + font-size: 11px; + color: var(--cyan-2); + padding: 6px 12px; + border: 1px solid var(--border); + border-radius: 999px; + background: rgba(0, 209, 255, 0.05); + backdrop-filter: blur(8px); +} +.eyebrow .dot { + width: 6px; height: 6px; + background: var(--cyan); + border-radius: 50%; + box-shadow: 0 0 10px var(--cyan); + animation: pulse 1.6s ease-in-out infinite; +} +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.35; } +} + +.h-display { + font-size: clamp(48px, 7vw, 96px); + line-height: 0.96; + letter-spacing: -0.035em; + font-weight: 600; +} +.h-display .accent { color: var(--cyan); } +.h-display .grad { + background: linear-gradient(180deg, #ffffff 0%, #c1e8ff 60%, #5fc8ff 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} +.h-display .underline { + position: relative; + display: inline-block; + color: var(--cyan); +} +.h-display .underline::after { + content: ""; + position: absolute; + left: 0; right: 0; + bottom: 0.05em; + height: 4px; + background: linear-gradient(90deg, transparent, var(--cyan), transparent); + box-shadow: 0 0 18px var(--cyan); +} + +.h-section { + font-size: clamp(38px, 5vw, 68px); + line-height: 1; + letter-spacing: -0.03em; +} +.h-section .accent { color: var(--cyan); } +.h-card { + font-size: 20px; + line-height: 1.15; + font-weight: 600; +} +.sub { + color: var(--ink-2); + font-size: 17px; + line-height: 1.55; + max-width: 56ch; +} + +/* Layout -------------------------------------------------------- */ +.shell { + max-width: 1400px; + margin: 0 auto; + padding: 0 48px; +} +@media (max-width: 700px) { + .shell { padding: 0 22px; } +} + +section.section { + position: relative; + padding: 140px 0; +} +section.section.tight { padding: 90px 0; } + +/* Section divider beam */ +.beam { + position: absolute; + left: 50%; + transform: translateX(-50%); + width: min(1100px, 80%); + height: 1px; + background: linear-gradient(90deg, transparent, rgba(0, 209, 255, 0.6), transparent); + box-shadow: 0 0 30px rgba(0, 209, 255, 0.5); +} +.beam.top { top: 0; } +.beam.bottom { bottom: 0; } + +/* Glass card ----------------------------------------------------- */ +.card { + position: relative; + background: linear-gradient(180deg, rgba(12, 26, 48, 0.7), rgba(6, 14, 28, 0.55)); + border: 1px solid var(--border); + border-radius: var(--r-lg); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + overflow: hidden; + transition: transform 0.4s cubic-bezier(.2,.7,.2,1), border-color 0.3s, box-shadow 0.4s; +} +.card::before { + content: ""; + position: absolute; + inset: 0; + background: radial-gradient( + 400px circle at var(--mx, 50%) var(--my, 0%), + rgba(0, 209, 255, 0.18), + transparent 45% + ); + opacity: 0; + transition: opacity 0.35s; + pointer-events: none; +} +.card:hover::before { opacity: 1; } +.card:hover { + border-color: var(--border-strong); + box-shadow: var(--shadow-cyan-soft); + transform: translateY(-3px); +} + +.card .corner { + position: absolute; + width: 14px; height: 14px; + border: 1px solid var(--cyan); + opacity: 0.7; +} +.card .corner.tl { top: 8px; left: 8px; border-right: 0; border-bottom: 0; } +.card .corner.tr { top: 8px; right: 8px; border-left: 0; border-bottom: 0; } +.card .corner.bl { bottom: 8px; left: 8px; border-right: 0; border-top: 0; } +.card .corner.br { bottom: 8px; right: 8px; border-left: 0; border-top: 0; } + +.card .pad { padding: 28px; } +.card .pad-lg { padding: 36px; } +.card .pad-sm { padding: 18px; } + +/* Buttons ------------------------------------------------------- */ +.btn { + display: inline-flex; + align-items: center; + gap: 10px; + height: 52px; + padding: 0 26px; + border-radius: 999px; + font-family: var(--font-display); + font-weight: 600; + font-size: 15px; + letter-spacing: -0.005em; + border: 1px solid transparent; + cursor: pointer; + position: relative; + overflow: hidden; + transition: transform 0.2s, box-shadow 0.3s, background 0.3s, border-color 0.3s; + text-decoration: none; + color: inherit; +} + +.btn-primary { + background: linear-gradient(180deg, #00d1ff 0%, #0094c8 100%); + color: #001520; + box-shadow: + 0 0 0 1px rgba(0, 209, 255, 0.6) inset, + 0 12px 30px -10px rgba(0, 209, 255, 0.7), + 0 0 60px -10px rgba(0, 209, 255, 0.55); +} +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: + 0 0 0 1px rgba(0, 209, 255, 0.9) inset, + 0 18px 40px -10px rgba(0, 209, 255, 0.9), + 0 0 80px -8px rgba(0, 209, 255, 0.7); +} + +.btn-orange { + background: linear-gradient(180deg, #ffb24d 0%, #ff7a00 100%); + color: #1a0800; + box-shadow: + 0 0 0 1px rgba(255, 138, 30, 0.6) inset, + 0 12px 30px -10px rgba(255, 138, 30, 0.7), + 0 0 60px -10px rgba(255, 138, 30, 0.55); +} +.btn-orange:hover { + transform: translateY(-2px); + box-shadow: + 0 0 0 1px rgba(255, 138, 30, 0.9) inset, + 0 18px 40px -10px rgba(255, 138, 30, 0.9), + 0 0 80px -8px rgba(255, 138, 30, 0.7); +} + +.btn-ghost { + background: rgba(10, 22, 40, 0.5); + border-color: var(--border); + color: var(--ink); + backdrop-filter: blur(8px); +} +.btn-ghost:hover { + border-color: var(--border-strong); + background: rgba(0, 209, 255, 0.08); + box-shadow: 0 0 0 1px var(--border-strong), 0 0 30px -8px var(--cyan); +} + +.btn .arrow { + display: inline-block; + transition: transform 0.25s ease; +} +.btn:hover .arrow { transform: translateX(4px); } + +/* Pill / Chip --------------------------------------------------- */ +.chip { + display: inline-flex; + align-items: center; + gap: 6px; + height: 26px; + padding: 0 10px; + font-family: var(--font-mono); + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.16em; + border-radius: 999px; + border: 1px solid var(--border); + background: rgba(0, 209, 255, 0.06); + color: var(--cyan-2); +} +.chip.orange { + border-color: rgba(255, 138, 30, 0.35); + background: rgba(255, 138, 30, 0.08); + color: var(--orange-2); +} +.chip.green { + border-color: rgba(43, 212, 156, 0.3); + background: rgba(43, 212, 156, 0.08); + color: var(--green); +} + +/* Reveal animation (scroll trigger) ----------------------------- */ +.reveal { + opacity: 0; + transform: translateY(28px); + transition: opacity 0.9s cubic-bezier(.2,.7,.2,1), transform 0.9s cubic-bezier(.2,.7,.2,1); +} +.reveal.in { + opacity: 1; + transform: none; +} +.reveal.delay-1 { transition-delay: 0.08s; } +.reveal.delay-2 { transition-delay: 0.16s; } +.reveal.delay-3 { transition-delay: 0.24s; } +.reveal.delay-4 { transition-delay: 0.32s; } +.reveal.delay-5 { transition-delay: 0.4s; } + +/* Helpers ------------------------------------------------------- */ +.row { display: flex; align-items: center; } +.gap-8 { gap: 8px; } +.gap-12 { gap: 12px; } +.gap-16 { gap: 16px; } +.gap-24 { gap: 24px; } +.muted { color: var(--muted); } +.dim { color: var(--dim); } +.mono { font-family: var(--font-mono); } +.tabular { font-variant-numeric: tabular-nums; } + +/* Glow rings */ +.ring-glow { + position: absolute; + border-radius: 50%; + filter: blur(60px); + opacity: 0.5; + pointer-events: none; +} + +/* Animated counter dot */ +.live-dot { + width: 8px; height: 8px; border-radius: 50%; + background: var(--green); + box-shadow: 0 0 10px var(--green); + animation: pulse 1.4s ease-in-out infinite; + display: inline-block; +} + +/* Wireframe line drawing */ +@keyframes drawIn { + to { stroke-dashoffset: 0; } +} +.wf-line { + stroke: var(--cyan); + fill: none; + stroke-width: 1.5; + filter: drop-shadow(0 0 6px rgba(0, 209, 255, 0.7)); +} + +/* Marquee tape */ +.marquee { + overflow: hidden; + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + padding: 18px 0; + background: rgba(0, 209, 255, 0.03); +} +.marquee-track { + display: flex; + gap: 64px; + width: max-content; + animation: scroll 38s linear infinite; + font-family: var(--font-mono); + font-size: 13px; + letter-spacing: 0.2em; + color: var(--muted); + text-transform: uppercase; +} +.marquee-track span.sep { color: var(--cyan); } +@keyframes scroll { + from { transform: translateX(0); } + to { transform: translateX(-50%); } +} + +/* Generic micro-bar (mini chart) */ +.spark { + display: flex; + align-items: flex-end; + gap: 3px; + height: 32px; +} +.spark span { + flex: 1; + background: linear-gradient(180deg, var(--cyan), transparent); + border-radius: 2px; + opacity: 0.85; +} + +/* Section title block */ +.section-head { + display: flex; + flex-direction: column; + gap: 18px; + margin-bottom: 64px; + max-width: 800px; +} + +/* Two-column split */ +.split { + display: grid; + grid-template-columns: 1fr 1.15fr; + gap: 80px; + align-items: center; +} +@media (max-width: 1024px) { + .split { grid-template-columns: 1fr; gap: 50px; } +} + +/* Scroll progress bar */ +.scroll-progress { + position: fixed; + top: 0; left: 0; + height: 2px; + width: 0%; + background: linear-gradient(90deg, var(--cyan), var(--orange)); + z-index: 100; + box-shadow: 0 0 14px var(--cyan); + transition: width 0.05s; +} + +/* Selection */ +::selection { + background: rgba(0, 209, 255, 0.35); + color: white; +} + +/* Scrollbar */ +::-webkit-scrollbar { width: 10px; } +::-webkit-scrollbar-track { background: var(--bg); } +::-webkit-scrollbar-thumb { + background: linear-gradient(180deg, var(--cyan-deep), #1a3a5a); + border-radius: 10px; +} + +/* ============================================================ */ +/* EDITORIAL / BLUEPRINT CHROME — v2 enhancements */ +/* ============================================================ */ + +/* Section frame with architectural dimension corners */ +.frame { + position: relative; + padding: 60px 56px; + border: 1px solid var(--border); + border-radius: 24px; + background: + radial-gradient(800px 400px at 30% -10%, rgba(0,209,255,0.08), transparent 70%), + linear-gradient(180deg, rgba(6,12,24,0.55), rgba(2,6,14,0.35)); + backdrop-filter: blur(6px); +} +.frame-tight { padding: 36px 36px; } + +/* Engineering corner ticks — drawn with conic + line gradients */ +.frame::before, .frame::after, +.frame-corners > .ct { + position: absolute; + width: 28px; height: 28px; + border-color: var(--cyan); + pointer-events: none; +} + +/* Blueprint dimension marker (tl/tr/bl/br) — draws an L-shape with ticks */ +.dim-corner { + position: absolute; + width: 36px; + height: 36px; + pointer-events: none; +} +.dim-corner svg { width: 100%; height: 100%; display: block; overflow: visible; } +.dim-corner.tl { top: -10px; left: -10px; } +.dim-corner.tr { top: -10px; right: -10px; transform: scaleX(-1); } +.dim-corner.bl { bottom: -10px; left: -10px; transform: scaleY(-1); } +.dim-corner.br { bottom: -10px; right: -10px; transform: scale(-1, -1); } + +/* Section number — oversized mono */ +.section-number { + font-family: var(--font-mono); + font-size: 13px; + letter-spacing: 0.32em; + color: var(--cyan-2); + display: inline-flex; + align-items: center; + gap: 12px; +} +.section-number .num { + font-family: var(--font-display); + font-weight: 700; + font-size: 13px; + color: var(--cyan); + text-shadow: 0 0 12px rgba(0, 209, 255, 0.6); +} +.section-number::before { + content: ""; + width: 36px; + height: 1px; + background: linear-gradient(90deg, var(--cyan), transparent); + display: inline-block; +} + +/* Vertical mono label running down the page edge */ +.vrail { + position: absolute; + left: -8px; + top: 0; + bottom: 0; + width: 1px; + background: linear-gradient(180deg, transparent, var(--border), transparent); +} +.vrail-label { + position: absolute; + writing-mode: vertical-rl; + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.28em; + color: var(--muted); + text-transform: uppercase; + top: 30%; + left: -22px; + transform: rotate(180deg); +} + +/* Editorial display type — even larger, tighter */ +.h-mega { + font-family: var(--font-display); + font-size: clamp(64px, 9.5vw, 148px); + line-height: 0.88; + letter-spacing: -0.045em; + font-weight: 600; + text-wrap: balance; +} +.h-mega .grad { + background: linear-gradient(180deg, #ffffff 0%, #c1e8ff 55%, #5fc8ff 100%); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} +.h-mega .accent { color: var(--cyan); } +.h-mega .orange { color: var(--orange); } +.h-mega .outline { + -webkit-text-stroke: 1.2px var(--cyan); + color: transparent; + text-shadow: 0 0 30px rgba(0,209,255,0.35); +} +.h-mega .ital { + font-style: italic; + font-weight: 400; +} + +/* Mono dimension marker tag (e.g. "18'-7"") */ +.dim-tag { + display: inline-flex; + align-items: center; + gap: 8px; + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.18em; + color: var(--cyan-2); + padding: 4px 10px; + border: 1px dashed rgba(0, 209, 255, 0.45); + border-radius: 4px; + background: rgba(0, 209, 255, 0.04); +} + +/* Engineering tick line — used as section dividers */ +.tick-line { + height: 18px; + background-image: + repeating-linear-gradient(90deg, + var(--cyan) 0 1px, transparent 1px 24px); + mask-image: linear-gradient(180deg, var(--cyan) 0 60%, transparent 60%); + opacity: 0.45; +} + +/* Blueprint dimension callout used inside frames */ +.dim-callout { + position: absolute; + display: flex; + align-items: center; + gap: 6px; + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.16em; + color: var(--cyan-2); + background: rgba(2, 6, 14, 0.85); + padding: 3px 8px; + border-radius: 3px; + border: 1px solid rgba(0, 209, 255, 0.3); + white-space: nowrap; +} + +/* "Plate" badge — used for product spec labels */ +.plate { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: 6px; + background: rgba(4, 12, 24, 0.65); + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--ink-2); +} +.plate .pnum { + color: var(--cyan); + font-weight: 600; +} + +/* Floating system status pill (sticky) */ +.sys-pill { + position: fixed; + bottom: 22px; right: 22px; + z-index: 40; + padding: 10px 16px; + background: rgba(2, 6, 14, 0.85); + border: 1px solid var(--border); + border-radius: 999px; + backdrop-filter: blur(10px); + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.18em; + color: var(--ink-2); + display: flex; + align-items: center; + gap: 10px; + box-shadow: 0 12px 30px -10px rgba(0,209,255,0.35); +} +.sys-pill .dot { + width: 7px; height: 7px; + border-radius: 50%; + background: var(--green); + box-shadow: 0 0 10px var(--green); + animation: pulse 1.4s ease-in-out infinite; +} + +/* Section head v2 — split into rail + content */ +.shead { + display: grid; + grid-template-columns: 220px 1fr; + gap: 60px; + margin-bottom: 80px; + align-items: start; +} +.shead .rail { + position: sticky; + top: 100px; + display: flex; + flex-direction: column; + gap: 14px; +} +.shead .rail .num-big { + font-family: var(--font-display); + font-weight: 600; + font-size: 80px; + line-height: 1; + letter-spacing: -0.03em; + background: linear-gradient(180deg, #00d1ff, rgba(0, 209, 255, 0.15)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} +.shead .rail .tag { + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.28em; + color: var(--muted); + text-transform: uppercase; +} +.shead .rail .ticks { + width: 80px; + height: 8px; + background-image: repeating-linear-gradient(90deg, var(--cyan) 0 1px, transparent 1px 9px); + opacity: 0.6; +} +@media (max-width: 900px) { + .shead { grid-template-columns: 1fr; gap: 18px; margin-bottom: 50px; } + .shead .rail { position: static; } + .shead .rail .num-big { font-size: 54px; } +} + +/* "Ledger" / spec list */ +.ledger { + display: grid; + grid-template-columns: 1fr; + gap: 0; + border-top: 1px solid var(--border); +} +.ledger > .row { + display: grid; + grid-template-columns: 60px 1fr auto; + align-items: center; + gap: 24px; + padding: 22px 0; + border-bottom: 1px solid var(--border); + transition: background 0.25s, border-color 0.25s; +} +.ledger > .row:hover { + background: rgba(0, 209, 255, 0.03); + border-bottom-color: var(--border-strong); +} +.ledger > .row .lnum { + font-family: var(--font-mono); + font-size: 12px; + letter-spacing: 0.18em; + color: var(--cyan-2); +} + +/* Hero specific tweaks (v2) */ +.hero-frame { + position: relative; + padding: 100px 56px; + border: 1px solid var(--border); + border-radius: 28px; + background: + radial-gradient(700px 400px at 20% 0%, rgba(0,130,200,0.18), transparent 60%), + radial-gradient(900px 600px at 100% 100%, rgba(0,209,255,0.12), transparent 65%), + linear-gradient(180deg, rgba(4, 10, 22, 0.5), rgba(2, 6, 14, 0.2)); + overflow: hidden; +} +@media (max-width: 900px) { + .hero-frame { padding: 60px 24px; } +} + +/* Sharper card variant (for editorial sections) */ +.card-sharp { + background: linear-gradient(180deg, rgba(8, 18, 36, 0.8), rgba(2, 8, 18, 0.7)); + border: 1px solid var(--border); + border-radius: 14px; + position: relative; +} +.card-sharp.no-radius { + border-radius: 4px; +} diff --git a/public/thanks.html b/public/thanks.html new file mode 100644 index 0000000..dbd6fa4 --- /dev/null +++ b/public/thanks.html @@ -0,0 +1,110 @@ + + + + + + Welcome to LynkedUp Pro — you're a Founding Member + + + + + + + +
+
+ 🎉 You're a Founding Member +

Payment received — welcome to LynkedUp Pro

+

+ Your Founders Lifetime License is locked in at the founder price. A confirmation + email is on its way, and our onboarding team will reach out shortly to get your + account set up. +

+ + +
+
1Check your inbox. Your receipt and a welcome email with next steps are on the way. (Peek in spam if you don't see them in a few minutes.)
+
2We'll set you up. Our team will contact you at the details you provided to activate your license and walk you through onboarding.
+
3Watch for launch updates. As a Founding Member you'll hear first about new features and your rollout timeline.
+
+ + Close + +

+ Questions? Email support@lynkeduppro.com and reference your order below. +

+

+
+ + + + diff --git a/public/ui.jsx b/public/ui.jsx new file mode 100644 index 0000000..f9ab97f --- /dev/null +++ b/public/ui.jsx @@ -0,0 +1,431 @@ +/* global React */ +// Shared UI primitives for LynkedUp Pro + +const { useEffect, useRef, useState } = React; + +// ---------- Hex logo (matches flyer mark) ---------- +function Logo({ size = 90 }) { + return ( +
+ LynkedUp Pro + +
+ ); +} + +// ---------- Counter that animates on view ---------- +function Counter({ to, suffix = "", prefix = "", duration = 1800, decimals = 0 }) { + const ref = useRef(null); + const [val, setVal] = useState(0); + useEffect(() => { + const el = ref.current; + if (!el) return; + const obs = new IntersectionObserver((entries) => { + entries.forEach(e => { + if (e.isIntersecting) { + const start = performance.now(); + const tick = (now) => { + const t = Math.min(1, (now - start) / duration); + const ease = 1 - Math.pow(1 - t, 3); + setVal(to * ease); + if (t < 1) requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + obs.disconnect(); + } + }); + }, { threshold: 0.3 }); + obs.observe(el); + return () => obs.disconnect(); + }, [to]); + const formatted = decimals + ? val.toFixed(decimals) + : Math.round(val).toLocaleString(); + return {prefix}{formatted}{suffix}; +} + +// ---------- Reveal-on-scroll wrapper ---------- +function Reveal({ children, delay = 0, className = "", as: As = "div", style = {} }) { + const ref = useRef(null); + useEffect(() => { + const el = ref.current; + if (!el) return; + const obs = new IntersectionObserver((entries) => { + entries.forEach(e => { + if (e.isIntersecting) { + el.classList.add("in"); + obs.unobserve(el); + } + }); + }, { threshold: 0.12, rootMargin: "0px 0px -60px 0px" }); + obs.observe(el); + return () => obs.disconnect(); + }, []); + const delayCls = delay ? ` delay-${delay}` : ""; + return ( + + {children} + + ); +} + +// ---------- Card with mouse-tracking glow ---------- +function GlowCard({ children, className = "", style = {}, onClick }) { + const ref = useRef(null); + const handle = (e) => { + const el = ref.current; + if (!el) return; + const r = el.getBoundingClientRect(); + el.style.setProperty("--mx", `${e.clientX - r.left}px`); + el.style.setProperty("--my", `${e.clientY - r.top}px`); + }; + return ( +
+ + + + + {children} +
+ ); +} + +// ---------- Wireframe Blueprint House (SVG, animated drawing) ---------- +function BlueprintHouse({ size = 600, animate = true, withMeasurements = true, withScan = true }) { + // viewBox 600x460 + const dash = animate ? { strokeDasharray: 1400, strokeDashoffset: 1400, animation: "drawIn 4s ease-out forwards" } : {}; + return ( + + + + + + + + + + + + + + + + {/* Floor grid */} + + + + + {/* House outline - two-gable */} + + {/* Main body */} + + {/* Right side smaller gable */} + + {/* Roof ridge */} + + + {/* Chimney */} + + {/* Door */} + + + {/* Windows */} + + + + + + + + + + {/* Roof structure lines */} + + + + + {/* Measurements */} + {withMeasurements && ( + + + + 18′-7″ + + + + 12′-3″ + + + + 15′-4″ + + + + 8′-0″ + + + )} + + {/* Corner markers */} + + {[[60,200],[210,90],[360,200],[450,180],[540,240]].map(([x,y],i) => ( + + + + + + + + ))} + + + {/* AI scan line */} + {withScan && ( + + + + + )} + + ); +} + +// ---------- Tiny chart components ---------- +function Sparkline({ data, color = "#00d1ff", height = 36, width = 120 }) { + const max = Math.max(...data), min = Math.min(...data); + const range = max - min || 1; + const stepX = width / (data.length - 1); + const pts = data.map((v, i) => `${i * stepX},${height - ((v - min) / range) * height}`).join(" "); + const area = `0,${height} ${pts} ${width},${height}`; + return ( + + + + + + + + + + + ); +} + +function DonutChart({ size = 120, stroke = 12, segments }) { + // segments: [{value, color}] + const r = (size - stroke) / 2; + const c = 2 * Math.PI * r; + const total = segments.reduce((s, x) => s + x.value, 0); + let offset = 0; + return ( + + + {segments.map((s, i) => { + const len = (s.value / total) * c; + const el = ( + + ); + offset += len; + return el; + })} + + ); +} + +// ---------- Icon set (line, glowing) ---------- +const Icon = ({ name, size = 22, stroke = "#7be8ff" }) => { + const props = { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke, strokeWidth: 1.6, strokeLinecap: "round", strokeLinejoin: "round", style: { filter: `drop-shadow(0 0 6px ${stroke}55)` } }; + switch (name) { + case "ai": + return ; + case "calendar": + return ; + case "crew": + return ; + case "fleet": + return ; + case "budget": + return ; + case "report": + return ; + case "chat": + return ; + case "field": + return ; + case "shield": + return ; + case "clock": + return ; + case "target": + return ; + case "growth": + return ; + case "bell": + return ; + case "pin": + return ; + case "sync": + return ; + case "brain": + return ; + case "doc": + return ; + case "camera": + return ; + case "hammer": + return ; + case "lead": + return ; + case "money": + return ; + case "spark": + return ; + case "arrow": + return ; + case "play": + return ; + default: + return ; + } +}; + +// ---------- Dimension corner brackets (blueprint chrome) ---------- +function DimCorner({ pos = "tl" }) { + return ( +
+ + + + + + +
+ ); +} + +// ---------- Dimension line (engineering measurement) ---------- +function DimLine({ orientation = "h", label, length = "100%", offset = 0, side = "top" }) { + const isH = orientation === "h"; + return ( +
+ + {isH ? ( + <> + + + + + ) : ( + <> + + + + + )} + + {label && ( + {label} + )} +
+ ); +} + +// ---------- SectionFrame: standard architectural-framed section ---------- +function SectionFrame({ children, number, tag, vlabel, id, className = "", style = {} }) { + return ( +
+
+ {vlabel && ( + <> +
+
{vlabel}
+ + )} + {(number || tag) && ( + +
+ {number && ( + + §{number} + {tag} + + )} + // {vlabel || "BUILD MK.07"} +
+
+ )} + {children} +
+
+ ); +} + +// ---------- Section head with rail (number + tag + ticks) ---------- +function SectionHead({ number, tag, title, sub, align = "left" }) { + return ( +
+ +
+ {number} + {tag} +
+
+ +
+ + {typeof title === "string" ?

{title}

: title} +
+ {sub && ( + +

{sub}

+
+ )} +
+
+ ); +} + +// Export to window for cross-script access +Object.assign(window, { Logo, Counter, Reveal, GlowCard, BlueprintHouse, Sparkline, DonutChart, Icon, DimCorner, DimLine, SectionFrame, SectionHead }); diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM (1).jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM (1).jpeg new file mode 100644 index 0000000..acdc781 Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM (1).jpeg differ diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM.jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM.jpeg new file mode 100644 index 0000000..f6595d9 Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.42 AM.jpeg differ diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (1).jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (1).jpeg new file mode 100644 index 0000000..189d95f Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (1).jpeg differ diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (2).jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (2).jpeg new file mode 100644 index 0000000..217d7d4 Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (2).jpeg differ diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (3).jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (3).jpeg new file mode 100644 index 0000000..b80c186 Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM (3).jpeg differ diff --git a/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM.jpeg b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM.jpeg new file mode 100644 index 0000000..7a5290e Binary files /dev/null and b/public/uploads/WhatsApp Image 2026-05-26 at 6.52.43 AM.jpeg differ diff --git a/public/uploads/lynkedup-logo.png b/public/uploads/lynkedup-logo.png new file mode 100644 index 0000000..0458027 Binary files /dev/null and b/public/uploads/lynkedup-logo.png differ