PageSourceSearch

https://volt.build/news/2025/07/25/weekly-wrap-up.html

html volt.build collected 2026-10-02 03:19:44 UTC 19,814 bytes, 428 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en"><head>
3  <meta charset="utf-8">
3<script src="/assets/js/sentry.browser.min.js"></script>
vendor: 1 bytes, line 3
3
4<script src="/assets/js/sentry-scrubber.js"></script>
vendor: 1 bytes, line 4
4
5<script>
6  const getEventUserAgent = (event) => {
7    const headers = event?.request?.headers;
8    const headerEntries = Array.isArray(headers)
9      ? headers
10      : Object.entries(headers || {}).map(([name, value]) =>
11          Array.isArray(value) && value.length === 2 ? value : [name, value],
12        );
13    const userAgent = headerEntries.find(
14      ([name]) =>
15        typeof name === "string" && name.toLowerCase() === "user-agent",
16    )?.[1];
17
18    return typeof userAgent === "string" ? userAgent : null;
19  };
20
21  const isCrawler404Event = (event) => {
22    if (!document.querySelector('[data-page-type="404"]')) return false;
23
24    return Sentry.isbot(getEventUserAgent(event));
25  };
26
27  const isBotAuth0SdkUnavailableEvent = (event) =>
28    event?.message === "[auth0] auth0 SDK unavailable" &&
29    Sentry.isbot(getEventUserAgent(event));
30
31  // auth0-spa-js logs this internally (console.error, never thrown to our code) when it
32  // revalidates a stale cached ID token; our own redirect-callback handling in auth0.js
33  // never sees or reacts to it, so it carries no actionable signal for us.
34  const isAuth0SpaJsExpClaimNoise = (event, values, frames) => {
35    const hasExpClaimMessage =
36      event?.logger === "console" &&
37      typeof event?.message === "string" &&
38      /Expiration Time \(exp\) claim error in the ID token/.test(event.message);
39    const isRedirectCallbackFailure = event?.extra?.arguments?.some(
40      (argument) =>
41        typeof argument === "string" &&
42        (argument === "auth0 redirect callback error" ||
43          argument.includes("[auth0] auth0 redirect callback error")),
44    );
45    const hasExpClaimException = values?.some(
46      (value) =>
47        typeof value?.value === "string" &&
48        /Expiration Time \(exp\) claim error in the ID token/.test(value.value),
49    );
50    const hasAuth0SpaJsFrames =
51      frames?.length &&
52      frames.some(
53        (frame) =>
54          typeof frame?.filename === "string" &&
55          frame.filename.includes("auth0-spa-js"),
56      );
57
58    return Boolean(
59      !isRedirectCallbackFailure &&
60        (hasExpClaimMessage ||
61          (event?.logger === "console" &&
62            hasAuth0SpaJsFrames &&
63            hasExpClaimException)),
64    );
65  };
66
67  const voltSentryBeforeSend = (event, hint) => {
68    const scrubbedEvent = window.voltSentryScrubber.scrubSentryEvent(event, hint);
69
70    // Auth0 diagnostics from crawlers cannot represent an interactive login failure.
71    if (isBotAuth0SdkUnavailableEvent(scrubbedEvent)) return null;
72
73    // Crawlers commonly execute the shared 404 page; do not report its diagnostics.
74    if (isCrawler404Event(scrubbedEvent)) return null;
75
76    const exceptionValues = scrubbedEvent?.exception?.values;
77    const frames = exceptionValues?.flatMap((value) =>
78      Array.isArray(value?.stacktrace?.frames) ? value.stacktrace.frames : [],
79    );
80
81    if (isAuth0SpaJsExpClaimNoise(event, exceptionValues, frames)) {
82      return null;
83    }
84
85    // Drop third-party browser-extension crashes so first-party app issues stay actionable.
86    if (
87      frames?.some(
88        (frame) =>
89          typeof frame?.filename === "string" &&
90          frame.filename.startsWith("chrome-extension://"),
91      )
92    ) {
93      return null;
94    }
95
96    // Drop CDP-injected automation/bot script errors (e.g. ad-verification crawlers): no real
97    // source file anywhere in the trace, plus the "UtilityScript" marker CDP's Runtime.evaluate leaves behind.
98    if (
99      frames?.length &&
100      frames.every(
101        (frame) => !frame?.filename || frame.filename === "<anonymous>",
102      ) &&
103      frames.some(
104        (frame) =>
105          typeof frame?.function === "string" &&
106          frame.function.startsWith("UtilityScript"),
107      )
108    ) {
109      return null;
110    }
111
112    return scrubbedEvent;
113  };
114
115  Sentry.init({
116    dsn: "https://[email protected]/26838",
117    environment: "production",
118    release: "voltbuilder-site@20226f03b8c04b3bf3663c23e0df2ce8ef8c5897",
119    // @sentry/browser v11 removed enableLogs; consoleLoggingIntegration now captures unconditionally.
120    ignoreErrors: [/disconnected port object/i],
121    integrations: (defaults) =>
122      defaults
123        .filter((i) => i.name !== "BrowserSession")
124        .concat([
125          Sentry.captureConsoleIntegration({ levels: ["error", "assert"] }),
126          Sentry.consoleLoggingIntegration({
127            levels: ["warn"],
128          }),
129        ]),
130    beforeSend: voltSentryBeforeSend,
131    beforeSendLog: window.voltSentryScrubber.scrubSentryLog,
132  });
133</script>
133
134<!-- Google Tag Manager -->
135  
135<script>
vendor: 343 bytes, lines 135-139
135(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
136    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
137    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
138    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
139    })(window,document,'script','dataLayer','
139GTM-WH2BLBZ5
vendor: 6 bytes, lines 139-140
139');
140  
140</script>
140
141  <!-- End Google Tag Manager -->
142  <meta name="title" content="VoltBuilder">
143  <meta name="robots" content="index, follow">
144  <meta name="language" content="English">
145  <meta http-equiv="X-UA-Compatible" content="IE=edge">
146  <meta name="viewport" content="width=device-width, initial-scale=1">
147
148  <meta name="twitter:site" content="@voltbuilder">
149  
150    <meta name="twitter:description" content="This week, we added a feature that allows you to configure your release status when uploading your Android builds to Google Play. We also began a beta test to add support for using a custom Cordova...">
151  
152  <meta name="twitter:image" content='https://volt.build/assets/images/voltbuilder-1080.png'>
153  <meta name="twitter:image:alt" content="VoltBuilder Logo">
154  <meta property="og:image" content='https://volt.build/assets/images/voltbuilder-1200x630.png'>
155  <meta property="og:image:alt" content="VoltBuilder Logo"><!-- Begin Jekyll SEO tag v2.8.0 -->
156<title>Weekly Wrap-up: July 25, 2025 | VoltBuilder</title>
157<meta name="generator" content="Jekyll v3.10.0" />
158<meta property="og:title" content="Weekly Wrap-up: July 25, 2025" />
159<meta property="og:locale" content="en_US" />
160<meta name="description" content="This week, we added a feature that allows you to configure your release status when uploading your Android builds to Google Play. We also began a beta test to add support for using a custom Cordova Android engine version 9.1.1." />
161<meta property="og:description" content="This week, we added a feature that allows you to configure your release status when uploading your Android builds to Google Play. We also began a beta test to add support for using a custom Cordova Android engine version 9.1.1." />
162<link rel="canonical" href="https://volt.build/news/2025/07/25/weekly-wrap-up.html" />
163<meta property="og:url" content="https://volt.build/news/2025/07/25/weekly-wrap-up.html" />
164<meta property="og:site_name" content="VoltBuilder" />
165<meta property="og:type" content="article" />
166<meta property="article:published_time" content="2025-07-25T10:00:00-04:00" />
167<meta name="twitter:card" content="summary" />
168<meta property="twitter:title" content="Weekly Wrap-up: July 25, 2025" />
169<script type="application/ld+json">
170{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2025-07-25T10:00:00-04:00","datePublished":"2025-07-25T10:00:00-04:00","description":"This week, we added a feature that allows you to configure your release status when uploading your Android builds to Google Play. We also began a beta test to add support for using a custom Cordova Android engine version 9.1.1.","headline":"Weekly Wrap-up: July 25, 2025","mainEntityOfPage":{"@type":"WebPage","@id":"https://volt.build/news/2025/07/25/weekly-wrap-up.html"},"url":"https://volt.build/news/2025/07/25/weekly-wrap-up.html"}</script>
170
171<!-- End Jekyll SEO tag -->
172<link
173      rel="stylesheet"
174      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
175  />
176  <link
177      rel="stylesheet"
178      href="https://cdn.auth0.com/js/auth0-samples-theme/1.0/css/auth0-theme.min.css"
179  />
180  <link href="https://fonts.googleapis.com/css?family=Raleway:700,500,400,300,400italic" rel="stylesheet" type="text/css">
181  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css">
182  <link rel="stylesheet" href="/assets/css/styles.css"/><link type="application/atom+xml" rel="alternate" href="https://volt.build/feed.xml" title="VoltBuilder" /><!-- VoltBuilder - Google tag (gtag.js) website GA4 property and Ads -->
vendor: 64 bytes, lines 182-183
182
183<script async src="https://www.googletagmanager.com/gtag/js?id=
183G-XPJQFDJ3PM
vendor: 12 bytes, line 183
183"></script>
184<script>
185  
vendor: 134 bytes, lines 185-189
185window.dataLayer = window.dataLayer || [];
186  function gtag(){dataLayer.push(arguments);}
187  gtag('js', new Date());
188
189  gtag('config', '
189G-XPJQFDJ3PM
vendor: 6 bytes, lines 189-190
189');
190  
190gtag('config', 'AW-1071252111');
191</script>
vendor: 1 bytes, line 191
191
192<script src="/assets/js/google-analytics.js"></script>
192
193</head>
194<body id="body" class="vflex"><!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 194-195
194
195<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
195GTM-WH2BLBZ5
vendor: 86 bytes, lines 195-197
195"
196  height="0" width="0" style="display:none;visibility:hidden"></iframe>
197</noscript>
198<!-- End Google Tag Manager (noscript) -->
199<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
vendor: 1 bytes, line 199
199
200<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 200
200
201<script src="https://cdn.auth0.com/js/auth0-spa-js/1.9.0/auth0-spa-js.production.js"></script>
vendor: 1 bytes, line 201
201
202<script src="/assets/js/auth0.js"></script>
vendor: 1 bytes, line 202
202
203<script src="/assets/js/default.js"></script>
203
204
205<header class="site-header" role="banner">
206
207  <div class="nav-top"><a class="site-title site-logo-left" rel="author" href="/">VoltBuilder</a><nav class="site-nav">
208        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
209        <label for="nav-trigger">
210          <span class="menu-icon">
211            <svg viewBox="0 0 18 15" width="18px" height="15px">
212              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
213            </svg>
214          </span>
215        </label>
216
217        <div class="trigger site-nav-bottom">
218          
219          
220            <a class="page-link" href="/tutorial/">
221              <i class="bi bi-lightning"></i> Tutorial
222            </a>
223          
224          
225          
226            <a class="page-link" href="/blog/">
227              <i class="bi bi-newspaper"></i> News
228            </a>
229          
230          
231          
232            <a class="page-link" href="/docs/all/">
233              <i class="bi bi-file-earmark-text"></i> Docs
234            </a>
235          
236          
237          
238            <a class="page-link" href="/support/">
239              <i class="bi bi-chat-right-text"></i> Support
240            </a>
241          
242          
243          
244            <a class="page-link" href="/plan/">
245              <i class="bi bi-tags"></i> Pricing
246            </a>
247          
248          
249          
250            <a class="page-link" href="/upload/">
251              <i class="bi bi-cloud-upload"></i> Upload
252            </a>
253          
254          
255          
256            <div class="page-link search-link">
257              <div id="search-icon">
258                <i class="bi bi-search"></i> <span class="name">Search</span>
259              </div>
260              <div class="arrow-up"></div>
261              <div id="search-box-wrapper">
262                <input type="search" id="search-box" class="searchbox" placeholder="Search" />
263                <div class="search-button"><i class="bi bi-search"></i></div>
264              </div>
265            </div>
266          
267          
268        </div>
269      </nav><div id="divHeaderRight">
270      <button id="btnLogin" class="btn btn-primary" hidden onclick="login()">Log&nbsp;In/&ZeroWidthSpace;Sign&nbsp;Up</button>
271      <div id="btnLoggedUser" hidden>
272        <input type="checkbox" id="userTrigger" />
273        <label for="userTrigger">
274          <span id="loggedUserIcon"></span>
275        </label>
276        <div class="popup user-nav-bottom">
277          <div class="row-user" id="loggedUserEmail"></div>
278          <a id="aPlan" href="/plan/">Plan Settings</a>
279          <a id="aKey" href="/getactivationcode/">Get Activation Code</a>
280          <a class="row-logout" onclick="logout()" href="#">Logout</a>
281        </div>
282      </div>
283    </div>
284  </div>
285
286  
287
288  <div id="popupOverlay"></div>
289</header>
290
291<script src="/assets/js/header.js"></script>
291
292<div class="scrollable">
293
294      <div class="contentPane">
295
296        <article class="post">
297
298          <h1>Weekly Wrap-up: July 25, 2025</h1>
299
300          <p>This week, we added a feature that allows you to configure your release status when uploading your Android builds to Google Play. We also began a beta test to add support for using a custom Cordova Android engine version 9.1.1.</p>
301
302<h2 id="set-your-own-release-status">Set Your Own Release Status</h2>
303
304<p>Now you can use the <code class="language-plaintext highlighter-rouge">googlePlayReleaseStatus</code> attribute in your <code class="language-plaintext highlighter-rouge">voltbuilder.json</code> file to configure your app’s release status. You can set your status to one of four accepted release statuses: <code class="language-plaintext highlighter-rouge">completed</code>, <code class="language-plaintext highlighter-rouge">draft</code>, <code class="language-plaintext highlighter-rouge">halted</code>, or <code class="language-plaintext highlighter-rouge">inProgress</code>. The default value is <code class="language-plaintext highlighter-rouge">completed</code>. If you’re not sure which status to use, you can review the status definitions in the <a href="https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks#status" target="\_blank">Google Play Developer API Documentation</a>.</p>
305
306<p>Check out what Android (and iOS) build attributes you can add to your <code class="language-plaintext highlighter-rouge">voltbuilder.json</code> over in our project set-up documentation for <a href="/docs/set_up/#voltbuilderjson">Cordova</a> or <a href="/docs/set_up-capacitor/#voltbuilderjson">Capacitor</a>.</p>
307
308<h2 id="custom-cordova-android-engine-911---now-in-beta">Custom Cordova Android Engine 9.1.1 - Now in beta!</h2>
309
310<p>We’re adding support for using a custom Cordova Android engine 9.1.1 - and this feature is currently in beta! If you’d like to get involved in the beta, <a href="mailto:[email protected]?subject=Custom%20Engine%209.1.1%20Beta">email [email protected]</a>!</p>
311
312<h2 id="wrapping-up">Wrapping Up</h2>
313
314<p>We’re on the lookout for things we can do to make your experience on our site and using our build service better. If you have questions, feedback, or need support, drop us a line on our <a href="https://forum.volt.build/" target="\_blank">Support Forum</a> — we’ll be happy to hear from you!</p>
315
316<p>That’s all for this week! Happy building!</p>
317<section class="repeat-news bleed">
318  <h2>What VoltBuilder Does</h2>
319
320  <p>VoltBuilder converts your web projects into native Android and iOS apps. VoltBu
320ilder is a wrapper for Apache Cordova and Ionic Capacitor, so you can add native features to your apps via <a href="https://www.npmjs.com/search?q=cordova">Cordova</a> and <a href="https://www.npmjs.com/search?q=capacitor">Capacitor</a> plugins.</p>
321
322  <p>VoltBuilder's Key features:</p>
323
324  <ul>
325    <li>
326      <strong>Produces native executables</strong> &mdash; for easy testing & app store publishing.
327    </li>
328    <li>
329      <strong>Publish in minutes</strong> &mdash; VoltBuilder uploads directly to Google Play and the Apple App Store.
330    </li>
331    <li>
332      <strong>Easily generate certificates</strong> &mdash; <a href="/VoltSigner/">VoltSigner</a> makes Android and iOS certificates. No Mac needed!
333    </li>
334    <li>
335      <strong>Nothing to install</strong> &mdash; just <a href="/upload/">head to the Uploads page</a> to get building.
336    </li>
337    <li>
338      <strong>Nothing to store</strong> &mdash; we don't keep your passwords, certs, or code in our cloud.
339    </li>
340    <li>
341      <strong>Always up-to-date</strong> &mdash; we install and maintain the latest SDKs and tooling so you don't have to.
342    </li>
343  </ul>
344
345  <h2>How to Use VoltBuilder</h2>
346
347  <p>It's as simple as Upload, Download, Run. Done.</p>
348
349  <ol>
350    <li>Zip your web project.</li>
351    <li><a href="/upload/">Upload it</a> to our platform.</li>
352    <li>Download the native app or let us deploy it to stores.</li>
353    <li>Run it instantly via QR code or direct link for testing.</li>
354  </ol>
355
356  <h2>Ready to Build?</h2>
357
358  <p>Skip the native-dev hassle. <a href="/plan/">Sign up</a> and start your first build today!</p>
359</section></article>
360
361      </div><section class="join-newsletter">
362  <form action="https://news.voltbuilder.com/subscribe" method="POST" accept-charset="utf-8">
363    <div class="wrapper">
364      <div>
365        <div class="title">Join Our Newsletter</div>
366        <div class="subtitle">Stay up to date on all of the latest news and updates for VoltBu
366ilder</div>
367      </div>
368      <div class="signUpBtnWrapper">
369        <input type="email" name="email" id="txtJoinNewsletterEmail" placeholder="Enter your email" />
370        <button type="submit" id="btnJoinNewsletterSignUp">Sign Up!</button>
371        <div style="display:none;">
372          <input type="text" name="hp" id="hp"/>
373        </div>
374        <input type="hidden" name="list" value="r4lP5uG9kzmIqTQ9c8tqVA"/>
375        <input type="hidden" name="subform" value="yes"/>
376      </div>
377    </div>
378  </form>
379</section>
380<footer class="site-footer h-card">
381  <div class="wrapper">
382
383    <h2 class="footer-heading">VoltBuilder</h2>
384
385    <div class="footer-col-wrapper flex-left-start">
386      <div class="footer-column">
387        <a href="/blog/">News</a><br>
388        <a href="https://status.volt.build/">Server Status</a>
389        <div class="divider"></div>
390      </div>
391
392      <div class="footer-column">
393        <div class="follow-links">
394          <p class="follow-p">Follow Us:</p>
395          <div class="follow-icons">
396            
397            <a href="https://github.com/voltbuilder" target="_blank" rel="noopener noreferrer" class="social-icon">
398              <img src="/assets/images/github.svg" alt="GitHub icon"></a>
399            
400            <a href="https://mastodon.social/@voltbuilder" target="_blank" rel="noopener noreferrer" class="social-icon">
401              <img src="/assets/images/mastodon.svg" alt="Mastodon icon"></a>
402            
403            <a href="https://bsky.app/profile/voltbuilder.bsky.social" target="_blank" rel="noopener noreferrer" class="social-icon">
404              <img src="/assets/images/bluesky.svg" alt="Bluesky icon"></a>
405            
406          </div>
407        </div><a class="u-email" href="mailto:[email protected]">[email protected]</a><br><div class="divider"></div>
408      </div>
409
410      <div class="footer-column">
411        <a href="/privacy">Privacy Policy</a><br>
412        <a href="/TOS">Terms of Service</a><br>
413      </div>
414
415      <div class="footer-column">App Builds Made Simple!</div>
416    </div>
417
418    <div class="margin-top txt-small">
419      &copy; <span class="copyright-year">2026</span> NS Basic LLC. <span class="nowrap">All rights reserved.</span>
420    </div>
421  </div>
422
423</footer>
424</div>
425
426  </body>
427
428</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.