1<!DOCTYPE html><!-- This site was created in Webflow. https://webflow.com --><!-- Last Published: Wed Sep 09 2026 18:23:24 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="repro-stream-stg2.webflow.io" data-wf-page="6a443ef64756470516b1ad4f" data-wf-site="688dfacb9052b142b766c11a" data-wf-intellimize-customer-id="117565074" lang="en"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Pulsar: hardware-free live encoder for film and TV</title><meta content="Pulsar turns workstations, iPhones and iPads into secure live encoders for RePro. Stream desktop, mobile and 360 sources and replace hardware encoders." name="description"/><meta content="Pulsar: hardware-free live encoder for film and TV" property="og:title"/><meta content="Pulsar turns workstations, iPhones and iPads into secure live encoders for RePro. Stream desktop, mobile and 360 sources and replace hardware encoders." property="og:description"/><meta content="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a998e3ea24dcd7124d9923a_PulsarWebHero-optimised.avif" property="og:image"/><meta content="Pulsar: hardware-free live encoder for film and TV" name="twitter:title"/><meta content="Pulsar turns workstations, iPhones and iPads into secure live encoders for RePro. Stream desktop, mobile and 360 sources and replace hardware encoders." name="twitter:description"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="Webflow" name="generator"/><link href="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/css/repro-stream-stg2.webflow.shared.1bdb9b0ff.css" rel="stylesheet" type="text/css" integrity="sha384-G9ubD/mbd3BWviDvWQ26p4SwULM66oaVtidjcifsY7JybsgzGjVTvFl0PRuZnXHV" crossorigin="anonymous"/><style>html.w-mod-js:not(.w-mod-ix3) :is(.text-5050-quote, .intro-text, .heading-class-footer-cta) {visibility: hidden !important;}</style>
1<script src="https://use.typekit.net/mxq6zai.js" type="text/javascript"></script>
1<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
1<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
1<link href="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68aaeca58ff43bfc91075f44_Favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68aaecb90609ce774c2baf6b_Webclip.png" rel="apple-touch-icon"/>
1<script type="text/javascript">localStorage.removeItem('intellimize_opt_out_117565074'); if (localStorage.getItem('intellimize_data_tracking_type') !== 'always') { localStorage.setItem('intellimize_data_tracking_type', 'always'); }</script>
1<script type="text/javascript">(function(e){var s={r:[]};e.wf={r:s.r,ready:t=>{s.r.push(t)}}})(window)</script>
1<script type="text/javascript">(function(e){var s={p:[],r:[]};e.intellimize={p:s.p,r:s.r,push:function(t){s.p.push(t)},ready:function(t){s.r.push(t)}}})(window)</script>
1<link href="https://cdn.intellimize.co/snippet/117565074.js" rel="preload" as="script"/>
1<script type="text/javascript">var wfClientScript=document.createElement("script");wfClientScript.src="https://cdn.intellimize.co/snippet/117565074.js",wfClientScript.async=!0,wfClientScript.onerror=function(){document.documentElement.className=document.documentElement.className.replace(RegExp(" ?anti-flicker"),"")},document.head.appendChild(wfClientScript);</script>
1<link href="https://api.intellimize.co" rel="preconnect" crossorigin="true"/><link href="https://log.intellimize.co" rel="preconnect" crossorigin="true"/><link href="https://117565074.intellimizeio.com" rel="preconnect"/>
1<script>(function(w,i,g){w[g]=w[g]||[];if(typeof w[g].push=='function')w[g].push.apply(w[g],Array.isArray(i)?i:[i]);})(window,['G-7B1T62KC65'],'google_tags_first_party');</script>
1<script async="" src="/wvxwa3jtwetcNjg4ZGZhY2I5MDUyYjE0MmI3NjZjMTFh/Sq8zW6QqOREJR3HKvGpfnjCR8DM"></script>
1<script type="text/javascript">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('set', 'developer_id.dZGVlNj', true);gtag('set', 'developer_id.dYWYxNW', true);gtag('js', new Date());gtag('config', 'G-7B1T62KC65');</script>
1<!-- Keep this css code to improve the font quality--> 2<style> 3 * { 4 -webkit-font-smoothing: antialiased; 5 -moz-osx-font-smoothing: grayscale; 6 -o-font-smoothing: antialiased; 7} 8.rp2-form_input, input { 9 -webkit-appearance: none; /* For Safari and Chrome */ 10 /* Add other styling as needed */ 11 } 12 13 .w-lightbox-frame, .w-lightbox-embed { 14 width: 90vw !important; 15 height: 90vh !important; 16 } 17</style> 18<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 18-19
18 19<script async src="https://www.googletagmanager.com/gtag/js?id=
19AW-17651164169
vendor: 12 bytes, line 19
19"></script>
20<script> 21
vendor: 133 bytes, lines 21-24
21window.dataLayer = window.dataLayer || []; 22 function gtag(){dataLayer.push(arguments);} 23 gtag('js', new Date()); 24 gtag('config', '
24AW-17651164169
vendor: 4 bytes, line 24
24');
25</script>
25<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 25-26
25 26<script async src="https://www.googletagmanager.com/gtag/js?id=
26G-7B1T62KC65
vendor: 12 bytes, line 26
26"></script>
27<script> 28
vendor: 133 bytes, lines 28-31
28window.dataLayer = window.dataLayer || []; 29 function gtag(){dataLayer.push(arguments);} 30 gtag('js', new Date()); 31 gtag('config', '
31G-7B1T62KC65
vendor: 4 bytes, line 31
31');
32</script>
32<script src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a%2F652d31f3dc22d7b4ee708e44%2F68efdd6974bfb2f6bf22fedd%2Fclarity_script-3.0.7.js" type="text/javascript"></script>
32<script src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a%2F66ba5a08efe71070f98dd10a%2F6905681aeeaf0317d91ae62b%2F5bphgpvm-1.1.1.js" type="text/javascript"></script>
32<script src="https://api.consentpro.com/v1/cdn/runtime/688dfacb9052b142b766c11a/f362f3d1149a94c9.js" type="text/javascript" finsweet="consentpro" async=""></script>
32</head><body class="body is-dark"><div class="rp2-lightleak-fixed"><div class="rp2-lightleaks_wrapper"><div class="rp2-leftleak"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68ba06d1d9e55cc25de931f2_LIght-Leak.avif" loading="lazy" alt="A blue circle with a yellow sun in the middle."/></div><div class="rp2-rightleak"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68ba06d1d9e55cc25de931f2_LIght-Leak.avif" loading="lazy" alt="A blue circle with a yellow sun in the middle."/></div></div></div><div class="film-grain-bg"></div><main class="page-wrapper is-dark"><div class="rp2-nav"><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd598" class="rp2-nav_background is-dark-nav"></div><div data-w-id="298bfff3-51c2-c3e3-bec6-64bdd48baa58" class="rp2-nav_background is-light is-top"><div class="rp2-nav_backgroundinner"></div></div><div class="rp2-nav_container"><div class="rp2-nav_brand"><a href="/" data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:9b5fb472-072a-ae22-2337-02cd601bd59c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="9b5fb472-072a-ae22-2337-02cd601bd59c" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" class="rp2-nav_logolink w-nav-brand"><img data-w-id="9b5fb472-072a-ae22-2337-02cd601bd59d" loading="lazy" alt="" src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/689836a3bd1c24ee02892bd6_Logo-White.svg" class="rp2-nav_logowhite"/><img data-w-id="9b5fb472-072a-ae22-2337-02cd601bd59e" loading="lazy" alt="" src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68983edfbd1c24ee0289f254_Logo-Black.svg" class="rp2-nav_logoblack"/></a></div><div class="rp2_nav_links"><div data-w-id="94253c93-afe5-1c97-162e-00962d2b9301" class="rp2-nav_background is-dark-nav"><div class="rp2-nav_backgroundinner"></div></div><div data-w-id="176ea639-9954-e845-96db-e3bdcf8ec285" class="rp2-nav_background is-light"></div><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd5a0" class="w-layout-hflex rp2-nav_linkscontainer"><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:76a11d9e-0710-4690-663e-447548d4317d" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="76a11d9e-0710-4690-663e-447548d4317d" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Product</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 33 <polyline points="5,3 11,8 5,13" 34 fill="none" 35 stroke="currentColor" 36 stroke-width="2" 37 stroke-linecap="round" 38 stroke-linejoin="round" /> 39</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:bb89d4b8-f7a4-11aa-92f8-d5a10f9d88b7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="bb89d4b8-f7a4-11aa-92f8-d5a10f9d88b7" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/pulsar" aria-current="page" class="rp2-nav_linkwrap w-inline-block w--current"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Pulsar</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 40 <polyline points="5,3 11,8 5,13" 41 fill="none" 42 stroke="currentColor" 43 stroke-width="2" 44 stroke-linecap="round" 45 stroke-linejoin="round" /> 46</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:f0023609-fe80-1cd9-079b-40c912004769" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="f0023609-fe80-1cd9-079b-40c912004769" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7
46a47ca3a9%22%7D%5D" href="/enterprise" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Enterprise</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 47 <polyline points="5,3 11,8 5,13" 48 fill="none" 49 stroke="currentColor" 50 stroke-width="2" 51 stroke-linecap="round" 52 stroke-linejoin="round" /> 53</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:2629937d-5592-d99f-da22-f741f44501f2" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="2629937d-5592-d99f-da22-f741f44501f2" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/pricing" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Pricing</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 54 <polyline points="5,3 11,8 5,13" 55 fill="none" 56 stroke="currentColor" 57 stroke-width="2" 58 stroke-linecap="round" 59 stroke-linejoin="round" /> 60</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:6b03d2a0-fee0-3f62-b467-117ee3ebb8ee" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="6b03d2a0-fee0-3f62-b467-117ee3ebb8ee" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/insights" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Insights</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 61 <polyline points="5,3 11,8 5,13" 62 fill="none" 63 stroke="currentColor" 64 stroke-width="2" 65 stroke-linecap="round" 66 stroke-linejoin="round" /> 67</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:3e0f6ce7-a248-3a9b-4704-70849e084b4a" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="3e0f6ce7-a248-3a9b-4704-70849e084b4a" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="https://docs.reprostream.com/en/" target="_blank" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Docs</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 68 <polyline points="5,3 11,8 5,13" 69 fill="none" 70 stroke="currentColor" 71 stroke-width="2" 72 stroke-linecap="round" 73 stroke-linejoin="round" /> 74</svg></div></div></div></a><a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:fdd81ef0-fab2-40ed-0a6d-2d7cef1f6d25" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="fdd81ef0-fab2-40ed-0a6d-2d7cef1f6d25" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/contact" class="rp2-nav_linkwrap w-inline-block"><div class="rp2-nav_link for-light"><div class="rp2-nav_textlink">Contact</div><div class="rp2-nav_hovercurrent"></div><div class="rp2-nav-chevron-container"><div class="nav_chevron-code-embed w-embed"><svg class="chevron" viewBox="0 0 16 16" width="1em" height="1em" aria-hidden="true"> 75 <polyline points="5,3 11,8 5,13" 76 fill="none" 77 stroke="currentColor" 78 stroke-width="2" 79 stroke-linecap="round" 80 stroke-linejoin="round" /> 81</svg></div></div></div></a></div>
81<a data-wf-native-id-path="be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9:9b5fb472-072a-ae22-2337-02cd601bd5ae" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="9b5fb472-072a-ae22-2337-02cd601bd5ae" data-wf-component-context="%5B%7B%22componentId%22%3A%229b5fb472-072a-ae22-2337-02cd601bd597%22%2C%22instanceId%22%3A%22be9c7cda-2e71-f8ca-c74f-83d7a47ca3a9%22%7D%5D" href="/pricing-free" class="rp2-nav_button w-inline-block"><div>Start for free</div></a></div><div class="rp2-nav_toggle"><div class="rp2-nav_menuicon"><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd5b3" class="menu-icon1_line-top"></div><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd5b4" class="menu-icon1_line-middle"><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd5b5" class="menu-icon1_line-middle-inner"></div></div><div data-w-id="9b5fb472-072a-ae22-2337-02cd601bd5b6" class="menu-icon1_line-bottom"></div></div></div><div data-w-id="a77bccc1-c0de-b29a-c4c5-ab7cb5ff0042" class="rp2-nav_lines component"></div></div></div><div class="global-styles"><div class="style-overrides w-embed"><style> 82 83/* Ensure all elements inherit the color from its parent */ 84a, 85.w-input, 86.w-select, 87.w-tab-link, 88.w-nav-link, 89.w-nav-brand, 90.w-dropdown-btn, 91.w-dropdown-toggle, 92.w-slider-arrow-left, 93.w-slider-arrow-right, 94.w-dropdown-link { 95 color: inherit; 96 text-decoration: inherit; 97 font-size: inherit; 98} 99
100/* Focus state style for keyboard navigation for the focusable elements */ 101*[tabindex]:focus-visible, 102 input[type="file"]:focus-visible { 103 outline: 0.125rem solid #4d65ff; 104 outline-offset: 0.125rem; 105} 106 107/* Get rid of top margin on first element in any rich text element */ 108.w-richtext > :not(div):first-child, .w-richtext > div:first-child > :first-child { 109 margin-top: 0 !important; 110} 111 112/* Get rid of bottom margin on last element in any rich text element */ 113.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child { 114 margin-bottom: 0 !important; 115} 116 117/* Prevent all click and hover interaction with an element */ 118.pointer-events-off { 119 pointer-events: none; 120} 121 122/* Enables all click and hover interaction with an element */ 123.pointer-events-on { 124 pointer-events: auto; 125} 126 127/* Create a class of .div-square which maintains a 1:1 dimension of a div */ 128.div-square::after { 129 content: ""; 130 display: block; 131 padding-bottom: 100%; 132} 133 134/* Make sure containers never lose their center alignment */ 135.container-medium,.container-small, .container-large { 136 margin-right: auto !important; 137 margin-left: auto !important; 138} 139 140 141/* Apply "..." after 3 lines of text */ 142.text-style-3lines { 143 display: -webkit-box; 144 overflow: hidden; 145 -webkit-line-clamp: 3; 146 -webkit-box-orient: vertical; 147} 148 149/* Apply "..." after 2 lines of text */ 150.text-style-2lines { 151 display: -webkit-box; 152 overflow: hidden; 153 -webkit-line-clamp: 2; 154 -webkit-box-orient: vertical; 155} 156 157/* Adds inline flex display */ 158.display-inlineflex { 159 display: inline-flex; 160} 161 162/* These classes are never overwritten */ 163.hide { 164 display: none !important; 165} 166 167/* Remove default Webflow chevron from form select */ 168select{ 169 -webkit-appearance:none; 170} 171 172 173@media screen and (max-width: 991px) { 174 .hide, .hide-tablet { 175 display: none !important; 176 } 177} 178 @media screen and (max-width: 767px) { 179 .hide-mobile-landscape{ 180 display: none !important; 181 } 182} 183 @media screen and (max-width: 479px) { 184 .hide-mobile{ 185 display: none !important; 186 } 187} 188 189.margin-0 { 190 margin: 0rem !important; 191} 192 193.padding-0 { 194 padding: 0rem !important; 195} 196 197.spacing-clean { 198padding: 0rem !important; 199margin: 0rem !important; 200} 201 202.margin-top { 203 margin-right: 0rem !important; 204 margin-bottom: 0rem !important; 205 margin-left: 0rem !important; 206} 207 208.padding-top { 209 padding-right: 0rem !important; 210 padding-bottom: 0rem !important; 211 padding-left: 0rem !important; 212} 213 214.margin-right { 215 margin-top: 0rem !important; 216 margin-bottom: 0rem !important; 217 margin-left: 0rem !important; 218} 219 220.padding-right { 221 padding-top: 0rem !important; 222 padding-bottom: 0rem !important; 223 padding-left: 0rem !important; 224} 225 226.margin-bottom { 227 margin-top: 0rem !important; 228 margin-right: 0rem !important; 229 margin-left: 0rem !important; 230} 231 232.padding-bottom { 233 padding-top: 0rem !important; 234 padding-right: 0rem !important; 235 padding-left: 0rem !important; 236} 237 238.margin-left { 239 margin-top: 0rem !important; 240 margin-right: 0rem !important; 241 margin-bottom: 0rem !important; 242} 243 244.padding-left { 245 padding-top: 0rem !important; 246 padding-right: 0rem !important; 247 padding-bottom: 0rem !important; 248} 249 250.margin-horizontal { 251 margin-top: 0rem !important; 252 margin-bottom: 0rem !important; 253} 254 255.padding-horizontal { 256 padding-top: 0rem !important; 257 padding-bottom: 0rem !important; 258} 259 260.margin-vertical { 261 margin-right: 0rem !important; 262 margin-left: 0rem !important; 263} 264 265.padding-vertical { 266 padding-right: 0rem !important; 267 padding-left: 0rem !important; 268} 269 270/* Apply "..." at 100% width */ 271.truncate-width { 272 width: 100%; 273 white-space: nowrap; 274 overflow: hidden; 275 text-overflow: ellipsis; 276} 277/* Removes native scrollbar */ 278.no-scrollbar { 279 -ms-overflow-style: none; 280 overflow: -moz-scrollbars-none; 281} 282 283.no-scrollbar::-webkit-scrollbar {
284 display: none; 285} 286</style></div><div class="color-schemes w-embed"><style> 287/* Color Schemes Controls*/ 288<meta name="relume-color-schemes" content="false"/> 289 290 .color-scheme-1 { 291/*All sections should point to Color Scheme 1*/ 292 293 } 294 295 .color-scheme-2 { 296 --color-scheme-1--text: var(--color-scheme-2--text); 297 --color-scheme-1--background: var(--color-scheme-2--background); 298 --color-scheme-1--foreground: var(--color-scheme-2--foreground); 299 --color-scheme-1--border: var(--color-scheme-2--border); 300 --color-scheme-1--accent: var(--color-scheme-2--accent); 301 } 302 303 .color-scheme-3 { 304 --color-scheme-1--text: var(--color-scheme-3--text); 305 --color-scheme-1--background: var(--color-scheme-3--background); 306 --color-scheme-1--foreground: var(--color-scheme-3--foreground); 307 --color-scheme-1--border: var(--color-scheme-3--border); 308 --color-scheme-1--accent: var(--color-scheme-3--accent); 309 } 310 311 .color-scheme-4 { 312 --color-scheme-1--text: var(--color-scheme-4--text); 313 --color-scheme-1--background: var(--color-scheme-4--background); 314 --color-scheme-1--foreground: var(--color-scheme-4--foreground); 315 --color-scheme-1--border: var(--color-scheme-4--border); 316 --color-scheme-1--accent: var(--color-scheme-4--accent); 317 } 318 319 .color-scheme-5 { 320 --color-scheme-1--text: var(--color-scheme-5--text); 321 --color-scheme-1--background: var(--color-scheme-5--background); 322 --color-scheme-1--foreground: var(--color-scheme-5--foreground); 323 --color-scheme-1--border: var(--color-scheme-5--border); 324 --color-scheme-1--accent: var(--color-scheme-5--accent); 325 } 326 327 .color-scheme-6 { 328 --color-scheme-1--text: var(--color-scheme-6--text); 329 --color-scheme-1--background: var(--color-scheme-6--background); 330 --color-scheme-1--foreground: var(--color-scheme-6--foreground); 331 --color-scheme-1--border: var(--color-scheme-6--border); 332 --color-scheme-1--accent: var(--color-scheme-6--accent); 333 } 334 335 .color-scheme-7 { 336 --color-scheme-1--text: var(--color-scheme-7--text); 337 --color-scheme-1--background: var(--color-scheme-7--background); 338 --color-scheme-1--foreground: var(--color-scheme-7--foreground); 339 --color-scheme-1--border: var(--color-scheme-7--border); 340 --color-scheme-1--accent: var(--color-scheme-7--accent); 341 } 342 343 .color-scheme-8 { 344 --color-scheme-1--text: var(--color-scheme-8--text); 345 --color-scheme-1--background: var(--color-scheme-8--background); 346 --color-scheme-1--foreground: var(--color-scheme-8--foreground); 347 --color-scheme-1--border: var(--color-scheme-8--border); 348 --color-scheme-1--accent: var(--color-scheme-8--accent); 349 } 350 351 .color-scheme-9 { 352 --color-scheme-1--text: var(--color-scheme-9--text); 353 --color-scheme-1--background: var(--color-scheme-9--background); 354 --color-scheme-1--foreground: var(--color-scheme-9--foreground); 355 --color-scheme-1--border: var(--color-scheme-9--border); 356 --color-scheme-1--accent: var(--color-scheme-9--accent); 357 } 358 359 .color-scheme-10 { 360 --color-scheme-1--text: var(--color-scheme-10--text); 361 --color-scheme-1--background: var(--color-scheme-10--background); 362 --color-scheme-1--foreground: var(--color-scheme-10--foreground); 363 --color-scheme-1--border: var(--color-scheme-10--border); 364 --color-scheme-1--accent: var(--color-scheme-10--accent); 365 } 366 367/* Inherit slider dot colors */ 368.w-slider-dot { 369 background-color: var(--color-scheme-1--text); 370 opacity: 0.20; 371} 372 373.w-slider-dot.w-active { 374 background-color: var(--color-scheme-1--text); 375 opacity: 1; 376} 377 378/* Override .w-slider-nav-invert styles */ 379.w-slider-nav-invert .w-slider-dot { 380 background-color: var(--color-scheme-1--text) !important; 381 opacity: 0.20 !important; 382} 383 384.w-slider-nav-invert .w-slider-dot.w-active { 385 background-color: var(--color-scheme-1--text) !important; 386 opacity: 1 !important; 387} 388 389</style></div></div><main class="main-wrapper is-dark"><section class="bbx-section"><div class="padding-global"><div class="container-large is-dark is-no-top-border"><div class="is-hero"><div class="is-hero_content is-product-hero"><div class="is-background is-hidden-tablet is-pulsar"></div><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a134fed4a6a5df85f4a1_pulsar-icon-1024-optimised.avif" loading="lazy" alt="Pulsar app icon." class="image-10"/><div class="is-hero-content_wrapper is-product-hero"><div class="product-hero-text-wrapper"><div class="eyebrow-wrapper"><div class="text-style-tagline is-mint">PULSAR</div></div><h1 class="heading-class-hero is-product-hero">Introducing Pulsar</h1></div><div class="is-content is-40--desktop"><div class="text-size-large">Pulsar turns workstations, iPhones and iPads into secure live encoders for RePro.<
389/div><a data-wf-native-id-path="ebb82886-42e8-8b28-0a0a-9aa2de613e43" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ebb82886-42e8-8b28-0a0a-9aa2de613e43" href="/app-links" class="button is-mint w-button">Get Pulsar</a><a data-wf-native-id-path="64b902c5-feab-fbbb-4990-2c268d044ae9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="64b902c5-feab-fbbb-4990-2c268d044ae9" href="/contact" class="button-alt-mint w-button">Talk to us</a></div></div><div class="is-hero_actions is-hidden-tablet"><a data-wf-native-id-path="38470b91-b20b-489a-8dd2-dec2802cb4da" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="38470b91-b20b-489a-8dd2-dec2802cb4da" href="#pulsar_features" class="is-hero_button w-inline-block"><div class="hero-action-wrapper"><h5 class="heading-style-h5">FEATURES</h5><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a444d882bbf749657de4cd0_hero-action-chevron-mint.svg" loading="lazy" alt="" class="hero-action-chevron"/></div></a><a data-wf-native-id-path="2b25ad63-daa0-cc5a-87ac-4cb3daec10f7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="2b25ad63-daa0-cc5a-87ac-4cb3daec10f7" href="#pulsar_teams" class="is-hero_button has-border_left has-background w-inline-block"><div class="hero-action-wrapper"><h5 class="heading-style-h5">PULSAR FOR TEAMS</h5><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a444d882bbf749657de4cd0_hero-action-chevron-mint.svg" loading="lazy" alt="" class="hero-action-chevron"/></div></a></div></div></div></div></div></section><div id="pulsar_features" class="section_heading"><div class="padding-global"><div class="container-large is-dark"><div class="padding-section-large"><div class="w-layout-grid heading-split"><div class="heading-split-wrapper"><div class="eyebrow-wrapper"><div class="text-style-tagline is-mint">FEATURES</div></div><h2 class="heading-style-h2"><strong>Built for production and post</strong></h2></div></div></div></div></div></div><div class="section_3-cards"><div class="padding-global"><div class="container-large is-no-vertical-border is-dark"><div class="padding-section-large is-full-tablet is-no-padding-top"><div class="is-card_wrapper"><div class="is-basic_card"><div class="_3x2-image-wrapper"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a998e3ef4c0365c95b1afd5_pulsar-3-optimised.avif" loading="lazy" width="70" data-w-id="7db42b0c-f47e-de5b-e6f6-193fe39baba3" alt="" class="is-flex-image"/></div><div class="is-card_text"><div class="heading-style-h5">Incredible image fidelity</div><div class="text-size-regular text-color-neutral-white">Stream in SDR or HDR, with support for up to 10-bit video, HEVC, 4:2:2 and resolutions up to UHD. Pulsar supports OCIO, LUTs and both PQ and HLG HDR workflows.</div></div></div><div class="is-basic_card"><div class="_3x2-image-wrapper"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a4eafba2e2f5546b8aa32bf_FlexScale.avif" loading="lazy" width="70" data-w-id="7db42b0c-f47e-de5b-e6f6-193fe39baba3" alt="" class="is-flex-image"/></div><div class="is-card_text"><div class="heading-style-h5"><strong>Flexible and scalable</strong></div><div class="text-size-regular text-color-neutral-white">Each Pulsar Desktop row takes one source, encodes it once and feeds up to two independent outputs. With support for up to 26 rows, a single workstation can replace multiple hardware encoders.</div></div></div><div class="is-basic_card"><div class="_3x2-image-wrapper"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a1351dcb829e709b10d3_WorksExisting-1078-optimised.avif" loading="lazy" width="70" data-w-id="7db42b0c-f47e-de5b-e6f6-193fe39baba3" alt="The Pulsar Desktop window floating over a DaVinci Resolve edit timeline, with a DeckLink source feeding RePro and NDI outputs." class="is-flex-image"/></div><div class="is-card_text"><div class="heading-style-h5">Desktop, mobile and 360 workflows</div><div class="text-size-regular text-color-neutral-white">Run Pulsar Desktop on Mac or Windows, or Pulsar Mobile on iPhone and iPad. Bring in SDI, HDMI, NDI, SRT, screen, file-based, RePro, Unreal Engine, UVC and Insta360 sources.</div></div></div></div></div></div></div></div><div class="section_heading"><div class="padding-global"><div class="container-large is-dark"><div class="padding-section-large is-key-benefits"><div class="w-layout-grid heading-split"><div class="heading-split-wrapper"><h2 class="heading-style-h2">Key benefits</h2></div></div></div></div></div></div><section id="pulsar_benefits" class="bbx-section"><div class="padding-global"><div class="container-large is-dark is-no-top-border"><div class="bbx-container is-section-block padding-0 is-no-top-marging"><div class="two-column_content"><div class="_2-column_item is-hidden-tablet"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a1349537b3568905752a_WorksExisting-1794-optimised.avif" loading="lazy" alt="The Pulsar Desktop window floating over a DaVinci Resolve edit timeline, with a DeckLink source feeding RePro and NDI outputs." class="key-benefits-image"/></div><div class="_2-column_item"><div class="w-layout-vflex padding-large is-custom"><div data-wf--numbered-card--variant="base" data-w-id="c517595f-75f2-0035-87bd-8a9cb0e1dc51" class="is-number-card"><div class="content-style"><div class="number"><div class="heading-4">01.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5"><strong>Stream at the quality your work requires</strong></div><div class="text-size-regular text-color-neutral-white">Choose the codec, bitrate, resolution, bit depth and chroma for each output. Use simple presets or configure the stream in detail for review, monitoring or colour-critical workflows.</div></div><a data-wf-native-id-path="c517595f-75f2-0035-87bd-8a9cb0e1dc60:c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-component-context="%5B%7B%22componentId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc51%22%2C%22instanceId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc60%22%7D%5D" href="#" class="button-style"><div class="button-style-2 is-hidden"></div></a></div></div></div><div data-wf--numbered-card--variant="base" data-w-id="c517595f-75f2-0035-87bd-8a9cb0e1dc51" class="is-number-card"><div class="content-style"><div class="number"><div class="heading-4">02.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5"><strong>Replace multiple hardware encoders</strong></div><div class="text-size-regular text-color-neutral-white">A single Pulsar Desktop instance can manage up to 26 sources, allowing one workstation to replace multiple hardware encoders. Pulsar Mobile brings the same software-first approach to iPhone and iPad.</div></div><a data-wf-native-id-path="9017ced9-4590-c426-7322-e57a9ff990eb:c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-component-context="%5B%7B%22componentId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc51%22%2C%22instanceId%22%3A%229017ced9-4590-c426-7322-e57a9ff990eb%22%7D%5D" href="#" class="button-style"><div class="button-style-2 is-hidden"></div></a></div></div></div><div data-wf--numbered-card--variant="base" data-w-id="c517595f-75f2-0035-87bd-8a9cb0e1dc51" class="is-number-card"><div class="content-style"><div class="number"><div class="heading-4">03.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5"><strong>Connect different sources and destinations</strong></div><div class="text-size-regular text-color-neutral-white">Use SRT, NDI, SDI, RePro and Orbit across local and remote workflows. Each row can feed two independent outputs, allowing the same source to serve different destinations at the same time.</div></div><a data-wf-native-id-path="84831b4d-6579-1726-352f-b500fd70c235:c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-component-context="%5B%7B%22componentId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc51%22%2C%22instanceId%22%3A%2284831b4d-6579-1726-352f-b500fd70c235%22%7D%5D" href="#" class="button-style"><div class="button-style-2 is-hidden"></div></a></div></div></div><div data-wf--numbered-card--variant="base" data-w-id="c517595f-75f2-0035-87bd-8a9cb0e1dc51" class="is-number-card"><div class="content-style"><div class="number"><div class="heading-4">04.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5">Capture from workstation or mobile</div><div class="text-size-regular text-color-neutral-white">Use Pulsar Desktop across editorial, grading, finishing and production workflows. Use Pulsar Mobile for live contribution from built-in cameras, UVC inputs, NDI sources and supported Insta360 cameras.</div></div><a data-wf-native-id-path="d6dd430a-1200-6027-8473-41b957d8bce2:c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-component-context="%5B%7B%22componentId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc51%22%2C%22instanceId%22%3A%22d6dd430a-1200-6027-8473-41b957d8bce2%22%7D%5D" href="#" class="button-style"><div class="button-style-2 is-hidden"></div></a></div></div></div><div data-wf--numbered-card--variant="base" data-w-id="c517595f-75f2-0035-87bd-8a9cb0e1dc51" class="is-number-card"><div class="content-style"><div class="number"><div class="heading-4">05.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5"><strong>See what is happening across the signal path</strong></div><div class="text-size-regular text-color-neutral-white">Live previews, status lights, bitrate, frame rate, dropped-frame counts and pipeline monitoring make it easier to confirm that sources are connected and streams are moving.</div></div><a data-wf-native-id-path="fd07c879-fb8d-5be5-bef1-8587c0e3e322:c51
3897595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c517595f-75f2-0035-87bd-8a9cb0e1dc5c" data-wf-component-context="%5B%7B%22componentId%22%3A%22c517595f-75f2-0035-87bd-8a9cb0e1dc51%22%2C%22instanceId%22%3A%22fd07c879-fb8d-5be5-bef1-8587c0e3e322%22%7D%5D" href="#" class="button-style"><div class="button-style-2 is-hidden"></div></a></div></div></div><div data-w-id="4f784970-9bae-0255-4606-115db87ff4f5" class="is-number-card"><div class="content-style is-no-border-bottom"><div class="number"><div class="heading-4">06.</div></div><div class="text-container"><div class="text-block"><div class="heading-style-h5"><strong>Share video locally with Orbit</strong></div><div class="text-size-regular text-color-neutral-white">Built into Pulsar, Orbit lets you share selected sources with browsers, iPhone, iPad and Apple TV devices on the same local network. Control access using individual codes or QR links.</div></div></div></div></div></div></div></div></div></div></div></section><div id="pulsar_teams" class="section_heading"><div class="padding-global"><div class="container-large is-dark"><div class="padding-section-large"><div class="w-layout-grid heading-split"><div class="heading-split-wrapper"><div class="eyebrow-wrapper"><div class="text-style-tagline is-mint">PULSAR FOR TEAMS</div></div><h2 class="heading-style-h2"><strong>Built for editors, operators and technical teams</strong></h2><div class="margin-top margin-small"><p class="text-size-large text-colour-neutral-light">Pulsar works equally well on a single workstation or across a larger facility or production. Editors can share both their working interface and clean programme output, while technical teams can manage systems, support users and monitor streams remotely through Fleet, built directly into Pulsar.</p></div></div></div></div></div></div></div><section class="section_sticky-stack"><div class="sticky-stack_component"><div class="sticky-stack_content-item-dark content-item-1"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout"><div class="image-wrapper-4x3 is-50"><img data-w-id="6a4969a7-307a-c766-dace-1038f3e1cd67" loading="lazy" alt="A person on a sofa monitoring multiple live camera feeds in RePro on a laptop." src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a1309537b356890572bc_pulsar-fleet-on-lap-optimised.avif" class="sticky-stack-image"/></div><div class="sticky-stack_content-right"><div class="sticky-stack_content-right-wrapper"><div class="margin-bottom margin-small"><div class="sticky-stack-heading-wrapper is-1"><h3 class="heading-style-h3"><strong>Control systems remotely</strong></h3></div></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">Built into Pulsar, Fleet gives authorised administrators full remote control of every Pulsar instance within their RePro organisation.</p></div></div></div></div></div></div></div></div><div class="sticky-stack_content-item-dark content-item-2"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout"><div class="image-wrapper-4x3 is-50"><img data-w-id="6a4969a7-307a-c766-dace-1038f3e1cd7c" loading="lazy" alt="Pulsar Desktop source rows with the input type menu open, listing NDI, GUI, SRT, RePro, GEN, EXT and FILE." src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a1319d7d4128d6e7a6fb_pulsar-2-optimised.avif" class="image-cover"/></div><div class="layout1_content-right"><div class="sticky-stack_content-right-wrapper is-dark"><div class="margin-bottom margin-small"><div class="heading-wrapper"><h3 class="heading-style-h3"><strong>Configure and support at scale</strong></h3></div></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">Set up sources, outputs and streams remotely, troubleshoot issues and support operators without needing a specialist at every workstation or location.</p></div></div></div></div></div></div></div></div><div class="sticky-stack_content-item-dark content-item-3"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout"><div class="image-wrapper-4x3 is-50"><img src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a134157bc299330a5f42_pulsar-on-screen-optimised.avif" loading="lazy" alt="An editor in a grading suite with the edit timeline on one monitor and the programme picture on a larger display." class="image-cover"/>
389</div><div class="layout1_content-right"><div class="sticky-stack_content-right-wrapper is-dark"><div class="margin-bottom margin-small"><h3 class="heading-style-h3"><strong>Stream the edit and the picture</strong></h3></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">Editors can stream their application interface and clean programme output at the same time, giving remote collaborators both the creative context and the full-quality image.</p></div></div></div></div></div></div></div></div><div class="sticky-stack_content-item-dark content-item-3"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout"><div class="image-wrapper-4x3 is-50"><img loading="lazy" src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/6a99a134431bcdbeec56031c_pulsar-control-ipad-optimised.avif" alt="A finger on an iPad framing a 360-degree street view in Pulsar Mobile, with a north indicator overlaid." class="image-cover"/></div><div class="layout1_content-right"><div class="sticky-stack_content-right-wrapper is-dark"><div class="margin-bottom margin-small"><h3 class="heading-style-h3"><strong>Direct the 360 view</strong></h3></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">With a supported Insta360 camera, Pulsar Mobile can stream 360 video into RePro and let operators frame what remote viewers see in real time.</p></div></div></div></div></div></div></div></div><div class="sticky-stack_content-item-dark content-item-3"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout is-no-padding-bottom"><div class="image-wrapper-4x3 is-50"><img sizes="(max-width: 896px) 100vw, 896px" srcset="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68b15f468d74d681c574b4ad_Tablet-2-p-500.avif 500w, https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68b15f468d74d681c574b4ad_Tablet-2.avif 896w" alt="A black tablet with a screen displaying a menu." src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68b15f468d74d681c574b4ad_Tablet-2.avif" loading="lazy" class="image-cover"/></div><div class="layout1_content-right"><div class="sticky-stack_content-right-wrapper is-dark"><div class="margin-bottom margin-small"><h3 class="heading-style-h3"><strong>Easy connection into RePro</strong></h3></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">Log into your RePro account to launch Pulsar, choose the company, project and programme, then go live. When streaming to or from RePro, Pulsar is included as part of your RePro workflow.</p></div></div></div></div></div></div></div></div><div class="sticky-stack_content-item-dark content-item-3"><div class="padding-global"><div class="container-large is-sticky-stack is-dark"><div class="padding-vertical"><div class="sticky-stack_content-layout is-no-padding-bottom"><div class="image-wrapper-4x3 is-50"><img sizes="100vw" srcset="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68c2dfc08ea7ebd20bb6120c_layout-view-p-500.avif 500w, https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68c2dfc08ea7ebd20bb6120c_layout-view-p-800.avif 800w, https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68c2dfc08ea7ebd20bb6120c_layout-view.avif 1212w" alt="A screen with a green field and a button that says Auto Grid." src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/68c2dfc08ea7ebd20bb6120c_layout-view.avif" loading="lazy" class="image-cover"/></div><div class="layout1_content-right"><div class="sticky-stack_content-right-wrapper is-dark"><div class="margin-bottom margin-small"><h3 class="heading-style-h3"><strong>Monitor every stream</strong></h3></div><div class="sticky-text-wrapper"><p class="text-size-regular text-color-neutral-white">Use live previews, stream statistics, diagnostics and pipeline monitoring to check performance and identify problems before they affect a session.</p></div></div></div></div></div></div></div></div></div></section><div class="section_heading"><div id="pulsar_fleet" class="section_heading"><div class="padding-global"><div class="container-large is-dark"><div class="padding-section-large"><div class="w-layout-grid heading-split"><div class="heading-split-wrapper"><h2 class="heading-style-h2"><strong>From mobile contribution to an entire fleet</strong></h2><div class="margin-top margin-small"><p class="text-size-large text-colour-neutral-light">Use Pulsar Mobile for fast, portable contribution. Use Pulsar Desktop as a
389standalone software encoder on a workstation, or manage multiple Pulsar instances centrally across a facility, production or studio organisation.</p></div><div class="margin-top margin-medium"><div class="button-group"><a data-wf-native-id-path="041a8328-3ce4-731d-a11a-8c8e077eb10c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="041a8328-3ce4-731d-a11a-8c8e077eb10c" href="/contact" class="button-alt-mint w-button">Talk to us about Pulsar Fleet</a></div></div></div></div></div><div class="padding-section-large"><div class="w-layout-grid heading-split"><div class="heading-split-wrapper"><h2 class="heading-style-h2"><strong>Make live streaming part of the workstation</strong></h2><div class="margin-top margin-small"><p class="text-size-large text-colour-neutral-light">Use the systems you already have to send professional-quality live streams from production through post.</p></div><div class="margin-top margin-medium"><div class="button-group"><a data-wf-native-id-path="36a03e2c-9ab5-6f69-f619-522cb2b27686" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="36a03e2c-9ab5-6f69-f619-522cb2b27686" href="/app-links" class="button is-mint w-button">Get started</a></div></div><div class="margin-top margin-small"><p class="text-size-regular text-colour-neutral-light">A RePro account is required to use Pulsar. Standalone workflows are available with a Pulsar subscription.</p></div></div></div></div></div></div></div></div></main><footer class="footer is-dark"><div class="padding-global"><div class="container-large is-footer"><div class="padding-vertical is-footer"><div class="footer-cta-wrapper"><div class="heading-class-footer-cta-wrapper"><h1 class="heading-class-footer-cta">Ready to transform your production workflow?</h1></div><a data-wf--button--variant="base" data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949e0:cf8c4841-cf85-b470-7452-f4c6b7d88ef6" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="cf8c4841-cf85-b470-7452-f4c6b7d88ef6" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%2C%7B%22componentId%22%3A%22cf8c4841-cf85-b470-7452-f4c6b7d88ef6%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949e0%22%7D%5D" href="/pricing" data-wf-event-ids="157053647" class="button w-button">Get started</a></div><div class="padding-bottom padding-xlarge"><div class="w-layout-grid footer2_top-wrapper"><div class="w-layout-grid footer2_left-wrapper"><div class="footer2_link-column"><div class="margin-bottom margin-xsmall"><div class="text-style-tagline is-teal">LINKS</div></div><div class="footer2_link-list"><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949ea" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949ea" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/" class="footer2_link">Product</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949ec" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949ec" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/enterprise" class="footer2_link">Enterprise</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949ee" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949ee" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/pricing" class="footer2_link">Pricing</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949f0" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949f0" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/insights" class="footer2_link">Insights</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:6b973339-b6c8-2689-8e90-22660ce7109a" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="6b973339-b6c8-2689-8e90-22660ce7109a" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/app-links" class="footer2_link">Download app</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:75949706-facd-a7cd-9917-91af96603a2e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="75949706-facd-a7cd-9917-91af96603a2e" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/careers" class="footer2_link">Careers</a></div></div><div class="footer2_link-column"><div class="margin-bottom margin-xsmall"><div class="text-style-tagline is-teal">SUPPORT</div></div><div class="footer2_link-list"><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949f9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949f9" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="mailto:[email protected]" class="footer2_link">Contact support</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949fb" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949fb" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="https://docs.reprostream.com/en/" target="_blank" class="footer2_link">Documentation</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a4949fd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a4949fd" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/contact" class="footer2_link">Contact us</a></div></div></div><div class="footer2_right-wrapper"><div class="margin-bottom margin-xsmall"><div class="text-style-tagline is-teal">SUBSCRIBE</div></div><div class="margin-bottom margin-xsmall"><div class="max-width-email"><div class="text-size-regular text-color-neutral-white">News, insights, and updates from the team at RePro Stream. No noise, just signal.</div></div></div><div class="footer2_form-block w-form"><form id="wf-form-newsletter" name="wf-form-newsletter" data-name="newsletter" method="get" class="footer2_form" data-wf-page-id="6a443ef64756470516b1ad4f" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a07"><input class="form_input is-dark w-input" maxlength="256" name="Email" data-name="Email" placeholder="Enter your email" type="email" id="userEmail" required=""/><input class="button is-email w-node-e66756fc-ab96-60a5-76e4-3e685a494a09-5a4949d5 w-button" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a09" data-wait="Please wait..." type="submit" id="newsletterSubmitBtn" data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a09" data-wf-ao-click-engagement-tracking="true" value="Subscribe"/></form><div class="text-size-tiny is-dark">By subscribing you agree to with our <a href="/privacy-policy" data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a0c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a0c" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D"><span>Privacy Policy</span></a> and provide consent to receive updates from our company.</div><div class="form_message-success-wrapper w-form-done"><div class="form_message-success"><div>Thank you! Your submission has been received!</div></div></div><div class="form_message-error-wrapper w-form-fail"><div class="form_message-error"><div>Oops! Something went wrong while submitting the form.</div></div></div></div></div></div></div><div class="divider-horizontal is-15--white"></div><div class="padding-top padding-medium"><div class="footer2_bottom-wrapper"><div class="w-layout-grid footer2_legal-list"><div id="w-node-e66756fc-ab96-60a5-76e4-3e685a494a1c-5a4949d5" class="footer2_credit-text">© 2025 RePro Stream Ltd. All rights reserved.</div><div class="footer_legal-links-wrapper"><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a1f" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a1f" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/privacy-policy" class="footer2_legal-link">Privacy Policy</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a21" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a21" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="/terms" class="footer2_legal-link">Terms of Service</a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a23" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a23" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="#" class="footer2_legal-link is-cookies is-hidden">Cookies Settings</a></div></div><div class="w-layout-grid footer2_social-list"><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a26" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a26" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="#" class="footer2_social-link is-fb w-inline-block"><div class="icon-embed-xsmall w-embed">
389<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 390<path d="M22 12.0611C22 6.50451 17.5229 2 12 2C6.47715 2 2 6.50451 2 12.0611C2 17.0828 5.65684 21.2452 10.4375 22V14.9694H7.89844V12.0611H10.4375V9.84452C10.4375 7.32296 11.9305 5.93012 14.2146 5.93012C15.3088 5.93012 16.4531 6.12663 16.4531 6.12663V8.60261H15.1922C13.95 8.60261 13.5625 9.37822 13.5625 10.1739V12.0611H16.3359L15.8926 14.9694H13.5625V22C18.3432 21.2452 22 17.083 22 12.0611Z" fill="CurrentColor"/> 391</svg></div></a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a28" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a28" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="https://www.instagram.com/reprostream/" target="_blank" class="footer2_social-link w-inline-block"><div class="icon-embed-xsmall w-embed"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 392<path fill-rule="evenodd" clip-rule="evenodd" d="M16 3H8C5.23858 3 3 5.23858 3 8V16C3 18.7614 5.23858 21 8 21H16C18.7614 21 21 18.7614 21 16V8C21 5.23858 18.7614 3 16 3ZM19.25 16C19.2445 17.7926 17.7926 19.2445 16 19.25H8C6.20735 19.2445 4.75549 17.7926 4.75 16V8C4.75549 6.20735 6.20735 4.75549 8 4.75H16C17.7926 4.75549 19.2445 6.20735 19.25 8V16ZM16.75 8.25C17.3023 8.25 17.75 7.80228 17.75 7.25C17.75 6.69772 17.3023 6.25 16.75 6.25C16.1977 6.25 15.75 6.69772 15.75 7.25C15.75 7.80228 16.1977 8.25 16.75 8.25ZM12 7.5C9.51472 7.5 7.5 9.51472 7.5 12C7.5 14.4853 9.51472 16.5 12 16.5C14.4853 16.5 16.5 14.4853 16.5 12C16.5027 10.8057 16.0294 9.65957 15.1849 8.81508C14.3404 7.97059 13.1943 7.49734 12 7.5ZM9.25 12C9.25 13.5188 10.4812 14.75 12 14.75C13.5188 14.75 14.75 13.5188 14.75 12C14.75 10.4812 13.5188 9.25 12 9.25C10.4812 9.25 9.25 10.4812 9.25 12Z" fill="CurrentColor"/> 393</svg></div></a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a2a" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a2a" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="#" class="footer2_social-link is-x w-inline-block"><div class="icon-embed-xsmall w-embed"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 394<path d="M17.1761 4H19.9362L13.9061 10.7774L21 20H15.4456L11.0951 14.4066L6.11723 20H3.35544L9.80517 12.7508L3 4H8.69545L12.6279 9.11262L17.1761 4ZM16.2073 18.3754H17.7368L7.86441 5.53928H6.2232L16.2073 18.3754Z" fill="CurrentColor"/> 395</svg></div></a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a2c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a2c" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="https://www.linkedin.com/company/reprostream" target="_blank" class="footer2_social-link is-li w-inline-block"><div class="icon-embed-xsmall w-embed"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 396<path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 3C3.67157 3 3 3.67157 3 4.5V19.5C3 20.3284 3.67157 21 4.5 21H19.5C20.3284 21 21 20.3284 21 19.5V4.5C21 3.67157 20.3284 3 19.5 3H4.5ZM8.52076 7.00272C8.52639 7.95897 7.81061 8.54819 6.96123 8.54397C6.16107 8.53975 5.46357 7.90272 5.46779 7.00413C5.47201 6.15897 6.13998 5.47975 7.00764 5.49944C7.88795 5.51913 8.52639 6.1646 8.52076 7.00272ZM12.2797 9.76176H9.75971H9.7583V18.3216H12.4217V18.1219C12.4217 17.742 12.4214 17.362 12.4211 16.9819V16.9818V16.9816V16.9815V16.9812C12.4203 15.9674 12.4194 14.9532 12.4246 13.9397C12.426 13.6936 12.4372 13.4377 12.5005 13.2028C12.7381 12.3253 13.5271 11.7586 14.4074 11.8979C14.9727 11.9864 15.3467 12.3141 15.5042 12.8471C15.6013 13.1803 15.6449 13.5389 15.6491 13.8863C15.6605 14.9339 15.6589 15.9815 15.6573 17.0292V17.0294C15.6567 17.3992 15.6561 17.769 15.6561 18.1388V18.3202H18.328V18.1149C18.328 17.6629 18.3278 17.211 18.3275 16.7591V16.759V16.7588C18.327 15.6293 18.3264 14.5001 18.3294 13.3702C18.3308 12.8597 18.276 12.3563 18.1508 11.8627C17.9638 11.1286 17.5771 10.5211 16.9485 10.0824C16.5027 9.77019 16.0133 9.5691 15.4663 9.5466C15.404 9.54401 15.3412 9.54062 15.2781 9.53721L15.2781 9.53721L15.2781 9.53721C14.9984 9.52209 14.7141 9.50673 14.4467 9.56066C13.6817 9.71394 13.0096 10.0641 12.5019 10.6814C12.4429 10.7522 12.3852 10.8241 12.2991 10.9314L12.2991 10.9315L12.2797 10.9557V9.76176ZM5.68164 18.3244H8.33242V9.76733H5.68164V18.3244Z" fill="CurrentColor"/> 397</svg></div></a><a data-wf-native-id-path="e66756fc-ab96-60a5-76e4-3e685a494a31:e66756fc-ab96-60a5-76e4-3e685a494a2e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="e66756fc-ab96-60a5-76e4-3e685a494a2e" data-wf-component-context="%5B%7B%22componentId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a4949d5%22%2C%22instanceId%22%3A%22e66756fc-ab96-60a5-76e4-3e685a494a31%22%7D%5D" href="#" class="footer2_social-link is-yt w-inline-block"><div class="icon-embed-xsmall w-embed">
397<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 398<path fill-rule="evenodd" clip-rule="evenodd" d="M20.5686 4.77345C21.5163 5.02692 22.2555 5.76903 22.5118 6.71673C23.1821 9.42042 23.1385 14.5321 22.5259 17.278C22.2724 18.2257 21.5303 18.965 20.5826 19.2213C17.9071 19.8831 5.92356 19.8015 3.40294 19.2213C2.45524 18.9678 1.71595 18.2257 1.45966 17.278C0.827391 14.7011 0.871044 9.25144 1.44558 6.73081C1.69905 5.78311 2.44116 5.04382 3.38886 4.78753C6.96561 4.0412 19.2956 4.282 20.5686 4.77345ZM9.86682 8.70227L15.6122 11.9974L9.86682 15.2925V8.70227Z" fill="CurrentColor"/> 399</svg></div></a></div></div></div></div></div></div></footer></main>
399<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=688dfacb9052b142b766c11a" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
399<script src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/js/webflow.schunk.7019addbfb640a41.js" type="text/javascript" integrity="sha384-0r6WXn7Z+uTKMe4lCvfmqcq5aXKsWn562wGFdOeOPFq0kuOaHzWsZzDgNACSGhC3" crossorigin="anonymous"></script>
399<script src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/js/webflow.schunk.fa68e4022b2cd7f6.js" type="text/javascript" integrity="sha384-fCpzdvIf5aw1IZiHf17vyXb5selIXF2zQeJVQXnclRe9X+NurbWfD4WvpEinOlf3" crossorigin="anonymous"></script>
399<script src="https://cdn.prod.website-files.com/688dfacb9052b142b766c11a/js/webflow.f029e830.abb068c0cc2e74c1.js" type="text/javascript" integrity="sha384-rwvTiwgOQnxX5XNRVORZN8sbE4BLH8qfxKQb9MY9f8xQ9A9CBiwdRzFMAMULaRv4" crossorigin="anonymous"></script>
399<script src="https://cdn.prod.website-files.com/gsap/3.15.0/ScrollTrigger.min.js" type="text/javascript"></script>
399<script src="https://cdn.prod.website-files.com/gsap/3.15.0/gsap.min.js" type="text/javascript"></script>
399<script src="https://cdn.prod.website-files.com/gsap/3.15.0/SplitText.min.js" type="text/javascript"></script>
399<!-- Intercom Code with JWT Authentication -->
400<script> 401 // JWT Session Management for Intercom Authentication 402 (function() { 403 // Check localStorage for existing JWT session 404 function getIntercomSession() { 405 try { 406 const sessionData = localStorage.getItem('reproIntercomSession'); 407 if (!sessionData) return null; 408 409 const session = JSON.parse(sessionData); 410 411 // Check if JWT is expired (with 5 minute buffer) 412 const expiresAt = new Date(session.expiresAt); 413 const now = new Date(); 414 const bufferTime = 5 * 60 * 1000; // 5 minutes in milliseconds 415 416 if (expiresAt.getTime() - now.getTime() < bufferTime) { 417 localStorage.removeItem('reproIntercomSession'); 418 return null; 419 } 420 421 return session; 422 } catch (error) { 423 console.error('[Intercom JWT] Error reading session:', error); 424 localStorage.removeItem('reproIntercomSession'); 425 return null; 426 } 427 } 428 429 // Initialize Intercom with or without JWT 430 const session = getIntercomSession(); 431 432 window.intercomSettings = { 433 api_base: "https://api-iam.intercom.io", 434 app_id: "s50qsz16" 435 }; 436 437 // If we have a valid JWT session, add authentication 438 if (session && session.jwt && session.email) { 439 window.intercomSettings.intercom_user_jwt = session.jwt; 440 window.intercomSettings.email = session.email; 441 } 442 })(); 443</script>
443 444 445
446<script> 447 // We pre-filled your app ID in the widget URL: 'https://widget.intercom.io/widget/s50qsz16' 448 (function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/s50qsz16';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})(); 449</script>
449 450 451 452<!-- Universal Form Handler with reCAPTCHA v3 --> 453 454<!-- reCAPTCHA v3 Script -->
vendor: 61 bytes, lines 454-455
454 455<script src="https://www.google.com/recaptcha/api.js?render=
4556Ld2ZfMrAAAAAC_Regc-qG28myZShxLPcEiQM0Kg
vendor: 13 bytes, lines 455-456
455"></script> 456
457<!-- Link to overall styles for date picker DO NOT DELETE - preserved for future use --> 458<link rel="stylesheet" href="https://fengyuanchen.github.io/datepicker/css/datepicker.css"> 459 460<!-- Form and autocomplete styles --> 461<style> 462/* Form and input elements */ 463.datepicker-panel{color:#000} 464.datepicker-panel>ul[data-view="days"]>li:hover{background:#008080!important;color:#fff!important} 465.datepicker-panel>ul>li.disabled.highlighted,.datepicker-panel>ul>li.disabled:hover.highlighted{background:rgba(0,128,128,0.2)!important;color:#000!important} 466.w-input,.w-input:focus,.w-select:focus{border-color:#008080!important;outline:0} 467.datepicker-panel>ul>li.picked,.datepicker-panel>ul>li.picked:hover{color:#008080!important} 468.w-form-formradioinput--inputType-custom.w--redirected-checked{border-width:4px;border-color:#008080!important} 469.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:0 0 3px 1px #008080!important} 470.datepicker-top-left,.datepicker-top-right{border-top-color:#008080!important} 471.datepicker-top-left::before,.datepicker-top-right::before{border-bottom-color:#008080!important} 472.datepicker-panel>ul>li:hover,.datepicker-panel>ul>li.highlighted{background-color:rgba(0,128,128,0.2)!important} 473 474/* Job search autocomplete */ 475.form-field-container{position:relative} 476.job-suggestions-container{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,0.1);max-height:200px;overflow-y:auto;z-index:1000;display:none} 477.job-suggestions-container div{padding:12px 16px;cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .2s ease} 478.job-suggestions-container div:last-child{border-bottom:none} 479.job-suggestions-container div:hover,.job-suggestions-container div:focus{background-color:#f8f9fa;outline:0} 480 481/* Mobile adjustments */ 482@media (max-width:768px){ 483.job-suggestions-container{max-height:150px} 484.job-suggestions-container div{padding:10px 12px;font-size:14px} 485} 486</style> 487
488<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
vendor: 1 bytes, line 488
488
489<script src="https://cdnjs.cloudflare.com/ajax/libs/datepicker/1.0.10/datepicker.min.js" integrity="sha512-RCgrAvvoLpP7KVgTkTctrUdv7C6t7Un3p1iaoPr1++3pybCyCsCZZN7QEHMZTcJTmcJ7jzexTO+eFpHk4OCFAg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
489 490
491<script> 492$(document).ready(() => { 493 // Hide date input fields if they exist 494 $('#dateFrom, #dateTo').hide(); 495 $('.date-picker-container').hide(); 496}); 497</script>
497 498
499<script> 500document.addEventListener('DOMContentLoaded', function () { 501 // EARLY EXIT: Check if submit button exists before initializing 502 const hasSubmitButton = document.getElementById('submitBtn'); 503 if (!hasSubmitButton) { 504 return; 505 } 506 507 // Configuration 508 const CONFIG = { 509 webhookUrl: 'https://sguyvapl1b.execute-api.eu-west-2.amazonaws.com/default/repro-website_forms', 510 recaptchaSiteKey: '6Ld2ZfMrAAAAAC_Regc-qG28myZShxLPcEiQM0Kg', // Your reCAPTCHA Site Key 511 pricing: { 512 GBP: { 513 USER_PRICE_PER_DAY: 7, 514 PROGRAM_PRICE_PER_DAY: 20, 515 SYMBOL: '£' 516 }, 517 USD: { 518 USER_PRICE_PER_DAY: 10, 519 PROGRAM_PRICE_PER_DAY: 27, 520 SYMBOL: '$' 521 }, 522 WEEKLY_MULTIPLIER: 3, 523 MIN_USERS: 5, 524 MIN_PROGRAMS: 1, 525 DEFAULT_USERS: 5, 526 DEFAULT_PROGRAMS: 1, 527 DEFAULT_CURRENCY: 'GBP' 528 } 529 }; 530 531 // Helper function to get elements by ID (tries multiple possible IDs) 532 const getElement = (id) => document.getElementById(id); 533 const getElementFlexible = (primaryId, ...fallbackIds) => { 534 const element = document.getElementById(primaryId); 535 if (element) return element; 536 for (const fallbackId of fallbackIds) { 537 const fallback = document.getElementById(fallbackId); 538 if (fallback) return fallback; 539 } 540 return null; 541 }; 542 543 // Form fields - universal set 544 const elements = { 545 // Contact fields (both form types) 546 firstName: getElement('firstName'), 547 lastName: getElement('lastName'), 548 userEmail: getElement('userEmail'), 549 phoneNumber: getElement('phoneNumber'), 550 orgName: getElementFlexible('orgName', 'Organisation-Name', 'organization'), // Try multiple IDs 551 hearAbout: getElement('hearAbout'), 552 jobRole: getElement('jobRole'), 553 message: getElement('message'), 554 formName: getElement('formName'), 555 useIntent: getElement('useIntent'), 556 companyFreelance: getElement('companyFreelance'), 557 558 // Pricing fields (flexible pricing only) 559 numberUsers: getElement('numberUsers'), 560 numberStreams: getElement('numberStreams'), 561 radioPerDay: getElement('radioPerDay'), 562 radioPerWeek: getElement('radioPerWeek'), 563 564 // Currency fields (flexible pricing only) 565 radioGBP: getElement('radioGBP'), 566 radioUSD: getElement('radioUSD'), 567 568 // Form elements 569 submitBtn: getElement('submitBtn') 570 }; 571 572 // Detect form type based on presence of pricing elements 573 const IS_PRICING_FORM = elements.numberUsers && elements.numberStreams; 574 const FORM_TYPE = IS_PRICING_FORM ? 'flexible-pricing' : 'free-enterprise'; 575 576 // Smart form type detection based on page URL 577 function detectFormTypeFromURL() { 578 const currentPath = window.location.pathname.toLowerCase(); 579 580 // Map URL paths to form types 581 if (currentPath.includes('/pricing-flexible')) return 'flexible-pricing'; 582 if (currentPath.includes('/pricing-free') || currentPath.includes('/free-trial')) return 'free'; 583 if (currentPath.includes('/pricing-enterprise')) return 'enterprise'; 584 if (currentPath.includes('/contact')) return 'contact'; 585 if (currentPath.includes('/pulsar')) return 'pulsar'; 586 if (currentPath.includes('/newsletter')) return 'newsletter'; 587 if (currentPath.includes('/whitepaper')) return 'whitepaper'; 588 589 // Fallback to element-based detection 590 return null; 591 } 592 593 // Detect form type from Webflow form name (data-name attribute) 594 function detectFormTypeFromFormName(formName) { 595 if (!formName) return null; 596 597 // Direct matches (must match FORM_TYPE_MAP in Lambda integration-config.js) 598 if (formName === 'flexible-pricing' || formName === 'Flexible Pricing UK') return 'flexible-pricing'; 599 if (formName === 'free' || formName === 'Free Plan' || formName === 'free-trial') return 'free'; 600 if (formName === 'enterprise' || formName === 'Enterprise Plan') return 'enterprise'; 601 if (formName === 'contact' || formName === 'Contact Form') return 'contact'; 602 if (formName === 'pulsar' || formName === 'Pulsar') return 'pulsar'; 603 if (formName === 'newsletter' || formName === 'Newsletter') return 'newsletter'; 604 if (formName === 'whitepaper' || formName === 'Technical & Security Whitepaper Form') return 'whitepaper'; 605 606 return null; 607 } 608 609 // Store selected currency for pricing calculations 610 let selectedCurrency = CONFIG.pricing.DEFAULT_CURRENCY; 611 612 // Store selected job department for webhook 613 let selectedJobDepartment = ''; 614 615 // Utility functions 616 const Utils = { 617 generateUniqueId: () => `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, 618 619 validateEmail: (email) => { 620 const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 621 return email && emailPattern.test(email.trim()); 622 }, 623 624 calculateDayPrice: () => { 625 if (!IS_PRICING_FORM) return 0; 626 const users = parseFloat(elements.numberUsers?.value) || 0; 627 const programs = parseFloat(elements.numberStreams?.value) || 0;
628 const prices = CONFIG.pricing[selectedCurrency]; 629 return (users * prices.USER_PRICE_PER_DAY) + (programs * prices.PROGRAM_PRICE_PER_DAY); 630 }, 631 632 calculateWeekPrice: () => { 633 return Utils.calculateDayPrice() * CONFIG.pricing.WEEKLY_MULTIPLIER; 634 }, 635 636 sendWebhook: async (data) => { 637 try { 638 const response = await fetch(CONFIG.webhookUrl, { 639 method: 'POST', 640 headers: { 641 'Content-Type': 'application/json', 642 }, 643 body: JSON.stringify(data) 644 }); 645 646 if (!response.ok) { 647 throw new Error(`HTTP error! status: ${response.status}`); 648 } 649 650 const responseData = await response.json(); 651 652 if (data.formType === 'checkout' && responseData.sessionUrl) { 653 window.location.href = responseData.sessionUrl; 654 return 'redirect'; // Signal that we're redirecting 655 } 656 657 return responseData; 658 } catch (error) { 659 console.error('Webhook error:', error); 660 return false; 661 } 662 }, 663 664 // NEW: Get reCAPTCHA token 665 getRecaptchaToken: async (action) => { 666 try { 667 // Check if grecaptcha is loaded 668 if (typeof grecaptcha === 'undefined') { 669 console.error('reCAPTCHA not loaded'); 670 return null; 671 } 672 673 const token = await grecaptcha.execute(CONFIG.recaptchaSiteKey, { action: action }); 674 return token; 675 } catch (error) { 676 console.error('reCAPTCHA error:', error); 677 return null; 678 } 679 } 680 }; 681 682 // Pricing calculations and display updates (only for pricing forms) 683 if (IS_PRICING_FORM) { 684 const updatePricingDisplay = () => { 685 const dayPrice = Utils.calculateDayPrice(); 686 const weekPrice = Utils.calculateWeekPrice(); 687 const currencySymbol = CONFIG.pricing[selectedCurrency].SYMBOL; 688 689 // Update display elements if they exist 690 const dayDisplay = document.getElementById('dayResultDisplay'); 691 const weekDisplay = document.getElementById('weekResultDisplay'); 692 693 if (dayDisplay) dayDisplay.textContent = `${currencySymbol}${dayPrice.toFixed(2)}`; 694 if (weekDisplay) weekDisplay.textContent = `${currencySymbol}${weekPrice.toFixed(2)}`; 695 696 // Update main display 697 const mainDisplay = document.querySelector('.calc-total h2'); 698 const periodLabel = document.querySelector('.calc-total p'); 699 700 if (mainDisplay && periodLabel) { 701 const isPerDay = elements.radioPerDay?.checked; 702 const selectedPrice = isPerDay ? dayPrice : weekPrice; 703 const period = isPerDay ? 'day' : 'week'; 704 705 mainDisplay.textContent = `${currencySymbol}${selectedPrice.toFixed(2)}`; 706 periodLabel.textContent = `Total price per ${period}`; 707 } 708 }; 709 710 // Set up pricing event listeners 711 if (elements.numberUsers) { 712 elements.numberUsers.setAttribute('min', CONFIG.pricing.MIN_USERS); 713 elements.numberUsers.addEventListener('input', updatePricingDisplay); 714 elements.numberUsers.addEventListener('blur', function() { 715 if ((parseFloat(this.value) || 0) < CONFIG.pricing.MIN_USERS) this.value = CONFIG.pricing.MIN_USERS; 716 updatePricingDisplay(); 717 }); 718 elements.numberUsers.value = CONFIG.pricing.DEFAULT_USERS; 719 } 720 721 if (elements.numberStreams) { 722 elements.numberStreams.addEventListener('input', updatePricingDisplay); 723 elements.numberStreams.value = CONFIG.pricing.DEFAULT_PROGRAMS; 724 } 725 726 if (elements.radioPerDay) { 727 elements.radioPerDay.addEventListener('change', updatePricingDisplay); 728 elements.radioPerDay.checked = true; 729 } 730 731 if (elements.radioPerWeek) { 732 elements.radioPerWeek.addEventListener('change', updatePricingDisplay); 733 } 734 735 // Set up currency toggle event listeners 736 if (elements.radioGBP) { 737 elements.radioGBP.addEventListener('change', () => { 738 selectedCurrency = 'GBP'; 739 updatePricingDisplay(); 740 }); 741 } 742 743 if (elements.radioUSD) { 744 elements.radioUSD.addEventListener('change', () => { 745 selectedCurrency = 'USD'; 746 updatePricingDisplay(); 747 }); 748 } 749 750 // Set GBP as default after a small delay to let Webflow initialize 751 setTimeout(() => { 752 if (elements.radioGBP && !elements.radioGBP.checked && !elements.radioUSD.checked) { 753 elements.radioGBP.click(); 754 } 755 }, 100); 756 757 // Initial pricing calculation 758 updatePricingDisplay(); 759 } 760 761 // Hidden fields storage (from query string parameters) 762 let hiddenFields = { 763 env: null, 764 orgId: null, 765 userId: null, 766 appUser: null 767 }; 768 769 // Pre-populate form fields from URL query parameters 770 const prePopulateFromURL = () => { 771 const params = new URLSearchParams(window.location.search); 772 773 // Capture hidden fields from query string (for existing RePro app users) 774 if (params.has('env')) hiddenFields.env = params.get('env'); 775 if (params.has('orgId')) hiddenFields.orgId = params.get('orgId'); 776 if (params.has('userId')) hiddenFields.userId = params.get('userId'); 777 if (params.has('appUser')) hiddenFields.appUser = params.get('appUser')
777=== 'true' || params.get('appUser') === true; 778 if (params.has('formName')) hiddenFields.formName = params.get('formName'); 779 if (params.has('formType')) hiddenFields.formType = params.get('formType'); 780 781 // Map visible form fields 782 const fieldMapping = { 783 firstName: elements.firstName, 784 lastName: elements.lastName, 785 userEmail: elements.userEmail, 786 phoneNumber: elements.phoneNumber, 787 orgName: elements.orgName, 788 hearAbout: elements.hearAbout, 789 jobRole: elements.jobRole, 790 message: elements.message, 791 useIntent: elements.useIntent, 792 companyFreelance: elements.companyFreelance, 793 numberUsers: elements.numberUsers, 794 numberStreams: elements.numberStreams 795 }; 796 797 Object.entries(fieldMapping).forEach(([param, element]) => { 798 if (element && params.has(param)) { 799 element.value = params.get(param); 800 } 801 }); 802 803 // Handle billing period radio buttons 804 if (params.has('billingPeriod')) { 805 const period = params.get('billingPeriod'); 806 if (period === 'daily' || period === 'per-day') { 807 if (elements.radioPerDay) elements.radioPerDay.checked = true; 808 } else if (period === 'weekly' || period === 'per-week') { 809 if (elements.radioPerWeek) elements.radioPerWeek.checked = true; 810 } 811 } 812 813 // Handle currency radio buttons 814 if (params.has('currency')) { 815 const curr = params.get('currency').toUpperCase(); 816 if (curr === 'GBP') { 817 if (elements.radioGBP) { 818 elements.radioGBP.checked = true; 819 selectedCurrency = 'GBP'; 820 } 821 } else if (curr === 'USD') { 822 if (elements.radioUSD) { 823 elements.radioUSD.checked = true; 824 selectedCurrency = 'USD'; 825 } 826 } 827 } 828 829 // Trigger pricing update if pricing fields were populated 830 if (IS_PRICING_FORM && (params.has('numberUsers') || params.has('numberStreams'))) { 831 const updatePricingDisplayFunc = document.querySelector('.calc-total'); 832 if (updatePricingDisplayFunc) { 833 // Trigger the pricing update 834 setTimeout(() => { 835 if (elements.numberUsers) elements.numberUsers.dispatchEvent(new Event('input')); 836 }, 100); 837 } 838 } 839 }; 840 841 // Call pre-population on page load 842 prePopulateFromURL(); 843 844 // Submit button state management 845 let isSubmitting = false; 846 const btnIsInput = elements.submitBtn?.tagName === 'INPUT'; 847 if (elements.submitBtn) elements.submitBtn.setAttribute('data-original-text', btnIsInput ? elements.submitBtn.value : elements.submitBtn.textContent); 848 function setBtnState(s) { 849 const b = elements.submitBtn; 850 if (!b) return; 851 isSubmitting = s === 'submitting'; 852 b.disabled = isSubmitting; 853 b.style.opacity = isSubmitting ? '0.6' : '1'; 854 b.style.cursor = isSubmitting ? 'not-allowed' : 'pointer'; 855 const txt = s === 'submitting' ? 'Submitting...' : s === 'timeout' ? 'Try again' : b.getAttribute('data-original-text') || 'Submit'; 856 if (btnIsInput) b.value = txt; else b.textContent = txt; 857 } 858 859 // Form submission handler 860 if (elements.submitBtn) { 861 elements.submitBtn.addEventListener('click', async function (e) { 862 e.preventDefault(); 863 if (isSubmitting) return; 864 865 // Basic validation 866 if (!Utils.validateEmail(elements.userEmail?.value)) { 867 alert('Please provide a valid email address.'); 868 return; 869 } 870 871 const recaptchaToken = await Utils.getRecaptchaToken('submit_form'); 872 873 if (!recaptchaToken) { 874 alert('Bot verification failed. Please try again or contact support if the problem persists.'); 875 console.error('Failed to get reCAPTCHA token'); 876 return; 877 } 878 879 // Try to find department for job role 880 let departmentValue = ''; 881 882 // Check multiple sources for department 883 departmentValue = window.selectedJobDepartment || 884 document.body.getAttribute('data-selected-department') || 885 ''; 886 887 // If still no department, try to find it from job data 888 if (!departmentValue && elements.jobRole?.value) { 889 try { 890 const jobDataElement = document.getElementById('jobRoleData'); 891 if (jobDataElement) { 892 const jobData = JSON.parse(jobDataElement.textContent); 893 const matchedJob = jobData.find(job => 894 job.role.toLowerCase().trim() === elements.jobRole.value.toLowerCase().trim() 895 ); 896 if (matchedJob) { 897 departmentValue = matchedJob.department; 898 } 899 } 900 } catch (error) {} 901 } 902 903 // Get form name from Webflow form element 904 const form = elements.submitBtn.closest('form'); 905 // IMPORTANT: Prefer data-name over name attribute (data-name has proper formatting with & and spaces) 906 let rawFormName = form?.getAttribute('data-name') || form?.getAttribute('name') || 907 form?.getAttribute('id') || 'Unknown Form';
908 909 // Clean up Webflow form name (remove wf-form- prefix and convert hyphens to spaces) 910 // Only needed if using the 'name' attribute (wf-form-*) 911 const webflowFormName = rawFormName.startsWith('wf-form-') 912 ? rawFormName.substring(8).replace(/-/g, ' ') 913 : rawFormName; 914 915 // Get form ID to differentiate between quote form and checkout form 916 const webflowFormId = form?.getAttribute('data-id') || form?.getAttribute('id') || ''; 917 918 // Build form data payload 919 const formData = { 920 // Unique ID 921 ID: Utils.generateUniqueId(), 922 923 // Contact Information 924 firstName: elements.firstName?.value || '', 925 lastName: elements.lastName?.value || '', 926 email: elements.userEmail?.value || '', 927 phoneNumber: elements.phoneNumber?.value || '', 928 organization: elements.orgName?.value || '', 929 hearAbout: elements.hearAbout?.value || '', 930 jobRole: elements.jobRole?.value || '', 931 message: elements.message?.value || '', 932 department: departmentValue, // From job role selection or lookup 933 934 // Form Information 935 name: hiddenFields.formName || webflowFormName, 936 formName: hiddenFields.formName || webflowFormName, 937 formSource: `webflow-${FORM_TYPE}`, 938 // Smart form type detection (priority order): 939 // 1. hiddenFields.formType (from URL params for testing) 940 // 2. detectFormTypeFromFormName() (from data-name attribute - e.g., "Email Form" → 'newsletter') 941 // 3. detectFormTypeFromURL() (from page URL - e.g., /pricing-free → 'free') 942 // 4. webflowFormId check (checkout detection) 943 // 5. IS_PRICING_FORM check (element-based detection) 944 // 6. Final fallback to 'contact' 945 formType: hiddenFields.formType || detectFormTypeFromFormName(webflowFormName) || detectFormTypeFromURL() || (webflowFormId === 'checkoutFlexiblePricing' ? 'checkout' : (IS_PRICING_FORM ? 'flexible-pricing' : 'contact')), 946 formId: webflowFormId || `${FORM_TYPE}-universal-v2`, 947 948 // Free Enterprise specific fields 949 useIntent: elements.useIntent?.value || '', 950 companyFreelance: elements.companyFreelance?.value || '', 951 952 // Hidden fields (from query string - for existing RePro app users) 953 env: hiddenFields.env, 954 orgId: hiddenFields.orgId, 955 userId: hiddenFields.userId, 956 appUser: hiddenFields.appUser, 957 958 // NEW: reCAPTCHA token 959 recaptchaToken: recaptchaToken, 960 961 // Timestamp 962 submittedAt: new Date().toISOString() 963 }; 964 965 // Add pricing information if it's a pricing form 966 if (IS_PRICING_FORM) { 967 const isPerDay = elements.radioPerDay?.checked; 968 const selectedPrice = isPerDay ? Utils.calculateDayPrice() : Utils.calculateWeekPrice(); 969 const billingPeriod = isPerDay ? 'per-day' : 'per-week'; 970 const currentPrices = CONFIG.pricing[selectedCurrency]; 971 972 // Add pricing data 973 Object.assign(formData, { 974 price: selectedPrice, // Price in selected currency 975 currency: selectedCurrency, // Currency code (GBP or USD) 976 users: parseFloat(elements.numberUsers?.value) || 0, 977 programs: parseFloat(elements.numberStreams?.value) || 0, 978 billingPeriod: billingPeriod, 979 frequency: billingPeriod, // Alternative field name 980 selectedPrice: selectedPrice.toFixed(2), 981 982 priceBreakdown: { 983 userPricePerDay: currentPrices.USER_PRICE_PER_DAY, 984 programPricePerDay: currentPrices.PROGRAM_PRICE_PER_DAY, 985 weeklyMultiplier: CONFIG.pricing.WEEKLY_MULTIPLIER, 986 pricingModel: isPerDay ? 'daily' : 'weekly', 987 currency: selectedCurrency, 988 currencySymbol: currentPrices.SYMBOL 989 } 990 }); 991 } 992 993 // Send to webhook 994 setBtnState('submitting'); 995 const safetyTimeout = setTimeout(() => setBtnState('timeout'), 20000); 996 const webhookResponse = await Utils.sendWebhook(formData); 997 clearTimeout(safetyTimeout); 998 999 if (webhookResponse === 'redirect') { 1000 return; 1001 } 1002 1003 if (webhookResponse && webhookResponse !== false) { 1004 // Save Intercom JWT to localStorage if present 1005 if (webhookResponse.intercomJWT && elements.userEmail?.value) { 1006 try { 1007 const now = new Date(); 1008 const expiresAt = new Date(now.getTime() + 55 * 60 * 1000); // 55 minutes from now (JWT expires in 1h) 1009 1010 const sessionData = { 1011 jwt: webhookResponse.intercomJWT, 1012 email: elements.userEmail.value, 1013 intercomUserId: webhookResponse.results?.intercom?.contactId || null, 1014 expiresAt: expiresAt.toISOString() 1015 }; 1016 1017 localStorage.setItem('reproIntercomSession', JSON.stringify(sessionData)); 1018 1019 // Update Intercom with authenticated session 1020 if (typeof window.Intercom === 'function') { 1021 window.Intercom('update', { 1022 email: elements.userEmail.value, 1023 intercom_user_jwt: webhookResponse.intercomJWT 1024 }); 1025 } 1026 } catch (error) { 1027 console.error('[Intercom JWT] Error saving session:', error); 1028 } 1029 } 1030 1031 const form = elements.submitBtn.closest('form'); 1032 const successMessage = form?.parentElement?.querySelector('.w-form-done'); 1033 1034 if (form && successMessage) { 1035 form.style.display = 'none'; 1036 successMessage.style.display = 'block'; 1037 } else { 1038 alert('Form submitted successfully! We will contact you soon.'); 1039 } 1040 } else { 1041 setBtnState('idle'); 1042 const errForm = elements.submitBtn.closest('form'); 1043 const errEl = errForm?.parentElement?.querySelector('.w-form-fail'); 1044 if (errEl) errEl.style.display = 'block'; 1045 else alert('There was an error submitting the form. Please try again.'); 1046 } 1047 }); 1048 } 1049}); 1050</script>
1050 1051 1052<!-- Hidden element to store the job data -->
1053<script id="jobRoleData" type="application/json"> 1054[ 1055 {"department": "Above the Line", "role": "Director"}, 1056 {"department": "Above the Line", "role": "Producer"}, 1057 {"department": "Above the Line", "role": "Executive Producer"}, 1058 {"department": "Above the Line", "role": "Writer"}, 1059 {"department": "Above the Line", "role": "Screenplay Writer"}, 1060 {"department": "Above the Line", "role": "Actor"}, 1061 {"department": "Above the Line", "role": "Cast"}, 1062 {"department": "Camera & Electrical", "role": "Cinematographer"}, 1063 {"department": "Camera & Electrical", "role": "Director of Photography"}, 1064 {"department": "Camera & Electrical", "role": "Camera Operator"}, 1065 {"department": "Camera & Electrical", "role": "Steadicam Operator"}, 1066 {"department": "Camera & Electrical", "role": "Focus Puller"}, 1067 {"department": "Camera & Electrical", "role": "1st Assistant Camera"}, 1068 {"department": "Camera & Electrical", "role": "2nd Assistant Camera"}, 1069 {"department": "Camera & Electrical", "role": "Camera Trainee"}, 1070 {"department": "Camera & Electrical", "role": "Digital Imaging Technician (DIT)"}, 1071 {"department": "Camera & Electrical", "role": "Video Assist Operator"}, 1072 {"department": "Camera & Electrical", "role": "Gaffer"}, 1073 {"department": "Camera & Electrical", "role": "Best Boy Electric"}, 1074 {"department": "Camera & Electrical", "role": "Electrician"}, 1075 {"department": "Camera & Electrical", "role": "Lighting Technician"}, 1076 {"department": "Camera & Electrical", "role": "Drone Pilot"}, 1077 {"department": "Camera & Electrical", "role": "Aerial Cinematographer"}, 1078 {"department": "Sound Department", "role": "Sound Mixer"}, 1079 {"department": "Sound Department", "role": "Production Sound Mixer"}, 1080 {"department": "Sound Department", "role": "Boom Operator"}, 1081 {"department": "Sound Department", "role": "Sound Recordist"}, 1082 {"department": "Sound Department", "role": "1st Assistant Sound"}, 1083 {"department": "Sound Department", "role": "Re-recording Mixer"}, 1084 {"department": "Sound Department", "role": "Sound Designer"}, 1085 {"department": "Sound Department", "role": "Sound Editor"}, 1086 {"department": "Sound Department", "role": "Supervising Sound Editor"}, 1087 {"department": "Sound Department", "role": "Foley Artist"}, 1088 {"department": "Sound Department", "role": "Foley Editor"}, 1089 {"department": "Sound Department", "role": "ADR Mixer"}, 1090 {"department": "Sound Department", "role": "Sound Mix Technician"}, 1091 {"department": "Art Department", "role": "Production Designer"}, 1092 {"department": "Art Department", "role": "Art Director"}, 1093 {"department": "Art Department", "role": "Supervising Art Director"}, 1094 {"department": "Art Department", "role": "Set Decorator"}, 1095 {"department": "Art Department", "role": "Property Master"}, 1096 {"department": "Art Department", "role": "Props Master"}, 1097 {"department": "Art Department", "role": "Assistant Art Director"}, 1098 {"department": "Art Department", "role": "Set Dresser"}, 1099 {"department": "Art Department", "role": "Dressing Props"}, 1100 {"department": "Art Department", "role": "Graphic Designer"}, 1101 {"department": "Art Department", "role": "Scenic Artist"}, 1102 {"department": "Art Department", "role": "Construction Coordinator"}, 1103 {"department": "Art Department", "role": "Draughtsperson"}, 1104 {"department": "Art Department", "role": "Standby Props"}, 1105 {"department": "Costume & Makeup", "role": "Costume Designer"}, 1106 {"department": "Costume & Makeup", "role": "Assistant Costume Designer"}, 1107 {"department": "Costume & Makeup", "role": "Costume Supervisor"}, 1108 {"department": "Costume & Makeup", "role": "Wardrobe Assistant"}, 1109 {"department": "Costume & Makeup", "role": "Costume Daily"}, 1110 {"department": "Costume & Makeup", "role": "Costume Cutter"}, 1111 {"department": "Costume & Makeup", "role": "Hair & Makeup Artist (HMU)"}, 1112 {"department": "Costume & Makeup", "role": "Makeup Designer"}, 1113 {"department": "Costume & Makeup", "role": "Makeup Supervisor"}, 1114 {"department": "Costume & Makeup", "role": "Hair Designer"}, 1115 {"department": "Costume & Makeup", "role": "Hair Supervisor"}, 1116 {"department": "Costume & Makeup", "role": "Special Makeup Effects Artist"}, 1117 {"department": "Costume & Makeup", "role": "Prosthetics Artist"}, 1118 {"department": "Post-Production", "role": "Editor"}, 1119 {"department": "Post-Production", "role": "Assistant Editor"}, 1120 {"department": "Post-Production", "role": "2nd Assistant Editor"}, 1121 {"department": "Post-Production", "role": "Colorist"}, 1122 {"department": "Post-Production", "role": "Colourist"}, 1123 {"department": "Post-Production", "role": "Post-Production Supervisor"}, 1124 {"department": "Post-Production", "role": "Post-Production Coordinator"}, 1125 {"department": "Post-Production", "role": "Digital Intermediate Producer"}, 1126 {"department": "Post-Production", "role": "VFX Supervisor"}, 1127 {"department": "Post-Production", "role": "Visual Effects Supervisor"}, 1128 {"department": "Post-Production", "role": "VFX Producer"}, 1129 {"department": "Post-Production", "role": "Visual Effects Producer"}, 1130 {"department": "Post-Production", "role": "VFX Artist"}, 1131 {"department": "Post-Production", "role": "Visual Effects Artist"}, 1132 {"department": "Post-Production", "role": "Digital Compositor"}, 1133 {"department": "Post-Production", "role": "Motion Graphics Designer"}, 1134 {"department": "Production Management", "role": "Line Producer"}, 1135 {"department": "Production Management", "role": "Production Manager"}, 1136 {"department": "Production Management", "role": "Unit Production Manager"}, 1137 {"department": "Production Management", "role": "Production Supervisor"}, 1138 {"department": "Production Management", "role": "Production Coordinator"}, 1139 {"department": "Production Management", "role": "Production Assistant (PA)"}, 1140 {"department": "Production Management", "role": "Script Supervisor"}, 1141 {"department": "Production Management", "role": "Script Coordinator"}, 1142 {"department": "Production Management", "role": "1st Assistant Director (1st AD)"}, 1143 {"department": "Production Management", "role": "2nd Assistant Director (2nd AD)"}, 1144 {"department": "Production Management", "role": "3rd Assistant Director (3rd AD)"}, 1145 {"department": "Location & Logistics", "role": "Location Manager"}, 1146 {"department": "Location & Logistics", "role": "Supervising Location Manager"}, 1147 {"department": "Location & Logistics", "role": "Assistant Location Manager"}, 1148 {"department": "Location & Logistics", "role": "Location Scout"}, 1149 {"department": "Location & Logistics", "role": "Location Coordinator"}, 1150 {"department": "Location & Logistics", "role": "Unit Manager"}, 1151 {"department": "Location & Logistics", "role": "Transportation Coordinator"}, 1152 {"department": "Location & Logistics", "role": "Cast Driver"}, 1153 {"department": "Location & Logistics", "role": "Unit Driver"}, 1154 {"department": "Location & Logistics", "role": "Equipment Driver"}, 1155 {"department": "Stunts & Special Effects", "role": "Stunt Coordinator"}, 1156 {"department": "Stunts & Special Effects", "role": "Stunt Performer"}, 1157 {"department": "Stunts & Special Effects", "role": "Stunt Double"}, 1158 {"department": "Stunts & Special Effects", "role": "Special Effects Supervisor"}, 1159 {"department": "Stunts & Special Effects", "role": "Special Effects Coordinator"}, 1160 {"department": "Stunts & Special Effects", "role": "Pyrotechnician"}, 1161 {"department": "Stunts & Special Effects", "role": "Armorer"}, 1162 {"department": "Music Department", "role": "Composer"}, 1163 {"department": "Music Department", "role": "Music Supervisor"}, 1164 {"department": "Music Department", "role": "Music Editor"}, 1165 {"department": "Music Department", "role": "Orchestrator"}, 1166 {"department": "Music Department", "role": "Music Producer"}, 1167 {"department": "Music Department", "role": "Music Preparation"}, 1168 {"department": "Casting", "role": "Casting Director"}, 1169 {"department": "Casting", "role": "Casting Associate"}, 1170 {"department": "Casting", "role": "Casting Assistant"}, 1171 {"department": "Casting", "role": "Extras Casting Director"}, 1172 {"department": "Specialized Roles", "role": "Intimacy Coordinator"}, 1173 {"department": "Specialized Roles", "role": "Dialect Coach"}, 1174 {"department": "Specialized Roles", "role": "Technical Advisor"}, 1175 {"department": "Specialized Roles", "role": "Consultant"}, 1176 {"department": "Specialized Roles", "role": "Animal Trainer"}, 1177 {"department": "Specialized Roles", "role": "Wrangler"}, 1178 {"department": "Specialized Roles", "role": "Food Stylist"}, 1179 {"department": "Specialized Roles", "role": "Marine Coordinator"}, 1180 {"department": "Specialized Roles", "role": "Safety Coordinator"}, 1181 {"department": "Specialized Roles", "role": "Set Medic"}, 1182 {"department": "Specialized Roles", "role": "Medical Supervisor"}, 1183 {"department": "Specialized Roles", "role": "Unit Publicist"}, 1184 {"department": "Business & Legal", "role": "Associate Producer"}, 1185 {"department": "Business & Legal", "role": "Co-Producer"}, 1186 {"department": "Business & Legal", "role": "Development Executive"}, 1187 {"department": "Business & Legal", "role": "Production Accountant"}, 1188 {"department": "Business & Legal", "role": "Completion Bond Representative"}, 1189 {"department": "Business & Legal", "role": "Legal Affairs"}, 1190 {"department": "Business & Legal", "role": "Talent Agent"}, 1191 {"department": "Business & Legal", "role": "Casting Agent"} 1192] 1193</script>
1193 1194
1195<script> 1196document.addEventListener('DOMContentLoaded', () => { 1197 // Find the input element with id="jobRole" 1198 const jobRoleInput = document.getElementById('jobRole'); 1199 1200 if (!jobRoleInput) return; 1201 1202 // Create suggestions container only (no selected info display) 1203 const suggestionsContainer = document.createElement('div'); 1204 suggestionsContainer.className = 'job-suggestions-container'; 1205 suggestionsContainer.id = 'job-suggestions-container'; 1206 1207 // Find the input's parent container 1208 const inputContainer = jobRoleInput.closest('.w-input') || jobRoleInput.parentElement; 1209 1210 if (!inputContainer) return; 1211 1212 // Place suggestions container after the input 1213 inputContainer.insertAdjacentElement('afterend', suggestionsContainer); 1214 1215 // Get job data from script tag 1216 const jobDataElement = document.getElementById('jobRoleData'); 1217 1218 if (!jobDataElement) return; 1219 1220 let jobData; 1221 try { 1222 jobData = JSON.parse(jobDataElement.textContent); 1223 } catch (error) { 1224 console.error('Failed to parse job data JSON:', error); 1225 return; 1226 } 1227 1228 if (!Array.isArray(jobData)) { 1229 console.error('Job data must be an array'); 1230 return; 1231 } 1232 1233 // Function to display suggestions 1234 const showSuggestions = (query) => { 1235 suggestionsContainer.innerHTML = ''; 1236 1237 if (query.length < 1) { 1238 suggestionsContainer.style.display = 'none'; 1239 return; 1240 } 1241 1242 const filteredJobs = jobData.filter(item => 1243 item.role.toLowerCase().includes(query.toLowerCase()) 1244 ); 1245 1246 if (filteredJobs.length > 0) { 1247 filteredJobs.forEach(job => { 1248 const suggestionDiv = document.createElement('div'); 1249 suggestionDiv.textContent = job.role; 1250 suggestionDiv.setAttribute('data-department', job.department); 1251 suggestionDiv.setAttribute('tabindex', '0'); 1252 suggestionDiv.style.padding = '12px 16px'; 1253 suggestionDiv.style.cursor = 'pointer'; 1254 suggestionDiv.style.borderBottom = '1px solid #f0f0f0'; 1255 1256 // Add click event to each suggestion 1257 suggestionDiv.addEventListener('click', () => { 1258 jobRoleInput.value = job.role; 1259 1260 window.selectedJobDepartment = job.department; 1261 document.body.setAttribute('data-selected-department', job.department); 1262 suggestionsContainer.style.display = 'none'; 1263 1264 // Trigger input event to notify Webflow of the change 1265 jobRoleInput.dispatchEvent(new Event('input', { bubbles: true })); 1266 jobRoleInput.dispatchEvent(new Event('change', { bubbles: true })); 1267 }); 1268 1269 // Add keyboard support for each suggestion 1270 suggestionDiv.addEventListener('keydown', (e) => { 1271 if (e.key === 'Enter' || e.key === ' ') { 1272 e.preventDefault(); 1273 suggestionDiv.click(); 1274 } 1275 }); 1276 1277 suggestionsContainer.appendChild(suggestionDiv); 1278 }); 1279 1280 // Add inline styles to ensure visibility with !important 1281 suggestionsContainer.style.setProperty('display', 'block', 'important'); 1282 suggestionsContainer.style.setProperty('position', 'relative', 'important'); 1283 suggestionsContainer.style.setProperty('width', '100%', 'important'); 1284 suggestionsContainer.style.setProperty('top', 'auto', 'important'); 1285 suggestionsContainer.style.setProperty('left', 'auto', 'important'); 1286 suggestionsContainer.style.setProperty('background', 'white', 'important'); 1287 suggestionsContainer.style.setProperty('border', '1px solid #ddd', 'important'); 1288 suggestionsContainer.style.setProperty('border-radius', '4px', 'important'); 1289 suggestionsContainer.style.setProperty('box-shadow', '0 2px 8px rgba(0, 0, 0, 0.1)', 'important'); 1290 suggestionsContainer.style.setProperty('max-height', '200px', 'important'); 1291 suggestionsContainer.style.setProperty('overflow-y', 'auto', 'important'); 1292 suggestionsContainer.style.setProperty('z-index', '9999', 'important'); 1293 1294 } else { 1295 suggestionsContainer.style.display = 'none'; 1296 } 1297 }; 1298 1299 // Event listener for when the user types in the input field 1300 jobRoleInput.addEventListener('input', (event) => { 1301 showSuggestions(event.target.value); 1302 }); 1303 1304 // Handle selection when the input loses focus 1305 jobRoleInput.addEventListener('blur', () => { 1306 setTimeout(() => { 1307 suggestionsContainer.style.display = 'none'; 1308 }, 200); 1309 }); 1310 1311 // Handle focus to show suggestions if there's already text 1312 jobRoleInput.addEventListener('focus', () => { 1313 if (jobRoleInput.value.length > 0) { 1314 showSuggestions(jobRoleInput.value); 1315 } 1316 }); 1317 1318 // Handle keyboard navigation 1319 jobRoleInput.addEventListener('keydown', (e) => { 1320 const suggestions = suggestionsContainer.querySelectorAll('div'); 1321 const activeSuggestion = document.activeElement; 1322 1323 if (e.key === 'ArrowDown') { 1324 e.preventDefault(); 1325 if (suggestions.length > 0) { 1326 if (activeSuggestion === jobRoleInput || !suggestionsContainer.contains(activeSuggestion)) { 1327 suggestions[0].focus(); 1328 } else { 1329 const currentIndex = Array.from(suggestions).indexOf(activeSuggestion); 1330 const nextIndex = Math.min(currentIndex + 1, suggestions.length - 1); 1331 suggestions[nextIndex].focus(); 1332 } 1333 } 1334 } else if (e.key === 'ArrowUp') { 1335 e.preventDefault(); 1336 if (suggestions.length > 0) { 1337 if (activeSuggestion === jobRoleInput || !suggestionsContainer.contains(activeSuggestion)) { 1338 suggestions[suggestions.length - 1].focus(); 1339 } else { 1340 const currentIndex = Array.from(suggestions).indexOf(activeSuggestion); 1341 const prevIndex = Math.max(currentIndex - 1, 0); 1342 if (prevIndex === 0 && currentIndex === 0) { 1343 jobRoleInput.focus(); 1344 } else { 1345 suggestions[prevIndex].focus(); 1346 } 1347 } 1348 } 1349 } else if (e.key === 'Escape') { 1350 suggestionsContainer.style.display = 'none'; 1351 jobRoleInput.focus(); 1352 } else if (e.key === 'Enter' && suggestionsContainer.contains(activeSuggestion)) { 1353 e.preventDefault(); 1354 activeSuggestion.click(); 1355 } 1356 }); 1357 1358}); 1359</script>
1359 1360 1361<!-- Newsletter Form Handler -->
1362<script> 1363document.addEventListener('DOMContentLoaded',function(){const b=document.getElementById('newsletterSubmitBtn');if(!b)return;const f=b.closest('form'),e=f?.querySelector('input[type="email"]');if(!f||!e)return;async function g(a){try{return await grecaptcha.execute('6Ld2ZfMrAAAAAC_Regc-qG28myZShxLPcEiQM0Kg',{action:a})}catch(c){return null}}f.addEventListener('submit',async function(a){a.preventDefault();const c=e.value.trim();if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(c)){alert('Please provide a valid email address.');return}const d=await g('newsletter_subscribe');if(!d){alert('Bot verification failed. Please try again.');return}try{const h=await fetch('https://dvbsjivwho7bpkpki7elfe7xca0zlmwy.lambda-url.eu-west-2.on.aws/',{method:'POST',headers:{'Content-Type':'application/json','X-Form-Name':'newsletter'},body:JSON.stringify({userEmail:c,formType:'newsletter',formName:'newsletter',recaptchaToken:d})}),r=await h.json();if(r.jwt){localStorage.setItem('reproIntercomSession',JSON.stringify({jwt:r.jwt,email:c,intercomUserId:r.intercomUserId,expiresAt:r.jwtExpiresAt}));window.Intercom?.('update',{user_hash:r.jwt,email:c,user_id:r.intercomUserId})}const s=f.parentElement?.querySelector('.w-form-done');if(s){f.style.display='none';s.style.display='block';setTimeout(()=>{e.value='';f.style.display='block';s.style.display='none'},3000)}}catch(err){const m=f.parentElement?.querySelector('.w-form-fail');m?m.style.display='block':alert('Something went wrong. Please try again.')}})}); 1364</script>
1364 1365 1366<!-- Hide reCAPTCHA Badge --> 1367<style> 1368 .grecaptcha-badge { 1369 visibility: hidden !important; 1370 opacity: 0 !important; 1371 pointer-events: none !important; 1372 } 1373</style> 1374</body></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.