| layout | default |
|---|---|
| title | Get Pro |
| nav_order | 4 |
| description | Buy Off Grid Pro. Enter your email and check out. $50 one-time, no subscription. Have a promo code? Apply it at checkout. |
Off Grid Pro adds voice, custom personas, and tool integrations. All of it runs on your phone, the same as the rest. Enter your email below to check out. Your email is the account the purchase attaches to, so use the one you sign into the app with.
$50 one-time · no subscription · promo codes apply at checkout
Have a promo code? Enter it on the checkout page after this step. Checkout is handled by RevenueCat. Nothing on this page touches your phone's models or data.
You enter your email and we send you to RevenueCat's hosted checkout with that email attached. The purchase is tied to your email, so sign into the app with the same address to unlock Pro.
Have a promo code? Apply it on the checkout page, before you pay. The price updates once the code is accepted.
Pro is a one-time $50 purchase, not a subscription. The open-source core has 100K downloads already. Pro is an extension of it, not a rewrite.
If we do not ship Pro within 12 weeks, email us and you get a full refund.
<script src="{{ '/assets/js/revenuecat-link.js' | relative_url }}"></script> <script> (function() { var LINK_ID = {{ site.revenuecat_link_id | jsonify }}; var form = document.getElementById('payForm'); var emailInput = document.getElementById('payEmail'); var submit = document.getElementById('paySubmit'); var status = document.getElementById('payStatus'); if (!form || !window.RevenueCatLink) return; // Sync the button state on load too - the browser may have autofilled the // field (or restored it on back-navigation) without firing an input event. submit.disabled = emailInput.value.trim() === ''; function clearError() { emailInput.classList.remove('ea-input-error'); emailInput.setAttribute('aria-invalid', 'false'); if (status.classList.contains('ea-status-error')) { status.textContent = ''; status.className = 'ea-status'; } } function showError(message) { emailInput.classList.add('ea-input-error'); emailInput.setAttribute('aria-invalid', 'true'); status.textContent = message; status.className = 'ea-status ea-status-error'; } // Enable the button only once something is typed; clear errors as they type. emailInput.addEventListener('input', function() { submit.disabled = emailInput.value.trim() === ''; clearError(); }); form.addEventListener('submit', function(e) { e.preventDefault(); var email = emailInput.value.trim(); if (!RevenueCatLink.isValidEmail(email)) { showError('Enter a valid email address.'); emailInput.focus(); return; } var url = RevenueCatLink.buildPurchaseUrl(LINK_ID, email); if (!url) { // Email is valid, so a null URL means the link id is not configured. showError('Checkout is not available right now. Please try again later.'); return; } if (typeof posthog !== 'undefined') { // Never let an analytics failure (blocked, errored) stop the purchase. try { posthog.identify(email, { email: email }); posthog.capture('pro_checkout_started', { email: email, source: window.location.pathname }); } catch (err) { console.warn('PostHog tracking failed:', err); } } status.innerHTML = 'Checkout opened in a new tab. Reopen it if your browser blocked the popup.'; status.className = 'ea-status ea-status-success'; // No features string: a non-empty one forces a popup window; '_blank' // alone opens a real new tab and already defaults to noopener. window.open(url, '_blank'); }); })(); </script>