GALACTIC GRID

Back to Master Journal IndexVolume IV // Entry #16
Volume IV: Performance, Beta Testing & Distribution

Progressive Web App (PWA) Wrappers: Desktop & Mobile Installation without App Store Gatekeepers

Choosing web-first PWA distribution, placing non-intrusive install prompts, and using localStorage for one-time welcome modals.

By Chris, Lead Product & UX Architect (with Scott, Lead Data Engineer)

When planning the distribution model for Galactic Grid, one of our earliest questions was whether we needed to build native mobile applications for the Apple App Store and Google Play Store.

In modern software development, the default assumption for many creators is that if you want to reach mobile users, you must package your app in Swift or Kotlin, navigate app store approval queues, pay developer account fees, and conform to proprietary store guidelines.

When you look at the landscape of successful daily web games, however, a clear pattern emerges: the most popular daily puzzle games are web-first. Players do not want to download a multi-megabyte native application from an app store just to solve a daily grid over their morning coffee. They want to open a URL, solve the puzzle, and continue with their day.

We decided to build Galactic Grid as a Progressive Web App (PWA).

A PWA delivers the best of both worlds: it operates as a fast, lightweight web application accessible from any browser, while offering full home-screen installation capabilities on iOS, Android, macOS, and Windows.

Why a Web-First PWA Strategy Works

Choosing a Progressive Web App wrapper over native store builds gave us several immediate advantages:

Zero App Store Gatekeepers: We do not have to wait for app review teams, deal with arbitrary store rejections, or maintain separate codebases for iOS and Android. When Scott and I push a bug fix or feature update to production, 100% of our global user base receives it instantly on their next page load.

Instant Accessibility: Players can launch the game directly from a browser link shared on social media, in an email, or via a group text without facing the friction of an app store download page.

Cross-Platform Parity: Whether a user plays on a desktop browser, an iPad, or an Android phone, the interface renders identically with desktop and mobile viewport optimizations.

By wrapping our web application in a PWA manifest and service worker config, users who want a native-like experience can install Galactic Grid directly onto their device's home screen or desktop dock with a single tap.

Strategic PWA Install Prompt Placement

While PWAs allow users to install the web app directly to their home screen, browser-native install prompts can be subtle or easy to miss on certain mobile viewports.

We wanted to ensure that players who desired a dedicated app icon could find the install option easily, without making the prompt feel pushy, disruptive, or intrusive to the core gameplay loop.

We placed non-intrusive "Install App" buttons in key, logical navigation areas across the platform:

Top Navigation Bar: A clean, branded install button sits near the header controls on desktop and tablet views, giving players a permanent, visible shortcut to add the app.

The "How to Play" Guide: Inside our onboarding and guide modals, we include a clear callout explaining that Galactic Grid can be installed directly to your home screen for one-tap daily access.

tsx
// Example PWA Install Prompt Trigger Component
export function PwaInstallButton() {
const [deferredPrompt, setDeferredPrompt] = useState<any>(null);
const [isInstallable, setIsInstallable] = useState(false);
useEffect(() => {
const handleBeforeInstallPrompt = (e: Event) => {
// Prevent browser's default automated mini-infobar
e.preventDefault();
// Stash event for manual trigger
setDeferredPrompt(e);
setIsInstallable(true);
};
window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt);
return () => {
window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt);
};
}, []);
const handleInstallClick = async () => {
if (!deferredPrompt) return;
// Show manual install prompt
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
if (outcome === 'accepted') {
setIsInstallable(false);
}
setDeferredPrompt(null);
};
if (!isInstallable) return null;
return (
<button
onClick={handleInstallClick}
className="px-3 py-1.5 text-xs font-mono text-cyan-300 border border-cyan-500/50 rounded bg-slate-900/80 hover:bg-cyan-950/50 hover:border-cyan-400 transition-all flex items-center gap-1.5 shadow-[0_0_10px_rgba(91,192,222,0.2)]"
>
<span>📱</span>
<span>Install App</span>
</button>
);
}

Importantly, our install buttons remain available even after a user installs the PWA. We don't try to hide or manipulate button visibility based on complex client checks; the installation option stays clean, static, and predictable wherever it resides.

Email Over Apps: The True Habit Loop Engine

Even with full PWA installation support, Scott and I always recognize that the primary engine driving daily player retention is not an installed app icon sitting buried on page three of a smartphone home screen.

It is our morning email transmission.

A home screen icon requires the user to remember to tap it every morning. An email transmission, by contrast, meets the player where they already are. When our morning email lands in a player's inbox containing yesterday's sector statistics, global average scores, and top rarity achievements, it acts as a direct, friction-free gateway into the daily board.

The PWA wrapper provides convenience for our most dedicated players who want a standalone window, but our email subscription list remains the heart of our daily community habit loop.

Smart Onboarding Memory: The First-Time Welcome Modal

While we avoid hiding install buttons, we apply strict client-side memory controls to onboarding modals to protect returning players from repetitive pop-up fatigue.

When a player visits Galactic Grid for the very first time on a specific device, our system displays a one-time Welcome Modal. The modal greets the user and offers three quick options:

Launch the interactive 57-second tutorial.
Open the comprehensive "How to Play" guide.
Jump straight into the active daily grid.
+-----------------------------------------------------------------------+
| FIRST-TIME USER WELCOME MODAL |
+-----------------------------------------------------------------------+
| WELCOME TO GALACTIC GRID |
| Test your lore knowledge in a daily 3x3 relational gauntlet. |
| |
| [ Launch 57s Tutorial ] [ How to Play Guide ] [ Play Daily Grid ] |
+-----------------------------------------------------------------------+

To ensure this welcome modal never annoys returning daily players, we store a persistent flag in the user's browser localStorage.

The moment a player closes or interacts with the welcome modal, the browser writes galactic_grid_welcome_seen = true to its local device vault. Every subsequent visit checks this flag instantly during initial page load. Returning players bypass the modal entirely, landing directly on an active, quick-striking game board without a single extra click.

// Local Storage Check for One-Time Welcome Modal
export function useFirstTimeVisitorCheck() {
const [showWelcomeModal, setShowWelcomeModal] = useState(false);
useEffect(() => {
// Check local device vault for previous visit record
const hasSeenWelcome = localStorage.getItem('galactic_grid_welcome_seen');
if (!hasSeenWelcome) {
setShowWelcomeModal(true);
}
}, []);
const dismissWelcomeModal = () => {
// Lock flag in localStorage so modal never pops up on this device again
localStorage.setItem('galactic_grid_welcome_seen', 'true');
setShowWelcomeModal(false);
};
return { showWelcomeModal, dismissWelcomeModal };
}

Respecting local device memory ensures that onboarding pop-ups serve their purpose for new players without getting in the way of experienced daily fans.

Key Takeaways for Indie Developers

Packaging your web app as a Progressive Web App gives you distribution flexibility without sacrificing speed.

Consider Web-First PWAs: You do not always need native iOS or Android app store builds. A well-configured PWA provides one-tap installation while keeping your deployment pipeline instant and gatekeeper-free.

Place Install Triggers Thoughtfully: Position non-intrusive "Install App" shortcuts in navigation headers or help guides where interested users can easily discover them.

Rely on Direct Retention Drivers: Use email notifications or voluntary reminders to build daily habit loops rather than relying solely on installed app icons.

Use localStorage for Onboarding Memory: Guard first-time welcome pop-ups and onboarding prompts with local device flags so returning users enjoy an instant, frictionless game board every single day.

By leveraging Progressive Web App capabilities alongside smart localStorage onboarding checks, we built an application that feels like a native app on mobile devices while remaining open, accessible, and instant to play on the open web.