---
title: "Peer Dependencies"
description: "Which packages each v-maplibre component requires, and how to install only what you use."
canonical_url: "https://v-maplibre.geoql.in/guide/peer-dependencies"
---
# Peer Dependencies

> Which packages each v-maplibre component requires, and how to install only what you use.

## TL;DR

Only `@geoql/v-maplibre` and `maplibre-gl` are **required**. Everything below is **opt-in** — install the peer dependencies for the components you actually import.

```bash
pnpm add @geoql/v-maplibre maplibre-gl
```

That alone unlocks the core map, markers, popups, MapLibre native layers, and standard controls. The deck.gl, COG, Wind, LiDAR, and Starfield layers each pull in their own peer packages — install them only when you use those components.

<callout icon="i-lucide-info">

Missing a peer dep at runtime now produces an **actionable error** that names the package and prints the install command, rather than the opaque `Cannot find module '…'` you may have seen before.

</callout>

## Core (always required)

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Required peer dep(s)
    </th>
    
    <th>
      Install command
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VMap
      </code>
      
      , <code>
        VMarker
      </code>
      
      , <code>
        VPopup
      </code>
    </td>
    
    <td>
      <code>
        maplibre-gl
      </code>
    </td>
    
    <td>
      <code>
        pnpm add @geoql/v-maplibre maplibre-gl
      </code>
    </td>
  </tr>
</tbody>
</table>

## MapLibre native layers + standard controls

All of these ship with `@geoql/v-maplibre` and need **no extra peers** beyond `maplibre-gl`:

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Notes
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerMaplibreGeojson
      </code>
    </td>
    
    <td>
      Standard GeoJSON source + layer
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreCluster
      </code>
    </td>
    
    <td>
      Point clustering
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreVector
      </code>
    </td>
    
    <td>
      Vector tile source
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreRaster
      </code>
    </td>
    
    <td>
      Raster tile source
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreImage
      </code>
    </td>
    
    <td>
      Image source (e.g. radar overlay)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreVideo
      </code>
    </td>
    
    <td>
      Video source
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreCanvas
      </code>
    </td>
    
    <td>
      Canvas source
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibrePmtile
      </code>
    </td>
    
    <td>
      PMTiles archives (uses <code>
        pmtiles
      </code>
      
       — already a hard dep)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreRoute
      </code>
    </td>
    
    <td>
      Polyline routing
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMaplibreIsochrone
      </code>
    </td>
    
    <td>
      Polygon isochrones
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VControlNavigation
      </code>
      
       / <code>
        Scale
      </code>
      
       / <code>
        Geolocate
      </code>
      
       / <code>
        Fullscreen
      </code>
      
       / <code>
        Attribution
      </code>
    </td>
    
    <td>
      Native MapLibre controls
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VControlLayer
      </code>
      
       / <code>
        VControlLayerGroup
      </code>
      
       / <code>
        VControlLegend
      </code>
    </td>
    
    <td>
      Visibility + legend controls
    </td>
  </tr>
</tbody>
</table>

## deck.gl base (shared by every deck.gl layer)

Every `VLayerDeckgl*` component goes through a shared `MapboxOverlay`. Install these once and they cover the whole deck.gl family:

```bash
pnpm add @deck.gl/core @deck.gl/mapbox
```

Most layers additionally need **one** of the deck.gl module packages below.

### deck.gl `@deck.gl/layers` (core 2D primitives)

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer dep added
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerDeckglScatterplot
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglArc
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeojson
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglPath
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglLine
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglPolygon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglSolidPolygon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglIcon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglText
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglColumn
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglBitmap
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGridCell
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglPointCloud
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckgl
      </code>
      
       (generic)
    </td>
    
    <td>
      — (you supply the deck.gl <code>
        Layer
      </code>
      
       instance)
    </td>
  </tr>
</tbody>
</table>

### deck.gl `@deck.gl/aggregation-layers` (binning / aggregation)

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/aggregation-layers
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer dep added
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerDeckglHeatmap
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/aggregation-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglHexagon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/aggregation-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGrid
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/aggregation-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglContour
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/aggregation-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglScreenGrid
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/aggregation-layers
      </code>
    </td>
  </tr>
</tbody>
</table>

### deck.gl `@deck.gl/geo-layers` (tiling + indexing)

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/geo-layers
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer dep added
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerDeckglTrips
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglH3Hexagon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglH3Cluster
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglMVT
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglTile
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglTile3D
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglTerrain
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGreatCircle
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglS2
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeohash
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglQuadkey
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglWMS
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
    </td>
  </tr>
</tbody>
</table>

### deck.gl `@deck.gl/mesh-layers` (3D meshes)

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/mesh-layers
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer dep added
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerDeckglSimpleMesh
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/mesh-layers
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglScenegraph
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/mesh-layers
      </code>
    </td>
  </tr>
</tbody>
</table>

## deck.gl raster (COG / Mosaic / MultiCOG)

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers \
  @developmentseed/deck.gl-geotiff \
  @developmentseed/deck.gl-raster \
  @developmentseed/geotiff \
  @developmentseed/proj
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Adds (on top of deck.gl base)
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerCog
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        @developmentseed/deck.gl-geotiff
      </code>
      
      , <code>
        @developmentseed/deck.gl-raster
      </code>
      
      , <code>
        @developmentseed/geotiff
      </code>
      
      , <code>
        @developmentseed/proj
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMosaic
      </code>
    </td>
    
    <td>
      same as COG
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerMultiCog
      </code>
    </td>
    
    <td>
      same as COG
    </td>
  </tr>
</tbody>
</table>

## deck.gl Zarr

```bash
pnpm add @deck.gl/core @deck.gl/mapbox \
  @developmentseed/deck.gl-raster \
  @developmentseed/deck.gl-zarr \
  @developmentseed/proj \
  zarrita
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer deps
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerZarr
      </code>
    </td>
    
    <td>
      <code>
        @developmentseed/deck.gl-raster
      </code>
      
      , <code>
        @developmentseed/deck.gl-zarr
      </code>
      
      , <code>
        @developmentseed/proj
      </code>
      
      , <code>
        zarrita
      </code>
    </td>
  </tr>
</tbody>
</table>

## deck.gl GeoArrow

Render Apache Arrow `Table` / `RecordBatch` data with GeoArrow extension types directly — no GeoJSON parsing. Each layer takes an `apache-arrow.Table` (or single `RecordBatch`) as its `data` prop. **No runtime dependency on @geoarrow/deck.gl-geoarrow** — the wrappers extract GeoArrow geometry columns and feed flat-buffer attributes to stock `@deck.gl/layers` (and `@deck.gl/geo-layers` for trips).

```bash
pnpm add @deck.gl/core @deck.gl/mapbox @deck.gl/layers apache-arrow
# +@deck.gl/geo-layers if you use VLayerDeckglGeoArrowTrips
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer deps
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowScatterplot
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowPath
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowPolygon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowSolidPolygon
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowText
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        VLayerDeckglGeoArrowTrips
      </code>
    </td>
    
    <td>
      <code>
        @deck.gl/geo-layers
      </code>
      
      , <code>
        apache-arrow
      </code>
    </td>
  </tr>
</tbody>
</table>

## Wind particles

```bash
pnpm add @deck.gl/core @deck.gl/mapbox maplibre-gl-wind
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer deps
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerWindParticle
      </code>
    </td>
    
    <td>
      <code>
        maplibre-gl-wind
      </code>
      
       (provides the GPU particle layer)
    </td>
  </tr>
</tbody>
</table>

## LiDAR (COPC / LAZ)

```bash
pnpm add maplibre-gl-lidar
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer deps
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VControlLidar
      </code>
    </td>
    
    <td>
      <code>
        maplibre-gl-lidar
      </code>
      
       0.21+ (loaded lazily on first mount)
    </td>
  </tr>
</tbody>
</table>

## Starfield

```bash
pnpm add @geoql/maplibre-gl-starfield
```

<table>
<thead>
  <tr>
    <th>
      Component
    </th>
    
    <th>
      Peer deps
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        VLayerStarfield
      </code>
    </td>
    
    <td>
      <code>
        @geoql/maplibre-gl-starfield
      </code>
    </td>
  </tr>
</tbody>
</table>

## How v-maplibre reports missing peers

When a component initialises and discovers a peer dep is missing, it now throws an error that looks like:

```text
[@geoql/v-maplibre] Missing optional peer dependency "@developmentseed/deck.gl-geotiff".
Install it with: pnpm add @deck.gl/core @deck.gl/layers @deck.gl/mapbox \
  @developmentseed/deck.gl-geotiff @developmentseed/deck.gl-raster \
  @developmentseed/geotiff @developmentseed/proj
Original error: Cannot find module '@developmentseed/deck.gl-geotiff'
```

This is produced by the public `requirePeer` helper, which is also exported from the package if you need to wrap your own dynamic peer-dep loads:

```ts
import { requirePeer } from '@geoql/v-maplibre';

const { LidarControl } = await requirePeer(
  'maplibre-gl-lidar',
  () => import('maplibre-gl-lidar'),
);
```

<callout icon="i-lucide-book" to="https://v-maplibre.geoql.in/guide/getting-started">

**Next:** see the [Getting Started](https://v-maplibre.geoql.in/guide/getting-started) guide for the minimal setup, then explore the [Layer docs](https://v-maplibre.geoql.in/layers/deckgl-overview) for component-by-component reference.

</callout>


## Sitemap

See the full [sitemap](https://v-maplibre.geoql.in/sitemap.md) for all pages.
