GeoIcons

July 13, 2026 · View on GitHub

GeoIcons

Premium geographic map icons - 422 countries, territories & world areas - as tree-shakable components for React, Vue, Angular, and vanilla JS.

geoicons.io · Browse the catalog · Docs · Pricing

License: GPL v3 Commercial license available


⚖️ Dual-licensed: GPLv3 or Commercial

GeoIcons is free and open-source under the GNU GPLv3 - or available under a Commercial license for closed-source use. You pick the one that fits.

GPLv3 (free)Commercial (paid)
CostFreeOne-time or annual - see pricing
Your project must be…Open-source under a GPL-compatible license (copyleft)Anything - closed-source, proprietary, SaaS
Best forOSS projects, learning, prototypesCommercial products, client work, internal apps
TermsLICENSECOMMERCIAL-LICENSE.md

In plain terms: using GeoIcons under the free tier means the GPLv3 applies to your project too - it must be open-source. If your app is closed-source, proprietary, or commercial, you need a commercial license. Using the icons in a proprietary app without one violates the GPLv3.

Enforcement is legal, not technical. Icons always render the same - no watermark, no lock, no network call. The only nudge is a single client-side console.warn per session when no license is declared. See License & compliance below.


Packages

Each framework is a separate, independently versioned package. Install only what you use.

PackageFrameworkPeer requirement
@geoicons/reactReactreact >= 18
@geoicons/vueVuevue >= 3.0
@geoicons/angularAngular@angular/core >= 15.1
@geoicons/vanillaFramework-free (DOM)none
@geoicons/coreShared offline license verifier (dependency of the above)none

Quick start (React)

npm install @geoicons/react
import { Us, Jp } from '@geoicons/react/countries';

export function Example() {
  return (
    <>
      <Us size={48} />
      <Jp size={48} strokeWidth={0.5} className="text-blue-600" />
    </>
  );
}

No config, no CSS import - icons inherit currentColor. Full per-framework usage lives in each package README and at geoicons.io/docs.

Why GeoIcons

  • 422 icons - every country & territory (ISO 3166-1) plus continents, sub-regions, blocs, peninsulas, deserts, basins, and seas. The catalog keeps growing.
  • Tree-shakable - every icon is its own named export. import { Us, Jp } ships only those two, never the whole set. All packages are "sideEffects": false.
  • Styleable - one consistent 24×24 outline system. Set size and strokeWidth; color via native stroke/fill (themes through currentColor).
  • Accessible by default - decorative (aria-hidden) unless you pass an aria-label, which switches to role="img" + <title>.
  • Zero runtime deps - offline ES256 license verification via native Web Crypto.

License & compliance

Icons render identically no matter your license state. If a project uses them without a declared license, one console.warn fires per session (client-side only) nudging toward GPLv3 compliance or a commercial key. The optional provider verifies your license fully offline and silences the notice:

// Commercial - wrap once with your purchased key
<IconProvider licenseKey={process.env.NEXT_PUBLIC_GEOICONS_KEY}>…</IconProvider>

// Open-source - declare GPL compliance
<IconProvider licenseKey="GPL-MY-PROJECT-IS-OPEN-SOURCE">…</IconProvider>

Vue exposes the GeoiconsLicense plugin, Angular provideGeoiconsLicense(), and vanilla initGeoiconsLicense() - same offline check. See each package README.

Contributing

Code PRs are not accepted (this is a published mirror of a dual-licensed project). Issues are open - report a bug or request an icon/country. See CONTRIBUTING.md.

Security

Found a vulnerability? Please don't open a public issue - see SECURITY.md.


GeoIcons · geoicons.io · Dual-licensed GPLv3 or Commercial