190 Countries, Zero API Calls: Shipping Static Data in a Chrome Extension This article explains how the Chrome extension EntryCheck avoids common patterns of using external APIs or local user storage by bundling a static dataset of visa requirements for over 190 countries directly into the extension. All lookups are performed client-side with zero network requests, using a compressed JSON matrix that enables instant, synchronous checks. The tradeoff of a larger initial bundle is justified by the infrequent nature of visa policy changes, eliminating latency, authentication, and network dependency issues. Most Chrome extensions that need data fall into one of two patterns: they call an external API, or they store a small amount of user-specific data locally. EntryCheck https://chromewebstore.google.com/detail/gfbdmeieifamgheecbmdpadniofodkfa does neither. It bundles a static dataset of visa requirements for 190+ passport/destination combinations directly into the extension and resolves every lookup client-side with zero network requests. This tradeoff — large bundle, instant lookups, no API dependency — turns out to be the right call for travel data. Here's why, and how it works. Why Static Over API Visa requirements don't change often. A country might update its visa-on-arrival list two or three times a year. An API would add latency, require authentication, and create a failure mode network unavailable, API down, rate-limited in a context where the user is typically trying to quickly check something before booking a flight. More practically: there's no reliable free public API for visa requirements. The data sources are government websites and reference databases. Scraping or licensing these for a real-time API isn't worth it for a tool whose value is speed and simplicity. A local JSON file loaded at extension startup sidesteps all of this. Data Structure The core dataset is a JSON object keyed by two-letter ISO passport code, then by two-letter destination code: type VisaStatus = | 'visa free' | 'visa on arrival' | 'e visa' | 'visa required' | 'not admitted'; interface EntryRequirement { status: VisaStatus; maxStay?: number; // days, undefined if no limit notes?: string; } type VisaMatrix = Record