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 In/​Sign 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> — for easy testing & app store publishing. 327 </li> 328 <li> 329 <strong>Publish in minutes</strong> — VoltBuilder uploads directly to Google Play and the Apple App Store. 330 </li> 331 <li> 332 <strong>Easily generate certificates</strong> — <a href="/VoltSigner/">VoltSigner</a> makes Android and iOS certificates. No Mac needed! 333 </li> 334 <li> 335 <strong>Nothing to install</strong> — just <a href="/upload/">head to the Uploads page</a> to get building. 336 </li> 337 <li> 338 <strong>Nothing to store</strong> — we don't keep your passwords, certs, or code in our cloud. 339 </li> 340 <li> 341 <strong>Always up-to-date</strong> — 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 © <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.