PageSourceSearch

https://repro-stream-stg2.webflow.io/pulsar

html repro-stream-stg2.webflow.io collected 2026-10-03 13:38:58 UTC 108,602 bytes, 1,374 lines download raw bytes

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.