1<!DOCTYPE html> 2<html lang="en-GB"> 3 <head> 4
4<script> 5 (function () { 6 var proto = XMLHttpRequest.prototype; 7 var open = proto.open, setRequestHeader = proto.setRequestHeader, send = proto.send; 8 var TOKEN_KEY = 'base44_access_token'; 9 var storedTokenHeader = function () { 10 try { return 'Bearer ' + localStorage.getItem(TOKEN_KEY); } catch (e) { return null; } 11 }; 12 var forgetStoredToken = function () { 13 try { localStorage.removeItem(TOKEN_KEY); localStorage.removeItem('token'); } catch (e) {} 14 }; 15 16 proto.open = function (method, url) { 17 this.__b44IsAuthCheck = /\/entities\/User\/me(\?|$)/.test(url); 18 return open.apply(this, arguments); 19 }; 20 21 proto.setRequestHeader = function (name, value) { 22 if (this.__b44IsAuthCheck && name.toLowerCase() === 'authorization' && value === storedTokenHeader()) { 23 this.__b44SentToken = value; 24 } 25 return setRequestHeader.call(this, name, value); 26 }; 27 28 proto.send = function () { 29 this.addEventListener('loadend', function () { 30 var rejectedTokenStillStored = this.status === 401 && this.__b44SentToken === storedTokenHeader(); 31 if (rejectedTokenStillStored) forgetStoredToken(); 32 }); 33 return send.apply(this, arguments); 34 }; 35})(); 36 </script>
36 37 <meta charset="utf-8"/> 38 <meta content="width=device-width, initial-scale=1.0" name="viewport"/> 39 <!-- Primary Meta Tags --> 40 <title> 41 VisibleData 42 </title> 43 <meta content="VisibleData | UK Data Visualisation, Dashboard Builder & Analytics Platform" name="title"/> 44 <meta content="VisibleData manages 5 data types including dashboards. Helps you organize, track, and share your work in 1 place for teams and solo users." name="description"/> 45 <meta content="data visualisation, dashboard builder, analytics platform, UK data analytics, business intelligence, data visualization UK, BI tools, real-time analytics, data dashboards, KPI dashboard, reporting tools, data insights, chart builder, interactive dashboards" name="keywords"/> 46 <meta content="VisibleData" name="author"/> 47 <meta content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" name="robots"/> 48 <!-- Open Graph / Facebook --> 49 <meta content="website" property="og:type"/> 50 <meta content="https://visibledata.co.uk" property="og:url"/> 51 <meta content="VisibleData" property="og:title"/> 52 <meta content="VisibleData manages 5 data types including dashboards. Helps you organize, track, and share your work in 1 place for teams and solo users." property="og:description"/> 53 <meta content="VisibleData" property="og:site_name"/> 54 <meta content="en_GB" property="og:locale"/> 55 <!-- Twitter --> 56 <meta content="summary_large_image" property="twitter:card"/> 57 <meta content="https://visibledata.co.uk" property="twitter:url"/> 58 <meta content="VisibleData" property="twitter:title"/> 59 <meta content="VisibleData manages 5 data types including dashboards. Helps you organize, track, and share your work in 1 place for teams and solo users." property="twitter:description"/> 60 <!-- Geo Tags --> 61 <meta content="GB" name="geo.region"/> 62 <meta content="London" name="geo.placename"/> 63 <!-- Structured Data - Organization --> 64
64<script type="application/ld+json"> 65 { 66 "@context": "https://schema.org", 67 "@type": "Organization", 68 "name": "VisibleData", 69 "url": "https://visibledata.co.uk", 70 "description": "UK's leading data visualisation, dashboard builder, and analytics platform.", 71 "address": { 72 "@type": "PostalAddress", 73 "addressCountry": "GB", 74 "addressLocality": "London" 75 }, 76 "contactPoint": { 77 "@type": "ContactPoint", 78 "email": "[email protected]", 79 "contactType": "customer service" 80 } 81 } 82 </script>
82 83 <!-- Structured Data - WebSite --> 84
84<script type="application/ld+json"> 85 { 86 "@context": "https://schema.org", 87 "@type": "WebSite", 88 "name": "VisibleData", 89 "url": "https://visibledata.co.uk", 90 "description": "Data Visualisation, Dashboard Builder & Analytics Platform" 91 } 92 </script>
92 93 <!-- Structured Data - SoftwareApplication --> 94
94<script type="application/ld+json"> 95 { 96 "@context": "https://schema.org", 97 "@type": "SoftwareApplication", 98 "name": "VisibleData", 99 "operatingSystem": "Web", 100 "applicationCategory": "BusinessApplication", 101 "description": "Professional data visualisation and dashboard building platform for UK businesses.", 102 "offers": { 103 "@type": "Offer", 104 "price": "0", 105 "priceCurrency": "GBP", 106 "description": "Free tier available" 107 }, 108 "aggregateRating": { 109 "@type": "AggregateRating", 110 "ratingValue": "4.8", 111 "ratingCount": "1247", 112 "bestRating": "5" 113 } 114 } 115 </script>
115 116 <!-- Structured Data - FAQ --> 117
117<script type="application/ld+json"> 118 { 119 "@context": "https://schema.org", 120 "@type": "FAQPage", 121 "mainEntity": [ 122 { 123 "@type": "Question", 124 "name": "What is VisibleData?", 125 "acceptedAnswer": { 126 "@type": "Answer", 127 "text": "VisibleData is the UK's leading data visualisation and analytics platform. It provides dashboard building, real-time analytics, and 30+ chart types with 200+ data connectors." 128 } 129 }, 130 { 131 "@type": "Question", 132 "name": "Is there a free plan?", 133 "acceptedAnswer": { 134 "@type": "Answer", 135 "text": "Yes! VisibleData offers a generous free tier with 3 dashboards, 5 chart types, and 1,000 data rows. No credit card required." 136 } 137 }, 138 { 139 "@type": "Question", 140 "name": "Where is data stored?", 141 "acceptedAnswer": { 142 "@type": "Answer", 143 "text": "All data is stored in UK-based data centres (London region) with AES-256 encryption. VisibleData is fully GDPR compliant." 144 } 145 } 146 ] 147 } 148 </script>
148 149
149<script crossorigin="" src="/assets/index-DPDaGeFN.js" type="module"> 150 </script>
150 151 <link crossorigin="" href="/assets/index-Bs1s-Xif.css" rel="stylesheet"/> 152
152<script type="module"> 153 if (window.self === window.top) { 154 let lastPath = ""; 155 function getPageNameFromPath(path) { 156 const segments = path.split("/").filter(Boolean); 157 return segments[0] || null; 158 } 159 function trackPageView() { 160 const path = window.location.pathname; 161 if (path === lastPath) return; 162 lastPath = path; 163 const pageName = getPageNameFromPath(path) || "home"; 164 const appId = "6a2a9cfe9e9e7e305f25313d"; 165 if (!appId) return; 166 fetch(`/api/app-logs/${appId}/log-user-in-app/${pageName}`, { 167 method: "POST", 168 }).catch(() => {}); 169 } 170 const originalPushState = history.pushState.bind(history); 171 history.pushState = function (...args) { 172 originalPushState(...args); 173 trackPageView(); 174 }; 175 const originalReplaceState = history.replaceState.bind(history); 176 history.replaceState = function (...args) { 177 originalReplaceState(...args); 178 trackPageView(); 179 }; 180 window.addEventListener("popstate", trackPageView); 181 trackPageView(); 182} 183 </script>
183 184 <meta content="https://media.base44.com/images/public/6a2a9cfe9e9e7e305f25313d/f5f2e9093_logo.png/v1/fill/w_1200,h_630/f5f2e9093_logo.png" property="og:image"/> 185 <meta content="https://media.base44.com/images/public/6a2a9cfe9e9e7e305f25313d/f5f2e9093_logo.png/v1/fill/w_1200,h_630/f5f2e9093_logo.png" name="twitter:image"/> 186
186<script> 187 (function () { 188 var titles = {"/": "VisibleData", "/home": "Home | VisibleData", "/features": "Features | VisibleData", "/dashboards": "Dashboards | VisibleData", "/analytics": "Analytics | VisibleData", "/comparisons": "Comparisons | VisibleData", "/insights": "Insights | VisibleData", "/pricing": "Pricing | VisibleData", "/contact": "Contact | VisibleData", "/about": "About | VisibleData", "/privacy": "Privacy | VisibleData", "/terms": "Terms | VisibleData", "/builder": "Dashboard Builder | VisibleData", "/templates": "Templates | VisibleData", "/compare": "Data Compare | VisibleData", "/alerts": "Alerts | VisibleData", "/login": "Login | VisibleData", "/register": "Register | VisibleData", "/forgot-password": "Forgot Password | VisibleData", "/reset-password": "Reset Password | VisibleData", "/domaingateway": "VisibleData", "/domain-gateway": "VisibleData"}; 189 // PascalCase boundaries -> "-", mirroring _PASCAL_BOUNDARY_RE without lookbehind 190 // (old Safari fails to PARSE a lookbehind, taking the whole script down). 191 var dashed = function (s) { 192 return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2"); 193 }; 194 var decode = function (s) { 195 // A %2F inside ONE segment must not become a structural separator: /blog/foo%2Fbar is a 196 // dynamic slug, and letting it split would match a static /blog/foo/bar and write ITS title. 197 try { var d = decodeURIComponent(s); return d.indexOf("/") < 0 ? d : s; } catch (e) { return s; } 198 }; 199 var segments = function (path) { return path.split("/").filter(Boolean).map(decode); }; 200 var norm = function (path) { 201 var parts = segments(path).map(function (s) { return dashed(s).toLowerCase(); }); 202 return parts.length ? "/" + parts.join("/") : "/"; 203 }; 204 var lastPath = location.pathname, written = document.title, on = true; 205 var sync = function () { 206 // Path only: a hash/query change is the same page, and the SDK strips its own auth 207 // params with replaceState -- neither must clobber a server-rendered title in place. 208 if (!on || location.pathname === lastPath) return; 209 lastPath = location.pathname; 210 if (document.title !== written) { on = false; return; } 211 // Write ONLY a title the map proves. An unmapped path is a dynamic route (/blog/:slug) the 212 // map cannot carry, and writing a placeholder there is destructive, not merely vague: the 213 // prerender worker runs no setUserAgent, so its capture browser reads as human and executes 214 // this script, and coordinator.js's settle wait explicitly tolerates a full navigation -- 215 // a redirect landing on an unmapped path would bake the placeholder into the stored 216 // snapshot. Leaving the title alone degrades to today's behavior instead. 217 // Exact lookup only. A dash-stripped retry here would let a genuinely different /set-up 218 // claim /setup: the map carries a dash-free key only where a PascalCase boundary put the 219 // dashes there, and the client cannot tell the two apart. The map emits every reachable 220 // shape per segment instead (_client_url_variants). 221 var title = titles[norm(location.pathname)]; 222 if (title === undefined) return; 223 document.title = title; 224 // Re-read: the setter stores verbatim but the getter strips and collapses whitespace, so 225 // keeping the assigned string would make the next sync() read our own write as the app's. 226 written = document.title; 227 }; 228 var wrap = function (fn) { 229 // The history entry is already pushed by the time sync() runs, so a throw here would 230 // surface inside the host app's router and break navigation. This is injected into apps 231 // we cannot test, so it swallows rather than trusting the trace. 232 return function () { 233 var r = fn.apply(this, arguments); 234 try { sync(); } catch (e) {} 235 return r; 236 }; 237 }; 238 history.pushState = wrap(history.pushState); 239 history.replaceState = wrap(history.replaceState); 240 window.addEventListener("popstate", sync); 241})(); 242 </script>
242 243 <meta content="yes" name="mobile-web-app-capable"/> 244 <meta content="black" name="apple-mobile-web-app-status-bar-style"/> 245 <meta content="VisibleData" name="apple-mobile-web-app-title"/> 246 <link href="https://visibledata.co.uk" rel="canonical"/> 247
247<script data-seo-source="builder" type="application/ld+json"> 248 {"name": "VisibleData", "@context": "https://schema.org", "@type": "WebSite", "url": "https://visibledata.co.uk"} 249 </script>
249 250
250<script data-seo-source="builder" type="application/ld+json"> 251 {"name": "VisibleData", "logo": "https://media.base44.com/images/public/6a2a9cfe9e9e7e305f25313d/f5f2e9093_logo.png", "@context": "https://schema.org", "@type": "Organization", "url": "https://visibledata.co.uk"} 252 </script>
252 253 </head> 254 <body> 255 <div id="root"> 256 <div data-seo-source="builder" id="seo-snapshot" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;"> 257 <main> 258 <header> 259 <h1> 260 VisibleData 261 </h1> 262 <p> 263 VisibleData manages 5 data types including dashboards. Helps you organize, track, and share your work in 1 place for teams and solo users. 264 </p> 265 </header> 266 <nav aria-label="Pages"> 267 <h2> 268 Pages 269 </h2> 270 <ul> 271 <li> 272 <a href="/home"> 273 Home 274 </a> 275 â Home on VisibleData. VisibleData manages 5 data types including dashboards. 276 </li> 277 <li> 278 <a href="/features"> 279 Features 280 </a> 281 â Features on VisibleData. VisibleData manages 5 data types including dashboards. 282 </li> 283 <li> 284 <a href="/dashboards"> 285 Dashboards 286 </a> 287 â Dashboards on VisibleData. VisibleData manages 5 data types including dashboards. 288 </li> 289 <li> 290 <a href="/analytics"> 291 Analytics 292 </a> 293 â Analytics on VisibleData. VisibleData manages 5 data types including dashboards. 294 </li> 295 <li> 296 <a href="/comparisons"> 297 Comparisons 298 </a> 299 â Comparisons on VisibleData. VisibleData manages 5 data types including dashboards. 300 </li> 301 <li> 302 <a href="/insights"> 303 Insights 304 </a> 305 â Insights on VisibleData. VisibleData manages 5 data types including dashboards. 306 </li> 307 <li> 308 <a href="/pricing"> 309 Pricing 310 </a> 311 â Pricing on VisibleData. VisibleData manages 5 data types including dashboards. 312 </li> 313 <li> 314 <a href="/contact"> 315 Contact 316 </a> 317 â Contact on VisibleData. VisibleData manages 5 data types including dashboards. 318 </li> 319 <li> 320 <a href="/about"> 321 About 322 </a> 323 â About on VisibleData. VisibleData manages 5 data types including dashboards. 324 </li> 325 <li> 326 <a href="/privacy"> 327 Privacy 328 </a> 329 â Privacy on VisibleData. VisibleData manages 5 data types including dashboards. 330 </li> 331 <li> 332 <a href="/terms"> 333 Terms 334 </a> 335 â Terms on VisibleData. VisibleData manages 5 data types including dashboards. 336 </li> 337 <li> 338 <a href="/builder"> 339 Dashboard Builder 340 </a> 341 â Dashboard Builder on VisibleData. VisibleData manages 5 data types including dashboards. 342 </li> 343 <li> 344 <a href="/templates"> 345 Templates 346 </a> 347 â Templates on VisibleData. VisibleData manages 5 data types including dashboards. 348 </li> 349 <li> 350 <a href="/compare"> 351 Data Compare 352 </a> 353 â Data Compare on VisibleData. VisibleData manages 5 data types including dashboards. 354 </li> 355 <li> 356 <a href="/alerts"> 357 Alerts 358 </a> 359 â Alerts on VisibleData. VisibleData manages 5 data types including dashboards. 360 </li> 361 <li> 362 <a href="/login"> 363 Login 364 </a> 365 â Login on VisibleData. VisibleData manages 5 data types including dashboards. 366 </li> 367 <li> 368 <a href="/register"> 369 Register 370 </a> 371 â Register on VisibleData. VisibleData manages 5 data types including dashboards. 372 </li> 373 <li> 374 <a href="/forgot-password"> 375 Forgot Password 376 </a> 377 â Forgot Password on VisibleData. VisibleData manages 5 data types including dashboards. 378 </li> 379 <li> 380 <a href="/reset-password"> 381 Reset Password 382 </a> 383 â Reset Password on VisibleData. VisibleData manages 5 data types including dashboards. 384 </li> 385 </ul> 386 </nav> 387 </main> 388 </div> 389 </div> 390 </body> 391</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.