This is an automated email from the ASF dual-hosted git repository.

adrabble pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps-site.git


The following commit(s) were added to refs/heads/main by this push:
     new f3816a3  Rework the documentation (#1)
f3816a3 is described below

commit f3816a34ebc2eb837557989ffe0495ea36ba3764
Author: Antoine Drabble <[email protected]>
AuthorDate: Thu Dec 8 14:47:50 2022 +0100

    Rework the documentation (#1)
    
    * Rework de documentation
    
    * Add maven guide
    
    * Fix output sample in developer manual of IP to location
---
 .asf.yaml                                          |    2 +-
 .gitignore                                         |    3 +-
 Gemfile.lock                                       |    5 +-
 _data/menu.yaml                                    |   46 +-
 _layouts/default.html                              |    8 +-
 _sass/skeleton.scss                                |   14 +-
 about.md                                           |   11 +-
 assets/demo.html                                   |    8 +-
 developer-manual/geocoder/index.md                 |    9 +
 developer-manual/how-to-build-with-maven/index.md  |    9 +
 developer-manual/index.md                          |   18 +
 developer-manual/ip-to-location/index.md           |  111 ++
 developer-manual/project-structure/index.md        |   17 +
 developer-manual/setup-in-intellij/index.md        |   13 +
 .../stylesheet/stylesheet.md                       |    6 +-
 examples/{extrusion => _extrusion}/index.md        |    4 +-
 examples/{extrusion => _extrusion}/screenshot.png  |  Bin
 examples/{geoadmin => _geoadmin}/index.md          |    0
 examples/contour/indexes.sql                       |    0
 .../contour/liecthenstein-aster-dem-v2-3857.tif    |  Bin 1966773 -> 0 bytes
 examples/contour/liecthenstein-aster-dem-v2.tif    |  Bin 1739201 -> 0 bytes
 examples/contour/style.json                        |   31 -
 examples/contour/tileset.json                      |   29 -
 examples/extrusion/indexes.sql                     |    5 -
 examples/extrusion/style.json                      |   31 -
 examples/extrusion/tileset.json                    |   31 -
 examples/extrusion/workflow.json                   |   42 -
 examples/geoadmin/style.json                       |   31 -
 examples/geoadmin/tileset.json                     |   29 -
 examples/geoadmin/tileset.yaml                     |   19 -
 examples/geocoding/index.md                        |   36 +
 .../index.md                                       |   32 +-
 examples/import-naturalearth-into-postgis/index.md |   49 +
 .../database.png                                   |  Bin
 .../index.md                                       |   95 +-
 examples/index.md                                  |   31 +-
 examples/ip-to-location/index.md                   |   51 +
 examples/naturalearth/index.md                     |   46 -
 examples/naturalearth/indexes.sql                  |  135 --
 examples/naturalearth/style.json                   |   33 -
 examples/naturalearth/tileset.json                 | 1360 --------------------
 examples/naturalearth/workflow.json                |   32 -
 examples/openstreetmap/indexes.sql                 |    5 -
 .../openstreetmap/liechtenstein-latest.osm.pbf     |  Bin 2710779 -> 0 bytes
 examples/openstreetmap/screenshot.png              |  Bin 262397 -> 0 bytes
 examples/openstreetmap/style.js                    |   26 -
 examples/openstreetmap/style.json                  |   26 -
 examples/openstreetmap/tileset.json                |  521 --------
 examples/openstreetmap/workflow.json               |   42 -
 examples/serve-vector-tiles/index.md               |   95 ++
 getting-started/index.md                           |   15 +
 getting-started/installing-postgis/index.md        |   33 +
 getting-started/installing-the-cli/index.md        |   35 +
 index.html                                         |   12 +-
 installation.md                                    |   53 -
 notes/postgis.md                                   |    2 +-
 56 files changed, 626 insertions(+), 2671 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
index 6e666d2..9677690 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -15,7 +15,7 @@
 #
 
 github:
-  description: Create custom vector tiles from OpenStreetMap and other data 
sources with Postgis and Java.
+  description: Apache Baremaps is a toolkit and a set of infrastructure 
components for creating, publishing, and operating online maps. It provides a 
data pipeline enabling developers to build maps with different data sources 
with live reload capabilities. It provides other services commonly used in 
online maps, such as location search and IP to location.
   homepage: https://baremaps.apache.org
   labels:
     - java 
diff --git a/.gitignore b/.gitignore
index 9c8ca10..fbaadfb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,5 @@ _site/
 .jekyll-metadata
 # Ignore folders generated by Bundler
 .bundle/
-vendor/
\ No newline at end of file
+vendor/
+.idea/
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
index 954cf68..a7dd89e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -213,6 +213,8 @@ GEM
     minitest (5.16.3)
     nokogiri (1.13.9-x86_64-darwin)
       racc (~> 1.4)
+    nokogiri (1.13.9-x86_64-linux)
+      racc (~> 1.4)
     octokit (4.25.1)
       faraday (>= 1, < 3)
       sawyer (~> 0.9)
@@ -253,6 +255,7 @@ GEM
 
 PLATFORMS
   x86_64-darwin-21
+  x86_64-linux
 
 DEPENDENCIES
   github-pages (~> 227)
@@ -262,4 +265,4 @@ DEPENDENCIES
   jekyll-sitemap (~> 1.4.0)
 
 BUNDLED WITH
-   2.3.11
+   2.3.22
diff --git a/_data/menu.yaml b/_data/menu.yaml
index 79b485e..58f3411 100644
--- a/_data/menu.yaml
+++ b/_data/menu.yaml
@@ -1,18 +1,42 @@
 items:
-  - page: <i class="fas fa-bullseye"></i> About
+  - page: <i class="fas fa-info-circle"></i> About
     url: /about/
-  - page: <i class="fas fa-download"></i> Installation
-    url: /installation/
+  - page: <i class="fas fa-rocket"></i> Getting Started
+    url: /getting-started/
+    subitems:
+      - page: Installing the CLI
+        url: /getting-started/installing-the-cli/
+      - page: Installation PostGIS
+        url: /getting-started/installing-postgis/
   - page: <i class="fas fa-vial"></i> Examples
     url: /examples/
     subitems:
-      - page: OpenStreetMap
-        url: /examples/openstreetmap/
-      - page: NaturalEarth
-        url: /examples/naturalearth/
-      - page: Contour
-        url: /examples/contour/
-  - page: <i class="fas fa-paint-roller"></i> Stylesheet
-    url: /stylesheet/
+      - page: Import OSM data into PostGIS
+        url: /examples/import-osm-into-postgis/
+      - page: Import Natural Earth data into PostGIS
+        url: /examples/import-naturalearth-into-postgis/
+      - page: Import contour lines into PostGIS
+        url: /examples/import-contour-into-postgis/
+      - page: Serve vector tiles from PostGIS
+        url: /examples/serve-vector-tiles/
+      - page: Create an IP to location web service
+        url: /examples/ip-to-location/
+      - page: Create a geocoding web service
+        url: /examples/geocoding/
+  - page: <i class="fas fa-code"></i> Developer Manual
+    url: /developer-manual/
+    subitems:
+      - page: Project structure
+        url: /developer-manual/project-structure/
+      - page: How to build with Maven
+        url: /developer-manual/how-to-build-with-maven/
+      - page: Set up in IntelliJ IDEA
+        url: /developer-manual/setup-in-intellij/
+      - page: Geocoder
+        url: /developer-manual/geocoder/
+      - page: IP to location
+        url: /developer-manual/ip-to-location/
+      - page: Stylesheet
+        url: /developer-manual/stylesheet/
   - page: <i class="fas fa-map"></i> Demo
     url: /assets/demo.html
\ No newline at end of file
diff --git a/_layouts/default.html b/_layouts/default.html
index 17d4722..8872d19 100644
--- a/_layouts/default.html
+++ b/_layouts/default.html
@@ -15,11 +15,11 @@
               <h2 class="logo"><a href="/"><i class="far fa-map"></i> {{ 
site.title }}</a></h2>
               <p>{{ site.description }}</p>
               <p>
-                <a class="github-button" 
href="https://github.com/baremaps/baremaps"; data-size="large" 
data-show-count="true"
-                   aria-label="Star baremaps/baremaps on GitHub">Star</a>
-                <a class="github-button" 
href="https://github.com/baremaps/baremaps/releases/latest";
+                <a class="github-button" 
href="https://github.com/apache/incubator-baremaps"; data-size="large" 
data-show-count="true"
+                   aria-label="Star apache/incubator-baremaps on 
GitHub">Star</a>
+                <a class="github-button" 
href="https://github.com/apache/incubator-baremaps/releases/latest";
                    data-color-scheme="no-preference: light; light: light; 
dark: dark;" data-size="large"
-                   aria-label="Download baremaps/baremaps on 
GitHub">Download</a>
+                   aria-label="Download apache/incubator-baremaps on 
GitHub">Download</a>
               </p>
             </header>
             <nav>
diff --git a/_sass/skeleton.scss b/_sass/skeleton.scss
index f28bf6c..231cbd2 100644
--- a/_sass/skeleton.scss
+++ b/_sass/skeleton.scss
@@ -288,20 +288,24 @@ label > .label-body {
 /* Lists
 –––––––––––––––––––––––––––––––––––––––––––––––––– */
 ul {
-  list-style: circle inside; }
+  list-style: circle outside; }
 ol {
-  list-style: decimal inside; }
-ol, ul {
-  padding-left: 0;
-  margin-top: 0; }
+  list-style: decimal outside; }
 ul ul,
 ul ol,
 ol ol,
 ol ul {
+  padding-left: 0;
   margin: 1.5rem 0 1.5rem 3rem;
   font-size: 90%; }
+nav > ul {
+  margin-left: 0;
+  padding-left: 0;
+}
 li {
   margin-bottom: 1rem; }
+li ul {
+  margin-top: 1rem; }
 
 
 /* Code
diff --git a/about.md b/about.md
index d354461..6463327 100644
--- a/about.md
+++ b/about.md
@@ -1,22 +1,21 @@
 ---
 layout: default
 title: About
-description: An open source toolkit for creating vector tiles from 
OpenStreetMap and other data sources.
+description: Apache Baremaps is a toolkit and a set of infrastructure 
components for creating, publishing, and operating online maps. It provides a 
data pipeline enabling developers to build maps with different data sources 
with live reload capabilities. It provides other services commonly used in 
online maps, such as location search and IP to location.
 permalink: /about/
 ---
 
 # About
 
-Baremaps is an [open 
source](https://github.com/baremaps/baremaps/blob/master/LICENSE) toolkit for 
creating vector tiles from [OpenStreetMap](https://www.openstreetmap.org) and 
other data sources.
+Apache Baremaps is an  [open 
source](https://github.com/apache/incubator-baremaps/blob/main/LICENSE) toolkit 
and a set of infrastructure components for creating, publishing, and operating 
online maps. It provides a data pipeline enabling developers to build maps with 
different data sources. It offers live reload capabilities that allow 
cartographers to customize the content and the style of a map. It includes an 
attribution-free map schema and style that stimulates derived work. Finally, 
[...]
 
 [![State of the map](/assets/screenshot.jpg)](/assets/demo.html)
 
-It is inspired by [Osmosis](https://github.com/openstreetmap/osmosis), but it 
comes with additional features, such as the ability to:
+Apache Baremaps is inspired by 
[Osmosis](https://github.com/openstreetmap/osmosis), but it comes with 
additional features, such as the ability to:
+
 -   Process data in parallel with the [Stream 
API](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)
 introduced in Java 8
 -   Import data faster with the [COPY 
API](https://www.postgresql.org/docs/11/sql-copy.html) of Postgresql
 -   Create postgis geometries on the fly with 
[JTS](https://github.com/locationtech/jts)
 -   Create and serve customized [Vector 
Tiles](https://docs.mapbox.com/vector-tiles/specification/)
 
-On the longer run, the aim of the project is to work with a variety of data 
sources in order to create highly specialized and customized maps.
-
-
+On the longer run, the project aims to work with a variety of data sources in 
order to create highly specialized and customized maps.
\ No newline at end of file
diff --git a/assets/demo.html b/assets/demo.html
index b5269d7..b5f2334 100644
--- a/assets/demo.html
+++ b/assets/demo.html
@@ -43,11 +43,11 @@
 <header>
   <h2><i class="far fa-map"></i> Baremaps</h2>
   <p>These <a target="_blank" 
href="https://docs.mapbox.com/vector-tiles/reference/";>vector tiles</a> have 
been crafted with <a href="https://www.baremaps.com";>Baremaps</a> and <a 
target="_blank" 
href="https://www.openstreetmap.org/copyright";>OpenStreetMap</a> data.</p>
-  <a class="github-button" href="https://github.com/baremaps/baremaps"; 
data-size="large" data-show-count="true"
-     aria-label="Star baremaps/baremaps on GitHub">Star</a>
-  <a class="github-button" 
href="https://github.com/baremaps/baremaps/releases/latest";
+  <a class="github-button" href="https://github.com/apache/incubator-baremaps"; 
data-size="large" data-show-count="true"
+     aria-label="Star apache/incubator-baremaps on GitHub">Star</a>
+  <a class="github-button" 
href="https://github.com/apache/incubator-baremaps/releases/latest";
      data-color-scheme="no-preference: light; light: light; dark: dark;" 
data-size="large"
-     aria-label="Download baremaps/baremaps on GitHub">Download</a>
+     aria-label="Download apache/incubator-baremaps on GitHub">Download</a>
 </header>
 <div id="map"></div>
 <script 
src='https://api.mapbox.com/mapbox-gl-js/v0.44.0/mapbox-gl.js'></script>
diff --git a/developer-manual/geocoder/index.md 
b/developer-manual/geocoder/index.md
new file mode 100644
index 0000000..593ddf6
--- /dev/null
+++ b/developer-manual/geocoder/index.md
@@ -0,0 +1,9 @@
+---
+layout: default
+title: Geocoder
+permalink: /developer-manual/geocoder/
+---
+
+# Geocoder
+
+TODO
\ No newline at end of file
diff --git a/developer-manual/how-to-build-with-maven/index.md 
b/developer-manual/how-to-build-with-maven/index.md
new file mode 100644
index 0000000..b0bc0a4
--- /dev/null
+++ b/developer-manual/how-to-build-with-maven/index.md
@@ -0,0 +1,9 @@
+---
+layout: default
+title: How to build with Maven
+permalink: /developer-manual/how-to-build-with-maven/
+---
+
+# How to build with Maven
+
+TODO
\ No newline at end of file
diff --git a/developer-manual/index.md b/developer-manual/index.md
new file mode 100644
index 0000000..e79d407
--- /dev/null
+++ b/developer-manual/index.md
@@ -0,0 +1,18 @@
+---
+layout: default
+title: Developer Manual
+permalink: /developer-manual/
+---
+
+# Developer Manual
+
+The Developer Manual aims at helping developers to execute the code, 
understand the structure and contribute to the project.
+
+Go into the relevant sections to find out more about Apache Baremaps.
+
+ - [Project structure](/developer-manual/project-structure/)
+ - [How to build with Maven](/developer-manual/how-to-build-with-maven/)
+ - [Set up in IntelliJ IDEA](/developer-manual/setup-with-intellij/)
+ - [Geocoder](/developer-manual/geocoder/)
+ - [IP to location](/developer-manual/ip-to-location/)
+ - [Stylesheet](/developer-manual/stylesheet/)
\ No newline at end of file
diff --git a/developer-manual/ip-to-location/index.md 
b/developer-manual/ip-to-location/index.md
new file mode 100644
index 0000000..c2590c4
--- /dev/null
+++ b/developer-manual/ip-to-location/index.md
@@ -0,0 +1,111 @@
+---
+layout: default
+title: IP to location
+permalink: /developer-manual/ip-to-location/
+---
+
+# IP to location
+
+Using data publicly available from the 5 [Regional Internet Registries 
(RIRs)](https://whatismyipaddress.com/rir) 
+we are able to generate a stream of objects detailing Internet resource 
allocations. We call these NIC Objects 
+(Network Information Centre Objects).
+
+Here is the list of the 5 RIRs.
+
+ - [ARIN](https://www.arin.net/)
+ - [LACNIC](https://www.lacnic.net/)
+ - [AFRINIC](https://afrinic.net/)
+ - [RIPE NCC](https://www.ripe.net/)
+ - [APNIC](https://www.apnic.net/)
+
+Using the list of NIC objects, we extract those that concern IPv4 address 
ranges 
([INETNUM](https://www.ripe.net/manage-ips-and-asns/db/support/documentation/ripe-database-documentation/rpsl-object-types/4-2-descriptions-of-primary-objects/4-2-4-description-of-the-inetnum-object))
+, then using the Baremaps Geocoder API, we iterate through the extracted NIC 
objects to geo-locate each one of them. 
+
+The resulting geo-localised IPv4 address ranges are stored in a SQLite 
database which can be easily queried to geo-locate a specific IP.
+
+A NIC object contains a list of attributes but these attributes are not 
consistent between each NIC object. 
+We try to use these 4 attributes to query the Geocoder service : 
+
+- *address* contains the address of the NIC Object
+- *descr* sometimes contains the address of the NIC Object
+- *country* contains the country code in ISO format (ISO 3166) - [RIPE list of 
country 
codes](https://www.ripe.net/participate/member-support/list-of-members/list-of-country-codes-and-rirs)
+- *geoloc* contains the latitude and longitude which can be used directly
+
+Some NIC Objects contain a reference to an organisation, and the 
organisation's NIC Object itself contains the 
+geo-localisation information. However, we don't make use of that for now.
+
+The [structure of the RIPE 
database](https://www.ripe.net/manage-ips-and-asns/db/support/documentation/ripe-database-documentation/ripe-database-structure)
+should be applicable to all the RIRs.
+
+## Generating the IP to location database
+
+A workflow is a directed acyclic graph of steps executed by Baremaps. To 
download and import the sample OSM data in Postgres, execute the following 
[workflow](https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/ip-to-location/workflow.js).
+
+```
+baremaps workflow execute --file examples/ip-to-location/workflow.js
+```
+
+Depending on the size of the OpenStreetMap file, the execution of this command 
may take some time.
+Eventually, the output produced by the command should look as follows.
+
+```
+[INFO ] 2022-12-08 12:56:05.417 [main] Execute - Executing the workflow 
examples/ip-to-location/workflow.js
+[INFO ] 2022-12-08 12:56:06.031 [pool-2-thread-1] DownloadUrl - Downloading 
https://ftp.ripe.net/ripe/dbase/ripe.db.gz to downloads/ripe.db.gz
+[INFO ] 2022-12-08 12:56:06.031 [pool-2-thread-2] DownloadUrl - Downloading 
https://download.geonames.org/export/dump/allCountries.zip to 
downloads/geonames-allcountries.zip
+...
+...
+...
+[INFO ] 2022-07-26 09:48:21.368 [main] Workflow - Finished executing workflow 
examples/ip-to-location/workflow.js
+```
+
+```
+iploc serve --database iploc.db --port 3000
+```
+
+## Code usage
+
+In order to generate the SQLite database that contains the geo-localised IP 
address ranges you must follow a few steps.
+
+1) First you need to load/build a Geocoder which will be used to query the 
addresses contained in the NIC objects.
+
+```java
+Geocoder geocoder = new GeonamesGeocoder(indexPath, dataUri);
+geocoder.build();
+```
+
+2) Then you need to generate a Stream of NIC Objects. You can use the Nic 
Fetcher to automatically download all of the NIC Objects from the 5 RIRs.
+
+```java
+Stream<Path> nicPathsStream = new NicFetcher().fetch();
+Stream<NicObject> nicObjectStream =
+    nicPathsStream.flatMap(nicPath -> {
+        try {
+            return NicParser.parse(new 
BufferedInputStream(Files.newInputStream(nicPath)));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return Stream.empty();
+    });
+```
+
+3) You need to create the IpLoc service, giving the target SQLite database url 
and the geocoder in the second parameter
+
+```java
+SqliteUtils.executeResource(databaseUrl, "iploc_init.sql"); // Init the SQLite 
database
+IpLoc ipLoc = new IpLoc(databaseUrl, geocoder);
+```
+
+4) Finally insert the stream of NIC objects in the database with the IpLoc 
service
+
+```java
+ipLoc.insertNicObjects(nicObjects.stream());
+```
+
+## Notes
+
+There are many improvements that need to be worked on to improve the Iploc 
module, refer to the Github issues with the
+tag *iploc* if you want to contribute.
+
+## References
+- [https://www.iana.org/numbers](https://www.iana.org/numbers)
+- [https://www.irr.net/docs/list.html](https://www.irr.net/docs/list.html)
diff --git a/developer-manual/project-structure/index.md 
b/developer-manual/project-structure/index.md
new file mode 100644
index 0000000..b244aec
--- /dev/null
+++ b/developer-manual/project-structure/index.md
@@ -0,0 +1,17 @@
+---
+layout: default
+title: Project structure
+permalink: /developer-manual/project-structure/
+---
+
+# Project structure
+
+The code is structured in a way that makes it easy to understand and to 
contribute to the project.
+
+## Modules
+
+TODO
+
+### Baremaps-core
+
+TODO
\ No newline at end of file
diff --git a/developer-manual/setup-in-intellij/index.md 
b/developer-manual/setup-in-intellij/index.md
new file mode 100644
index 0000000..9e34b09
--- /dev/null
+++ b/developer-manual/setup-in-intellij/index.md
@@ -0,0 +1,13 @@
+---
+layout: default
+title: Set up in IntelliJ IDEA
+permalink: /developer-manual/setup-in-intellij/
+---
+
+# Set up in IntelliJ IDEA
+
+To open the project with IntelliJ, go under file -> open -> ...
+
+There are a few pre-created configurations to run the code quickly.
+
+TODO
\ No newline at end of file
diff --git a/stylesheet.md b/developer-manual/stylesheet/stylesheet.md
similarity index 86%
rename from stylesheet.md
rename to developer-manual/stylesheet/stylesheet.md
index 6044467..2537e59 100644
--- a/stylesheet.md
+++ b/developer-manual/stylesheet/stylesheet.md
@@ -1,10 +1,10 @@
 ---
 layout: default
-title: OpenStreetMap Vecto
-permalink: /stylesheet/
+title: Stylesheet
+permalink: /developer-manual/stylesheet/
 ---
 
-# OpenStreetMap Vecto
+# Stylesheet
 
 [OpenStreetMap Vecto](https://github.com/baremaps/openstreetmap-vecto) is an 
ongoing effort to build a general-purpose configuration and stylesheet for 
Baremaps.
 It is used to generate vector tiles and to produce a Mapbox 
[stylesheet](https://docs.mapbox.com/mapbox-gl-js/style-spec/) inspired by 
[OpenStreetMap Carto](https://github.com/gravitystorm/openstreetmap-carto).
diff --git a/examples/extrusion/index.md b/examples/_extrusion/index.md
similarity index 89%
rename from examples/extrusion/index.md
rename to examples/_extrusion/index.md
index 2993161..9a26bce 100644
--- a/examples/extrusion/index.md
+++ b/examples/_extrusion/index.md
@@ -14,7 +14,7 @@ To import London data in the database.
 baremaps workflow execute --file workflow.json
 ```
 
-In the 
[tileset.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/extrusion/tileset.json)
+In the 
[tileset.json](https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/extrusion/tileset.json)
 file, notice the SQL query associated with the building layer. Here, the 
number of levels stored in OSM is multiplied by
 3, which rawly corresponds to the height of a level in meters.
 
@@ -30,7 +30,7 @@ WHERE tags ? 'building'
 ```
 
 This property is then used in
-the 
[style.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/extrusion/style.json)
 file to
+the 
[style.json](https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/extrusion/style.json)
 file to
 extrude the buildings.
 
 ```json
diff --git a/examples/extrusion/screenshot.png 
b/examples/_extrusion/screenshot.png
similarity index 100%
rename from examples/extrusion/screenshot.png
rename to examples/_extrusion/screenshot.png
diff --git a/examples/geoadmin/index.md b/examples/_geoadmin/index.md
similarity index 100%
rename from examples/geoadmin/index.md
rename to examples/_geoadmin/index.md
diff --git a/examples/contour/indexes.sql b/examples/contour/indexes.sql
deleted file mode 100644
index e69de29..0000000
diff --git a/examples/contour/liecthenstein-aster-dem-v2-3857.tif 
b/examples/contour/liecthenstein-aster-dem-v2-3857.tif
deleted file mode 100644
index 93f78b7..0000000
Binary files a/examples/contour/liecthenstein-aster-dem-v2-3857.tif and 
/dev/null differ
diff --git a/examples/contour/liecthenstein-aster-dem-v2.tif 
b/examples/contour/liecthenstein-aster-dem-v2.tif
deleted file mode 100644
index e9e705c..0000000
Binary files a/examples/contour/liecthenstein-aster-dem-v2.tif and /dev/null 
differ
diff --git a/examples/contour/style.json b/examples/contour/style.json
deleted file mode 100644
index 1604741..0000000
--- a/examples/contour/style.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "version" : 8,
-  "sources" : {
-    "baremaps" : {
-      "type" : "vector",
-      "url" : "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers" : [ {
-    "id" : "background",
-    "type" : "background",
-    "maxzoom" : 24,
-    "paint" : {
-      "background-color" : "rgba(255, 255, 255, 1)"
-    }
-  }, {
-    "id" : "aster_dem",
-    "type" : "line",
-    "source" : "baremaps",
-    "source-layer" : "aster_dem",
-    "layout" : {
-      "line-cap" : "round",
-      "line-join" : "round"
-    },
-    "paint" : {
-      "line-color" : "rgba(181, 169, 152, 1)"
-    }
-  } ],
-  "center" : [ 9.5554, 47.166 ],
-  "zoom" : 14
-}
\ No newline at end of file
diff --git a/examples/contour/tileset.json b/examples/contour/tileset.json
deleted file mode 100644
index 7999eb5..0000000
--- a/examples/contour/tileset.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "tilejson": "2.1.0",
-  "center": [
-    9.5554,
-    47.166,
-    14.0
-  ],
-  "bounds": [
-    9.471078,
-    47.04774,
-    9.636217,
-    47.27128
-  ],
-  "tiles": [
-    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt";
-  ],
-  "vector_layers": [
-    {
-      "id": "aster_dem",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 20,
-          "sql": "SELECT ogc_fid, jsonb_build_object('elevation', 
elevation::text), wkb_geometry FROM aster_dem"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/extrusion/indexes.sql b/examples/extrusion/indexes.sql
deleted file mode 100644
index 6990e7b..0000000
--- a/examples/extrusion/indexes.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gin ON osm_ways USING gin 
(nodes);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gin ON osm_relations 
USING gin (member_refs);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_nodes_gix ON osm_nodes USING GIST 
(geom);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gix ON osm_ways USING GIST 
(geom);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gix ON osm_relations 
USING GIST (geom);
\ No newline at end of file
diff --git a/examples/extrusion/style.json b/examples/extrusion/style.json
deleted file mode 100644
index 2189120..0000000
--- a/examples/extrusion/style.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "version": 8,
-  "center": [
-    0.1278,
-    51.5074
-  ],
-  "zoom": 14,
-  "sources": {
-    "baremaps": {
-      "type": "vector",
-      "url": "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers": [
-    {
-      "id": "building",
-      "type": "fill-extrusion",
-      "source": "baremaps",
-      "source-layer": "building",
-      "paint": {
-        "fill-extrusion-color": "rgb(152, 174, 221)",
-        "fill-extrusion-height": [
-          "get",
-          "building:height"
-        ],
-        "fill-extrusion-base": 0,
-        "fill-extrusion-opacity": 0.9
-      }
-    }
-  ]
-}
\ No newline at end of file
diff --git a/examples/extrusion/tileset.json b/examples/extrusion/tileset.json
deleted file mode 100644
index e5a4695..0000000
--- a/examples/extrusion/tileset.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "tilejson": "2.2.0",
-  "center": [
-    0.1278,
-    51.5074,
-    14.0
-  ],
-  "bounds": [
-    -0.511482,
-    51.28554,
-    0.335437,
-    51.69344
-  ],
-  "minzoom": 12.0,
-  "maxzoom": 14.0,
-  "tiles": [
-    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt";
-  ],
-  "vector_layers": [
-    {
-      "id": "building",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags || jsonb_build_object('building:height', 
(CASE WHEN tags ->> 'building:levels' ~ '^[0-9\\\\.]+$' THEN tags ->> 
'building:levels' ELSE '1' END)::real * 3), geom FROM osm_ways WHERE tags ? 
'building'"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/extrusion/workflow.json b/examples/extrusion/workflow.json
deleted file mode 100644
index de11af5..0000000
--- a/examples/extrusion/workflow.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "steps": [
-    {
-      "id": "download",
-      "needs": [],
-      "tasks": [
-        {
-          "type": "DownloadUrl",
-          "url": 
"https://download.geofabrik.de/europe/great-britain/england/greater-london-latest.osm.pbf";,
-          "path": "greater-london-latest.osm.pbf"
-        }
-      ]
-    },
-    {
-      "id": "import",
-      "needs": [
-        "download"
-      ],
-      "tasks": [
-        {
-          "type": "ImportOpenStreetMap",
-          "file": "greater-london-latest.osm.pbf",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps",
-          "databaseSrid": 3857
-        }
-      ]
-    },
-    {
-      "id": "index",
-      "needs": [
-        "import"
-      ],
-      "tasks": [
-        {
-          "type": "ExecuteSql",
-          "file": "indexes.sql",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/geoadmin/style.json b/examples/geoadmin/style.json
deleted file mode 100644
index af13470..0000000
--- a/examples/geoadmin/style.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "version" : 8,
-  "sources" : {
-    "baremaps" : {
-      "type" : "vector",
-      "url" : "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers" : [ {
-    "id" : "background",
-    "type" : "background",
-    "maxzoom" : 24,
-    "paint" : {
-      "background-color" : "rgba(255, 255, 255, 1)"
-    }
-  }, {
-    "id" : "geoadmin_traffic_noise_day",
-    "type" : "line",
-    "source" : "baremaps",
-    "source-layer" : "geoadmin_traffic_noise_day",
-    "layout" : {
-      "line-cap" : "round",
-      "line-join" : "round"
-    },
-    "paint" : {
-      "line-color" : "rgba(181, 169, 152, 1)"
-    }
-  } ],
-  "center" : [ 9.5554, 47.166 ],
-  "zoom" : 14
-}
\ No newline at end of file
diff --git a/examples/geoadmin/tileset.json b/examples/geoadmin/tileset.json
deleted file mode 100644
index 167cff1..0000000
--- a/examples/geoadmin/tileset.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "tilejson": "2.1.0",
-  "center": [
-    6.5743,
-    46.5189,
-    14.0
-  ],
-  "bounds": [
-    9.471078,
-    47.04774,
-    9.636217,
-    47.27128
-  ],
-  "tiles": [
-    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt";
-  ],
-  "vector_layers": [
-    {
-      "id": "geoadmin_traffic_noise_day",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 20,
-          "sql": "SELECT ogc_fid, ('{level:' || dn::text || '}') as tags, 
wkb_geometry as geom FROM geoadmin_traffic_noise_day"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/geoadmin/tileset.yaml b/examples/geoadmin/tileset.yaml
deleted file mode 100644
index b21d19c..0000000
--- a/examples/geoadmin/tileset.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-id: 'contour'
-center:
-  lon: 6.5743
-  lat: 46.5189
-  zoom: 14
-bounds:
-  minLon: 5.8358
-  minLat: 45.6591
-  maxLon: 10.9794
-  maxLat: 47.8700
-  minZoom: 10
-  maxZoom: 20
-layers:
-  - id: 'geoadmin_traffic_noise_day'
-    type: 'geometry'
-    queries:
-      - minZoom: 12
-        maxZoom: 20
-        sql: SELECT ogc_fid, ('{level:' || dn::text || '}') as tags, 
wkb_geometry as geom FROM geoadmin_traffic_noise_day
diff --git a/examples/geocoding/index.md b/examples/geocoding/index.md
new file mode 100644
index 0000000..1fb3be6
--- /dev/null
+++ b/examples/geocoding/index.md
@@ -0,0 +1,36 @@
+---
+layout: default
+title: Create a geocoding web service
+permalink: /examples/geocoding/
+---
+
+# Create a geocoding web service
+
+In this tutorial, we demonstrate how to create a geocoding index and then 
serve it in a simple web application.
+
+## Dataset
+
+The data we will be using comes from [Geonames](https://geonames.com).
+
+## Generate the index
+
+The following 
[workflow](https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/geocoding/workflow.js)
 will download the Geonames data, decompress it, and finally build the index.
+
+```
+baremaps workflow execute --file examples/geocoding/workflow.js
+```
+
+## Serve the data
+
+The following command will serve the Geonames index over HTTP in a simple web 
application.
+
+```
+baremaps geocoder serve --index geonames-index --port 3000
+```
+
+Go to [http://localhost:3000/](http://localhost:3000/) to see it in action.
+
+## Conclusion
+
+In this tutorial, we learnt how to create a Geocoding index and serve it in a 
simple web application. 
+This will be very useful in a map application to find places quickly by 
writing an address in a prompt.
\ No newline at end of file
diff --git a/examples/contour/index.md 
b/examples/import-contour-into-postgis/index.md
similarity index 56%
rename from examples/contour/index.md
rename to examples/import-contour-into-postgis/index.md
index a1fbba8..ab09c0c 100644
--- a/examples/contour/index.md
+++ b/examples/import-contour-into-postgis/index.md
@@ -1,11 +1,16 @@
 ---
 layout: default
-title: Contour Lines in Vector Tiles
+title: Import contour lines data into PostGIS
+permalink: /examples/import-contour-into-postgis/
 ---
 
-# Contour Lines in Vector Tiles
+# Import contour lines data into PostGIS
 
-This example demonstrates how to produce contours from a digital elevation 
model (DEM) and how to display them with vector tiles.
+In this tutorial, we demonstrate how to produce contours from a digital 
elevation model (DEM).
+
+Notice that the following steps assume that the Apache Baremaps CLI and 
PostGIS are [installed](https://www.baremaps.com/getting-started/).
+
+## Dataset
 
 The approach consists in using the 
[`gdal_contour`](https://gdal.org/programs/gdal_contour.html) command.
 Therefore, start by installing `gdal`:
@@ -21,10 +26,12 @@ We used the following command to reproject the geotiff in 
the desired projection
 gdalwarp -rc \
   -s_srs epsg:4326 -t_srs epsg:3857 \
   -dstnodata 0 -of GTiff -co tiled=yes \
-  liecthenstein-aster-dem-v2.tif \
-  liecthenstein-aster-dem-v2-3857.tif
+  examples/contour/liecthenstein-aster-dem-v2.tif \
+  examples/contour/liecthenstein-aster-dem-v2-3857.tif
 ```
 
+## Importing the data into PostGIS
+
 You can now import any GeoTiff DEM as contours in postgis. 
 In the following command, the `-nln` argument name the table that contains the 
data, 
 the `-a` argument name the column that contains the elevation, 
@@ -34,7 +41,7 @@ the `-i` argument specifies the interval in meters at which 
contours are generat
 gdal_contour \
   -a elevation -nln aster_dem -i 10 \
   -f PostgreSQL \
-  liecthenstein-aster-dem-v2-3857.tif "PG:host=localhost user=baremaps 
password=baremaps dbname=baremaps"
+  examples/contour/liecthenstein-aster-dem-v2-3857.tif "PG:host=localhost 
user=baremaps password=baremaps dbname=baremaps"
 ```
 
 Some index can now be added to the database to improve performances. 
@@ -45,12 +52,9 @@ DROP INDEX IF EXISTS aster_dem_gix;
 CREATE INDEX CONCURRENTLY IF NOT EXISTS aster_dem_gix ON aster_dem USING 
SPGIST(wkb_geometry);
 ```
 
-Finally, to preview the map in the browser, run the tile server with the 
following command. 
-Your changes to the configuration files will be automatically reloaded by the 
browser.
+## Conclusion
 
-```bash
-baremaps map dev \
-  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
-  --tileset 'tileset.json' \
-  --style 'style.json'
-```
+In this tutorial, we learnt how to import contour lines in PostGIS.
+
+Now that you have inserted the contour data into the PostGIS database, you can 
use follow the [Serve Vector Tiles from PostGIS](/examples/serve-vector-tiles) 
example to serve
+your PostGIS data directly as Vector Tiles in a web application with live 
reload capabilities.
diff --git a/examples/import-naturalearth-into-postgis/index.md 
b/examples/import-naturalearth-into-postgis/index.md
new file mode 100644
index 0000000..eb1b78a
--- /dev/null
+++ b/examples/import-naturalearth-into-postgis/index.md
@@ -0,0 +1,49 @@
+---
+layout: default
+title: Import Natural Earth data into PostGIS
+permalink: /examples//import-naturalearth-into-postgis/
+---
+
+# Import Natural Earth data into PostGIS
+
+In this tutorial, we'll learn how to use Baremaps to import Natural Earth data 
in a PostGIS database.
+
+Notice that the following steps assume that the Apache Baremaps CLI and 
PostGIS are [installed](https://www.baremaps.com/getting-started/).
+
+## Dataset
+
+[Natural Earth](https://www.naturalearthdata.com/) is a public domain map 
dataset available at 1:10m, 1:50m, and 1:110 million scales.
+
+The following workflow will download the Natural Earth data, decompress it, 
and finally import it in the database.
+
+```
+baremaps workflow execute --file examples/naturalearth/workflow.json
+```
+
+## Working with shapefiles (Optional)
+
+The NaturalEarth dataset is also distributed in the [shapefile 
format](https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip).
+As demonstrated in the following command, shapefiles can easily be imported in 
postgis with `ogr2ogr`.
+Here, notice that the data is reprojected in WebMercator (EPSG:3857) to 
improve performance at query time.
+
+```
+ogr2ogr \
+  -f "PostgreSQL" "PG:host=localhost user=baremaps dbname=baremaps 
password=baremaps" \
+  "ne_10m_admin_0_countries.shp" \
+  -lco GEOMETRY_NAME=geom \
+  -lco FID=gid \
+  -lco PRECISION=no \
+  -nlt PROMOTE_TO_MULTI \
+  -nln ne_10m_admin_0_countries \
+  -s_srs EPSG:4326 \
+  -t_srs EPSG:3857 \
+  --config OGR_ENABLE_PARTIAL_REPROJECTION TRUE \
+  -overwrite
+```
+
+## Conclusion
+
+In this tutorial, we learnt how to import Natural Earth data in PostGIS.
+
+Now that you have inserted the data into the PostGIS database, you can use 
follow the [Serve Vector Tiles from PostGIS](/examples/serve-vector-tiles) 
example to serve
+your PostGIS data directly as Vector Tiles in a web application with live 
reload capabilities.
diff --git a/examples/openstreetmap/database.png 
b/examples/import-osm-into-postgis/database.png
similarity index 100%
rename from examples/openstreetmap/database.png
rename to examples/import-osm-into-postgis/database.png
diff --git a/examples/openstreetmap/index.md 
b/examples/import-osm-into-postgis/index.md
similarity index 52%
rename from examples/openstreetmap/index.md
rename to examples/import-osm-into-postgis/index.md
index 630cadb..ae51397 100644
--- a/examples/openstreetmap/index.md
+++ b/examples/import-osm-into-postgis/index.md
@@ -1,14 +1,15 @@
 ---
 layout: default
-title: OpenStreetMap Example
+title: Import OSM data into PostGIS
+permalink: /examples//import-osm-into-postgis/
 ---
 
-# OpenStreetMap Example
+# Import OSM data into PostGIS
 
-Baremaps aims at being the most productive toolkit for creating custom vector 
tiles from OpenStreetMap data.
+In this tutorial, we'll learn how to use Baremaps to import contour lines data 
in a PostGIS database.
+
+Notice that the following steps assume that the Apache Baremaps CLI and 
PostGIS are [installed](https://www.baremaps.com/getting-started/).
 
-In this tutorial, we'll learn how to use Baremaps to import OpenStreetMap data 
in a Postgis database and how to create vector tiles from this data.
-Notice that the following steps assume that Baremaps and Postgis are 
[installed](https://www.baremaps.com/installation/).
 Also, if you are in a hurry, consider skipping the "Under the Hood" sections.
 
 ## Dataset
@@ -21,11 +22,11 @@ In this example we will use a tiny extract of OSM for 
[Liechtenstein](https://en
 
 ## Importing OpenStreetMap Data
 
-A workflow is a directed acyclic graph of steps executed by Baremaps. 
-To download and import the sample OSM data in Postgres, execute the following 
[workflow](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/openstreetmap/workflow.json).
 
+A workflow is a directed acyclic graph of steps executed by Baremaps.
+To download and import the sample OSM data in Postgres, execute the following 
[workflow](https://raw.githubusercontent.com/apache/incubator-baremaps/main/examples/openstreetmap/workflow.json).
 
 ```
-baremaps workflow execute --file workflow.json
+baremaps workflow execute --file examples/openstreetmap/workflow.json
 ```
 
 Depending on the size of the OpenStreetMap file, the execution of this command 
may take some time.
@@ -61,83 +62,19 @@ In our case, the input is a file provided by Geofabrik.
 
 OSM's [conceptual model](https://wiki.openstreetmap.org/wiki/Elements) builds 
upon the notions of nodes, ways and relations.
 In this normalized data model, a line (or way) is formed by a sequence of 
points (nodes) referenced by their id.
-In order to save denormalized geometries in Postgis (e.g. linestring, polygon, 
multi-polygon, etc.), Baremaps creates a cache for nodes, ways and relations.
+In order to save denormalized geometries in PostGIS (e.g. linestring, polygon, 
multi-polygon, etc.), Baremaps creates a cache for nodes, ways and relations.
 [LMDB](https://symas.com/lmdb/) is used under the hood to achieve great 
performance.
 
 After the creation of the cache, Baremaps can populate the database with 
geometries.
 The geometries are stored in three tables named after the OSM conceptual 
model: `osm_nodes`, `osm_ways`, and `osm_relations`.
 In order to improve performances at query time, Baremaps also creates indexes 
for the tags and the geometries.
-The following Figure displays the schema of the Postgis database created by 
Baremaps.
-
-![Postgis database](database.png)
-
-## Creating Vector Tiles
-
-In order to create vector tiles, Baremaps uses JSON configuration files.
-You can obtain a copy of the 
[tileset.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/openstreetmap/tileset.json)
 and 
[style.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/openstreetmap/style.json)
 file in the repository.
-The 
[tileset.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/openstreetmap/tileset.json)
 is loosely based on the [TileJSON](https://github.com/mapbox/tilejson-spec) 
specification. 
-It defines general tileset properties and lists layers containing SQL queries 
to be executed by Postgis.
-The 
[style.json](https://raw.githubusercontent.com/baremaps/baremaps/main/docs/examples/openstreetmap/style.json)
 file is a [Maplibre Style](https://maplibre.org/maplibre-gl-js-docs/api/).
-It defines general style and rendering properties. 
-
-Let's preview and edit the map with the sample configuration files by 
executing the following command in a terminal.
-
-```
-baremaps map dev \
-  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
-  --tileset 'tileset.json' \
-  --style 'style.json'
-```
-
-Well done, a local development server should have started. 
-You can now visualize a map of Liechtenstein in your browser 
([http://localhost:9000/](http://localhost:9000/))!
-Notice that the changes in the configuration files are automatically reloaded 
by the browser.
+The following Figure displays the schema of the PostGIS database created by 
Baremaps.
 
-### Under the Hood (Optional)
-
-Baremaps extensively rely on the fantastic 
[ST_AsMVT](https://postgis.net/docs/ST_AsMVT.html) functions released by the 
Postgis team to produce [Mapbox Vector 
Tiles](https://docs.mapbox.com/vector-tiles/specification/).
-However, in the following excerpt of the json configuration file, none of 
these concepts appear in the SQL queries.
-
-```json
-{
-  ...
-  "vector_layers": [
-    {
-      "id": "aeroway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'aeroway'"
-        },
-        ...
-      ]
-    },
-  ],
-  ...
-}
-```
-
-Why don't we see these function calls in the configuration?
-Baremaps wants you to focus on the content of the tiles, and relieves you from 
the burden of writing complex SQL queries.
-In fact, at runtime, Baremaps merges all the queries of the configuration file 
into a single optimized query that produces vector tiles.
-
-In production, vector tiles are rarely served dynamically. Why is that so?
-First, a large blob store is much cheaper than a relational database to 
[operate](https://wiki.c2.com/?StorageIsCheap).
-Second, content delivery networks (CDNs) greatly improve web performances by 
caching static content close to the end user.
-Baremaps has been conceived with these lasting trends in mind.
-The following command produces a local directory containing precomputed static 
tiles.
-These tiles can be served with Apache, Nginx, or Caddy, but also copied in a 
blob store behind a content delivery network, such as Cloudflare, Stackpath, or 
Fastly.
-
-```
-baremaps map export \
-  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
-  --tileset 'tileset.json' \
-  --repository 'tiles/'
-```
+![PostGIS database](database.png)
 
 ## Conclusion
 
-In this tutorial, we learnt how to import OpenStreetMap data in Postgis and 
how to create vector tiles with Baremaps.
-Prior to the release of Baremaps, we believe that creating a pipeline for 
publishing vector tiles from OpenStreetMap data was a rather time consuming 
task.
-As shown in this demonstration, Baremaps literally brings back the fun to 
creating a web mapping pipeline!
+In this tutorial, we learnt how to import OpenStreetMap data in PostGIS.
+
+Now that you have inserted the OSM data into the PostGIS database, you can use 
follow the [Serve Vector Tiles from PostGIS](/examples/serve-vector-tiles) 
example to serve 
+your PostGIS data directly as Vector Tiles in a web application with live 
reload capabilities.
diff --git a/examples/index.md b/examples/index.md
index 771bd8f..ceddea0 100644
--- a/examples/index.md
+++ b/examples/index.md
@@ -6,10 +6,29 @@ permalink: /examples/
 
 # Examples
 
-Several examples illustrate how to import datasets in postgis in order to 
produce vector tiles:
-- The [OpenStreetMap](/examples/openstreetmap/) example is a good introduction 
to Baremaps, it shows how to produce high resolution vector tiles.
-- The [Extrusion](/examples/openstreetmap/) builds upon the OpenStreetMap 
example and shows how to extrude buildings.
-- The [NaturalEarth](/examples/naturalearth/) example shows how to produce low 
resolution vector tiles.
-- The [Contour](/examples/contour/) example shows how to produce contour lines 
from a digital elevation model.
+The examples will showcase the different uses of the Apache Baremaps toolkits. 
To run the examples you need to clone or 
[download](https://github.com/apache/incubator-baremaps/archive/refs/heads/main.zip)
 the main
+repository in order to have access to the 
[files](https://github.com/apache/incubator-baremaps/blob/main/examples/) that 
have been prepared for the examples.
 
-The [OpenStreetMap Vecto](/stylesheet/) repository shows how to build a more 
advanced configuration and stylesheet for Baremaps.
\ No newline at end of file
+```bash
+git clone [email protected]:apache/incubator-baremaps.git
+```
+
+You should have completed the [Installation 
Guide](/getting-started/installing-the-cli) before running the examples.
+
+For the creation of custom vector tiles you can follow these guides:
+
+- The [OpenStreetMap](/examples/import-osm-into-postgis/) example is a good 
introduction to Baremaps, it shows how to produce high resolution vector tiles.
+- The [NaturalEarth](/examples/import-naturalearth-into-postgis/) example 
shows how to produce low resolution vector tiles.
+- The [Contour](/examples/import-contour-into-postgis/) example shows how to 
produce contour lines from a digital elevation model.
+
+For the creation of an IP to location service follow this guide:
+
+- The [IP to location](/examples/ip-to-location/) example shows how to create 
and serve an IP to location service in a simple web application.
+
+If you want to work on Geocoding there is this example:
+
+- The [Geocoding](/examples/geocoding/) example shows how to create and serve 
a geocoding service in a simple web application.
+
+Developers who want to execute the code, should refer to the developer manual:
+
+- The [Developer Manual](/developer-manual/) aims at helping developers to 
execute the code, understand the structure and contribute to the project.
\ No newline at end of file
diff --git a/examples/ip-to-location/index.md b/examples/ip-to-location/index.md
new file mode 100644
index 0000000..11be4e5
--- /dev/null
+++ b/examples/ip-to-location/index.md
@@ -0,0 +1,51 @@
+---
+layout: default
+title: Create an IP to location web service
+permalink: /examples/ip-to-location/
+---
+
+# Create an IP to location web service
+
+In this tutorial, we demonstrate how to create an IP to location index and 
then serve it in a simple web application.
+
+## Dataset
+
+The data used to create an IP to location index is publicly available from the 
5 [Regional Internet Registries (RIRs)](https://whatismyipaddress.com/rir)
+
+Here is the list of the 5 RIRs.
+
+- [ARIN](https://www.arin.net/)
+- [LACNIC](https://www.lacnic.net/)
+- [AFRINIC](https://afrinic.net/)
+- [RIPE NCC](https://www.ripe.net/)
+- [APNIC](https://www.apnic.net/)
+
+These Regional Internet Registries contain records that link IP address ranges 
to organisations along with some metadata.
+It is not always possible to extract meaningful data from these registries 
because they are not normalised.
+
+## Generate the index
+
+The workflow executed in the following command contains multiple steps.
+
+- Download and decompress the data from the RIRs
+- Download and create a Geocoding index (see the 
[Geocoding](/examples/geocoding/) example)
+- Iterate over every entry in the registries to extract the IP address ranges 
and the associated metadata to query the Geocoding index and extract a latitude 
and a longitude.
+
+```
+baremaps workflow execute --file examples/geocoding/workflow.json
+```
+
+## Serve the data
+
+The following command will serve the Geonames index over HTTP in a simple web 
application.
+
+```
+iploc serve --database iploc.db --port 3000
+```
+
+Go to [http://localhost:3000/](http://localhost:3000/) to see it in action.
+
+## Conclusion
+
+In this tutorial, we learnt how to create an IP to location index and serve it 
in a simple web application.
+IP to location has many uses, one of which is to locate users that connect to 
a website to generate statistics.
\ No newline at end of file
diff --git a/examples/naturalearth/index.md b/examples/naturalearth/index.md
deleted file mode 100644
index cd33cb5..0000000
--- a/examples/naturalearth/index.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-layout: default
-title: NaturalEarth Example
----
-
-# NaturalEarth Example
-
-[Natural Earth](https://www.naturalearthdata.com/) is a public domain map 
dataset available at 1:10m, 1:50m, and 1:110 million scales.
-This example shows how to create vector tiles from the Natural Earth dataset.
-
-The first step consists in downloading the Natural Earth data, decompressing 
it, and importing it in the database. 
-The following workflow will allow you to achieve this result.
-
-```
-baremaps workflow execute --file workflow.json
-```
-
-To preview and edit the map in the browser, run the tile server with the 
following command:
-
-```
-baremaps map dev \
-  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
-  --tileset 'tileset.json' \
-  --style 'style.json'
-```
-
-## Working with shapefiles
-
-The NaturalEarth dataset is also distributed in the [shapefile 
format](https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_countries.zip).
-As demonstrated in the following command, shapefiles can easily be imported in 
postgis with `ogr2ogr`.
-Here, notice that the data is reprojected in WebMercator (EPSG:3857) to 
improve performance at query time.
-
-```
-ogr2ogr \
-  -f "PostgreSQL" "PG:host=localhost user=baremaps dbname=baremaps 
password=baremaps" \
-  "ne_10m_admin_0_countries.shp" \
-  -lco GEOMETRY_NAME=geom \
-  -lco FID=gid \
-  -lco PRECISION=no \
-  -nlt PROMOTE_TO_MULTI \
-  -nln ne_10m_admin_0_countries \
-  -s_srs EPSG:4326 \
-  -t_srs EPSG:3857 \
-  --config OGR_ENABLE_PARTIAL_REPROJECTION TRUE \
-  -overwrite
-```
diff --git a/examples/naturalearth/indexes.sql 
b/examples/naturalearth/indexes.sql
deleted file mode 100644
index 109077c..0000000
--- a/examples/naturalearth/indexes.sql
+++ /dev/null
@@ -1,135 +0,0 @@
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_antarctic_claim_limit_lines_gix ON 
ne_10m_admin_0_antarctic_claim_limit_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_antarctic_claims_gix ON 
ne_10m_admin_0_antarctic_claims USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_disputed_areas_gix ON 
ne_10m_admin_0_boundary_lines_disputed_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_land_gix ON 
ne_10m_admin_0_boundary_lines_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_map_units_gix ON 
ne_10m_admin_0_boundary_lines_map_units USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS 
ne_10m_admin_0_boundary_lines_maritime_indicator_gix ON 
ne_10m_admin_0_boundary_lines_maritime_indicator USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_countries_gix ON 
ne_10m_admin_0_countries USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_countries_lakes_gix ON 
ne_10m_admin_0_countries_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_disputed_areas_gix ON 
ne_10m_admin_0_disputed_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS 
ne_10m_admin_0_disputed_areas_scale_rank_minor_islands_gix ON 
ne_10m_admin_0_disputed_areas_scale_rank_minor_islands USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_label_points_gix ON 
ne_10m_admin_0_label_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_map_subunits_gix ON 
ne_10m_admin_0_map_subunits USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_map_units_gix ON 
ne_10m_admin_0_map_units USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_pacific_groupings_gix ON 
ne_10m_admin_0_pacific_groupings USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_scale_rank_gix ON 
ne_10m_admin_0_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_scale_rank_minor_islands_gix ON 
ne_10m_admin_0_scale_rank_minor_islands USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_seams_gix ON ne_10m_admin_0_seams 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_0_sovereignty_gix ON 
ne_10m_admin_0_sovereignty USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_label_points_details_gix ON 
ne_10m_admin_1_label_points_details USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_label_points_gix ON 
ne_10m_admin_1_label_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_seams_gix ON ne_10m_admin_1_seams 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_gix ON 
ne_10m_admin_1_states_provinces USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_lakes_gix ON 
ne_10m_admin_1_states_provinces_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_lines_gix ON 
ne_10m_admin_1_states_provinces_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_scale_rank_gix ON 
ne_10m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS 
ne_10m_admin_1_states_provinces_scale_rank_minor_islands_gix ON 
ne_10m_admin_1_states_provinces_scale_rank_minor_islands USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_airports_gix ON ne_10m_airports USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_lines_gix ON 
ne_10m_antarctic_ice_shelves_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_polys_gix ON 
ne_10m_antarctic_ice_shelves_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_coastline_gix ON ne_10m_coastline USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_geographic_lines_gix ON 
ne_10m_geographic_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_geography_marine_polys_gix ON 
ne_10m_geography_marine_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_elevation_points_gix ON 
ne_10m_geography_regions_elevation_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_points_gix ON 
ne_10m_geography_regions_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_polys_gix ON 
ne_10m_geography_regions_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_glaciated_areas_gix ON 
ne_10m_glaciated_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_lakes_europe_gix ON ne_10m_lakes_europe 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_lakes_gix ON ne_10m_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_lakes_historic_gix ON ne_10m_lakes_historic 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_lakes_north_america_gix ON 
ne_10m_lakes_north_america USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_lakes_pluvial_gix ON ne_10m_lakes_pluvial 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_land_gix ON ne_10m_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_land_ocean_label_points_gix ON 
ne_10m_land_ocean_label_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_land_ocean_seams_gix ON 
ne_10m_land_ocean_seams USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_land_scale_rank_gix ON 
ne_10m_land_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_coastline_gix ON 
ne_10m_minor_islands_coastline USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_gix ON ne_10m_minor_islands 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_label_points_gix ON 
ne_10m_minor_islands_label_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_ocean_gix ON ne_10m_ocean USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_ocean_scale_rank_gix ON 
ne_10m_ocean_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_area_gix ON 
ne_10m_parks_and_protected_lands_area USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_line_gix ON 
ne_10m_parks_and_protected_lands_line USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_point_gix ON 
ne_10m_parks_and_protected_lands_point USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_scale_rank_gix ON 
ne_10m_parks_and_protected_lands_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_playas_gix ON ne_10m_playas USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_populated_places_gix ON 
ne_10m_populated_places USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_populated_places_simple_gix ON 
ne_10m_populated_places_simple USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_ports_gix ON ne_10m_ports USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_railroads_gix ON ne_10m_railroads USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_railroads_north_america_gix ON 
ne_10m_railroads_north_america USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_reefs_gix ON ne_10m_reefs USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_rivers_europe_gix ON ne_10m_rivers_europe 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_gix ON 
ne_10m_rivers_lake_centerlines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_scale_rank_gix ON 
ne_10m_rivers_lake_centerlines_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_rivers_north_america_gix ON 
ne_10m_rivers_north_america USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_roads_gix ON ne_10m_roads USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_roads_north_america_gix ON 
ne_10m_roads_north_america USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_time_zones_gix ON ne_10m_time_zones USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_urban_areas_gix ON ne_10m_urban_areas USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_10m_urban_areas_landscan_gix ON 
ne_10m_urban_areas_landscan USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_boundary_lines_land_gix ON 
ne_110m_admin_0_boundary_lines_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_countries_gix ON 
ne_110m_admin_0_countries USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_countries_lakes_gix ON 
ne_110m_admin_0_countries_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_map_units_gix ON 
ne_110m_admin_0_map_units USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_pacific_groupings_gix ON 
ne_110m_admin_0_pacific_groupings USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_scale_rank_gix ON 
ne_110m_admin_0_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_sovereignty_gix ON 
ne_110m_admin_0_sovereignty USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_0_tiny_countries_gix ON 
ne_110m_admin_0_tiny_countries USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_gix ON 
ne_110m_admin_1_states_provinces USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_lakes_gix ON 
ne_110m_admin_1_states_provinces_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_lines_gix ON 
ne_110m_admin_1_states_provinces_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_scale_rank_gix ON 
ne_110m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_coastline_gix ON ne_110m_coastline USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_geographic_lines_gix ON 
ne_110m_geographic_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_geography_marine_polys_gix ON 
ne_110m_geography_marine_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_elevation_points_gix ON 
ne_110m_geography_regions_elevation_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_points_gix ON 
ne_110m_geography_regions_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_polys_gix ON 
ne_110m_geography_regions_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_glaciated_areas_gix ON 
ne_110m_glaciated_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_lakes_gix ON ne_110m_lakes USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_land_gix ON ne_110m_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_ocean_gix ON ne_110m_ocean USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_populated_places_gix ON 
ne_110m_populated_places USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_populated_places_simple_gix ON 
ne_110m_populated_places_simple USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_110m_rivers_lake_centerlines_gix ON 
ne_110m_rivers_lake_centerlines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_lines_disputed_areas_gix ON 
ne_50m_admin_0_boundary_lines_disputed_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_lines_land_gix ON 
ne_50m_admin_0_boundary_lines_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS 
ne_50m_admin_0_boundary_lines_maritime_indicator_gix ON 
ne_50m_admin_0_boundary_lines_maritime_indicator USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_map_units_gix ON 
ne_50m_admin_0_boundary_map_units USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_breakaway_disputed_areas_gix ON 
ne_50m_admin_0_breakaway_disputed_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS 
ne_50m_admin_0_breakaway_disputed_areas_scale_rank_gix ON 
ne_50m_admin_0_breakaway_disputed_areas_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_countries_gix ON 
ne_50m_admin_0_countries USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_countries_lakes_gix ON 
ne_50m_admin_0_countries_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_map_subunits_gix ON 
ne_50m_admin_0_map_subunits USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_map_units_gix ON 
ne_50m_admin_0_map_units USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_pacific_groupings_gix ON 
ne_50m_admin_0_pacific_groupings USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_scale_rank_gix ON 
ne_50m_admin_0_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_sovereignty_gix ON 
ne_50m_admin_0_sovereignty USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_tiny_countries_gix ON 
ne_50m_admin_0_tiny_countries USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_0_tiny_countries_scale_rank_gix ON 
ne_50m_admin_0_tiny_countries_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_gix ON 
ne_50m_admin_1_states_provinces USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_lakes_gix ON 
ne_50m_admin_1_states_provinces_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_lines_gix ON 
ne_50m_admin_1_states_provinces_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_scale_rank_gix ON 
ne_50m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_airports_gix ON ne_50m_airports USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_lines_gix ON 
ne_50m_antarctic_ice_shelves_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_polys_gix ON 
ne_50m_antarctic_ice_shelves_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_coastline_gix ON ne_50m_coastline USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_geographic_lines_gix ON 
ne_50m_geographic_lines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_geography_marine_polys_gix ON 
ne_50m_geography_marine_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_elevation_points_gix ON 
ne_50m_geography_regions_elevation_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_points_gix ON 
ne_50m_geography_regions_points USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_polys_gix ON 
ne_50m_geography_regions_polys USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_glaciated_areas_gix ON 
ne_50m_glaciated_areas USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_lakes_gix ON ne_50m_lakes USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_lakes_historic_gix ON ne_50m_lakes_historic 
USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_land_gix ON ne_50m_land USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_ocean_gix ON ne_50m_ocean USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_playas_gix ON ne_50m_playas USING 
SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_populated_places_gix ON 
ne_50m_populated_places USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_populated_places_simple_gix ON 
ne_50m_populated_places_simple USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_ports_gix ON ne_50m_ports USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_gix ON 
ne_50m_rivers_lake_centerlines USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_scale_rank_gix ON 
ne_50m_rivers_lake_centerlines_scale_rank USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS ne_50m_urban_areas_gix ON ne_50m_urban_areas USING 
SPGIST(geom);
diff --git a/examples/naturalearth/style.json b/examples/naturalearth/style.json
deleted file mode 100644
index 2fa41fd..0000000
--- a/examples/naturalearth/style.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "version" : 8,
-  "sources" : {
-    "baremaps" : {
-      "type" : "vector",
-      "url" : "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers" : [ {
-    "id" : "ne_50m_admin_0_countries",
-    "type" : "fill",
-    "source" : "baremaps",
-    "source-layer" : "ne_50m_admin_0_countries",
-    "layout" : {
-      "visibility" : "visible"
-    },
-    "paint" : {
-      "fill-color" : "rgba(125, 105, 105, 1)",
-      "fill-outline-color" : "rgba(0, 0, 0, 1)"
-    }
-  }, {
-    "id" : "ne_10m_admin_0_countries",
-    "type" : "fill",
-    "source" : "baremaps",
-    "source-layer" : "ne_10m_admin_0_countries",
-    "paint" : {
-      "fill-color" : "rgba(125, 105, 105, 1)",
-      "fill-outline-color" : "rgba(0, 0, 0, 1)"
-    }
-  } ],
-  "center" : [ 0, 0 ],
-  "zoom" : 4
-}
\ No newline at end of file
diff --git a/examples/naturalearth/tileset.json 
b/examples/naturalearth/tileset.json
deleted file mode 100644
index 7616459..0000000
--- a/examples/naturalearth/tileset.json
+++ /dev/null
@@ -1,1360 +0,0 @@
-{
-  "tilejson": "2.2.0",
-  "minzoom": 0,
-  "maxzoom": 12,
-  "tiles": [
-    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt";
-  ],
-  "vector_layers": [
-    {
-      "id": "ne_110m_admin_0_boundary_lines_land",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_boundary_lines_land AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_countries",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_countries AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_countries_lakes",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_countries_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_map_units",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_map_units AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_pacific_groupings",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_pacific_groupings AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_scale_rank",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_sovereignty",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_sovereignty AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_0_tiny_countries",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_0_tiny_countries AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_1_states_provinces",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_1_states_provinces AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_1_states_provinces_lakes",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_1_states_provinces_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_1_states_provinces_lines",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_1_states_provinces_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_admin_1_states_provinces_scale_rank",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_admin_1_states_provinces_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_coastline",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_coastline AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_geographic_lines",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_geographic_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_geography_marine_polys",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_geography_marine_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_geography_regions_elevation_points",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_geography_regions_elevation_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_geography_regions_points",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_geography_regions_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_geography_regions_polys",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_geography_regions_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_glaciated_areas",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_glaciated_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_lakes",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_land",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_land AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_ocean",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_ocean AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_populated_places",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_populated_places AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_populated_places_simple",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_populated_places_simple AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_110m_rivers_lake_centerlines",
-      "queries": [
-        {
-          "minzoom": 0,
-          "maxzoom": 2,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_110m_rivers_lake_centerlines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_boundary_lines_disputed_areas",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_boundary_lines_disputed_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_boundary_lines_land",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_boundary_lines_land AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_boundary_lines_maritime_indicator",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_boundary_lines_maritime_indicator AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_boundary_map_units",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_boundary_map_units AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_breakaway_disputed_areas",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_breakaway_disputed_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_breakaway_disputed_areas_scale_rank",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_breakaway_disputed_areas_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_countries",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_countries AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_countries_lakes",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_countries_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_map_subunits",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_map_subunits AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_map_units",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_map_units AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_pacific_groupings",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_pacific_groupings AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_scale_rank",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_sovereignty",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_sovereignty AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_tiny_countries",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_tiny_countries AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_0_tiny_countries_scale_rank",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_0_tiny_countries_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_1_states_provinces",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_1_states_provinces AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_1_states_provinces_lakes",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_1_states_provinces_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_1_states_provinces_lines",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_1_states_provinces_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_admin_1_states_provinces_scale_rank",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_admin_1_states_provinces_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_airports",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_airports AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_antarctic_ice_shelves_lines",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_antarctic_ice_shelves_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_antarctic_ice_shelves_polys",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_antarctic_ice_shelves_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_coastline",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_coastline AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_geographic_lines",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_geographic_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_geography_marine_polys",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_geography_marine_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_geography_regions_elevation_points",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_geography_regions_elevation_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_geography_regions_points",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_geography_regions_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_geography_regions_polys",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_geography_regions_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_glaciated_areas",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_glaciated_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_lakes",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_lakes_historic",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_lakes_historic AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_land",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_land 
AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_ocean",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_ocean AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_playas",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_playas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_populated_places",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_populated_places AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_populated_places_simple",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_populated_places_simple AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_ports",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_ports AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_rivers_lake_centerlines",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_rivers_lake_centerlines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_rivers_lake_centerlines_scale_rank",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_rivers_lake_centerlines_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_50m_urban_areas",
-      "queries": [
-        {
-          "minzoom": 2,
-          "maxzoom": 5,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_50m_urban_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_antarctic_claim_limit_lines",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_antarctic_claim_limit_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_antarctic_claims",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_antarctic_claims AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_boundary_lines_disputed_areas",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_boundary_lines_disputed_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_boundary_lines_land",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_boundary_lines_land AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_boundary_lines_map_units",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_boundary_lines_map_units AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_boundary_lines_maritime_indicator",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_boundary_lines_maritime_indicator AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_countries",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_countries AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_countries_lakes",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_countries_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_disputed_areas",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_disputed_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_disputed_areas_scale_rank_minor_islands",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_disputed_areas_scale_rank_minor_islands AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_label_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_label_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_map_subunits",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_map_subunits AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_map_units",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_map_units AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_pacific_groupings",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_pacific_groupings AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_scale_rank_minor_islands",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_scale_rank_minor_islands AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_seams",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_seams AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_0_sovereignty",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_0_sovereignty AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_label_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_label_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_label_points_details",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_label_points_details AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_seams",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_seams AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_states_provinces",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_states_provinces AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_states_provinces_lakes",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_states_provinces_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_states_provinces_lines",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_states_provinces_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_states_provinces_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_states_provinces_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_admin_1_states_provinces_scale_rank_minor_islands",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_admin_1_states_provinces_scale_rank_minor_islands AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_airports",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_airports AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_antarctic_ice_shelves_lines",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_antarctic_ice_shelves_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_antarctic_ice_shelves_polys",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_antarctic_ice_shelves_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_coastline",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_coastline AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_geographic_lines",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_geographic_lines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_geography_marine_polys",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_geography_marine_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_geography_regions_elevation_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_geography_regions_elevation_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_geography_regions_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_geography_regions_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_geography_regions_polys",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_geography_regions_polys AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_glaciated_areas",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_glaciated_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_lakes",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_lakes AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_lakes_europe",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_lakes_europe AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_lakes_historic",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_lakes_historic AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_lakes_north_america",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_lakes_north_america AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_lakes_pluvial",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_lakes_pluvial AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_land",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_land 
AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_land_ocean_label_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_land_ocean_label_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_land_ocean_seams",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_land_ocean_seams AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_land_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_land_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_minor_islands",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_minor_islands AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_minor_islands_coastline",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_minor_islands_coastline AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_minor_islands_label_points",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_minor_islands_label_points AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_ocean",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_ocean AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_ocean_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_ocean_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_parks_and_protected_lands_area",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_parks_and_protected_lands_area AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_parks_and_protected_lands_line",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_parks_and_protected_lands_line AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_parks_and_protected_lands_point",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_parks_and_protected_lands_point AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_parks_and_protected_lands_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_parks_and_protected_lands_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_playas",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_playas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_populated_places",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_populated_places AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_populated_places_simple",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_populated_places_simple AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_ports",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_ports AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_railroads",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_railroads AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_railroads_north_america",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_railroads_north_america AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_reefs",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_reefs AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_rivers_europe",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_rivers_europe AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_rivers_lake_centerlines",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_rivers_lake_centerlines AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_rivers_lake_centerlines_scale_rank",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_rivers_lake_centerlines_scale_rank AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_rivers_north_america",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_rivers_north_america AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_roads",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_roads AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_roads_north_america",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_roads_north_america AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_time_zones",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_time_zones AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_urban_areas",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_urban_areas AS t"
-        }
-      ]
-    },
-    {
-      "id": "ne_10m_urban_areas_landscan",
-      "queries": [
-        {
-          "minzoom": 5,
-          "maxzoom": 12,
-          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM 
ne_10m_urban_areas_landscan AS t"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/naturalearth/workflow.json 
b/examples/naturalearth/workflow.json
deleted file mode 100644
index bd9d644..0000000
--- a/examples/naturalearth/workflow.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "steps": [
-    {
-      "id": "natural_earth_vector",
-      "needs": [],
-      "tasks": [
-        {
-          "type": "DownloadUrl",
-          "url": 
"https://naciscdn.org/naturalearth/packages/natural_earth_vector.gpkg.zip";,
-          "path": "natural_earth_vector.gpkg.zip"
-        },
-        {
-          "type": "UnzipFile",
-          "file": "natural_earth_vector.gpkg.zip",
-          "directory": "natural_earth_vector"
-        },
-        {
-          "type": "ImportGeoPackage",
-          "file": "natural_earth_vector/packages/natural_earth_vector.gpkg",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps",
-          "sourceSRID": 4326,
-          "targetSRID": 3857
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "indexes.sql",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/openstreetmap/indexes.sql 
b/examples/openstreetmap/indexes.sql
deleted file mode 100644
index 6990e7b..0000000
--- a/examples/openstreetmap/indexes.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gin ON osm_ways USING gin 
(nodes);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gin ON osm_relations 
USING gin (member_refs);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_nodes_gix ON osm_nodes USING GIST 
(geom);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gix ON osm_ways USING GIST 
(geom);
-CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gix ON osm_relations 
USING GIST (geom);
\ No newline at end of file
diff --git a/examples/openstreetmap/liechtenstein-latest.osm.pbf 
b/examples/openstreetmap/liechtenstein-latest.osm.pbf
deleted file mode 100644
index 591fd91..0000000
Binary files a/examples/openstreetmap/liechtenstein-latest.osm.pbf and 
/dev/null differ
diff --git a/examples/openstreetmap/screenshot.png 
b/examples/openstreetmap/screenshot.png
deleted file mode 100644
index 3121c6e..0000000
Binary files a/examples/openstreetmap/screenshot.png and /dev/null differ
diff --git a/examples/openstreetmap/style.js b/examples/openstreetmap/style.js
deleted file mode 100644
index 127ae1a..0000000
--- a/examples/openstreetmap/style.js
+++ /dev/null
@@ -1,26 +0,0 @@
-export default {
-  "version" : 8,
-  "sources" : {
-    "baremaps" : {
-      "type" : "vector",
-      "url" : "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers" : [ {
-    "id" : "building",
-    "type" : "fill",
-    "source" : "baremaps",
-    "source-layer" : "building",
-    "layout" : {
-      "visibility" : "visible"
-    },
-    "paint" : {
-      "fill-color" : "rgba(255, 0, 0, 1)"
-    }
-  } ],
-  "center" : [ 9.5554, 47.166 ],
-  "metadata" : {
-    "maputnik:renderer" : "mbgljs"
-  },
-  "zoom" : 14
-};
\ No newline at end of file
diff --git a/examples/openstreetmap/style.json 
b/examples/openstreetmap/style.json
deleted file mode 100644
index f64b679..0000000
--- a/examples/openstreetmap/style.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "version" : 8,
-  "sources" : {
-    "baremaps" : {
-      "type" : "vector",
-      "url" : "http://localhost:9000/tiles.json";
-    }
-  },
-  "layers" : [ {
-    "id" : "building",
-    "type" : "fill",
-    "source" : "baremaps",
-    "source-layer" : "building",
-    "layout" : {
-      "visibility" : "visible"
-    },
-    "paint" : {
-      "fill-color" : "rgba(255, 0, 0, 1)"
-    }
-  } ],
-  "center" : [ 9.5554, 47.166 ],
-  "metadata" : {
-    "maputnik:renderer" : "mbgljs"
-  },
-  "zoom" : 14
-}
\ No newline at end of file
diff --git a/examples/openstreetmap/tileset.json 
b/examples/openstreetmap/tileset.json
deleted file mode 100644
index b714ed8..0000000
--- a/examples/openstreetmap/tileset.json
+++ /dev/null
@@ -1,521 +0,0 @@
-{
-  "tilejson": "2.2.0",
-  "center": [
-    9.5554,
-    47.166,
-    14.0
-  ],
-  "bounds": [
-    9.471078,
-    47.04774,
-    9.636217,
-    47.27128
-  ],
-  "minzoom": 12.0,
-  "maxzoom": 14.0,
-  "tiles": [
-    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt";
-  ],
-  "vector_layers": [
-    {
-      "id": "aeroway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'aeroway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aeroway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'aeroway' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "waterway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'waterway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'waterway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'waterway' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "landuse",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'landuse'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'landuse'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'landuse' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "railway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'railway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'railway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'railway' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "highway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'highway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'highway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'highway' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "public_transport",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 
'public_transport'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 
'public_transport'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'public_transport' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "aerialway",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 
'aerialway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aerialway'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'aerialway' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "geological",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 
'geological'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 
'geological'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'geological' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "building",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'building'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'building'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'building' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "amenity",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'amenity'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'amenity'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'amenity' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "craft",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'craft'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'craft'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'craft' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "emergency",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 
'emergency'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'emergency'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'emergency' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "historic",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'historic'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'historic'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'historic' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "leisure",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'leisure'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'leisure'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'leisure' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "man_made",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'man_made'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'man_made'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'man_made' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "military",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'military'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'military'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'military' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "natural",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'natural'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'natural'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'natural' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "office",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'office'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'office'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'office' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "place",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'place'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'place'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'place' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "power",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'power'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'power'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'power' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "route",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'route'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'route'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'route' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "shop",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'shop'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'shop'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'shop' 
AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "sport",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'sport'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'sport'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'sport' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "telecom",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'telecom'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'telecom'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'telecom' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    },
-    {
-      "id": "tourism",
-      "queries": [
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'tourism'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'tourism'"
-        },
-        {
-          "minzoom": 12,
-          "maxzoom": 20,
-          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 
'tourism' AND tags ->> 'type' = 'multipolygon'"
-        }
-      ]
-    }
-  ]
-}
\ No newline at end of file
diff --git a/examples/openstreetmap/workflow.json 
b/examples/openstreetmap/workflow.json
deleted file mode 100644
index 9ebd677..0000000
--- a/examples/openstreetmap/workflow.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "steps": [
-    {
-      "id": "download",
-      "needs": [],
-      "tasks": [
-        {
-          "type": "DownloadUrl",
-          "url": 
"https://download.geofabrik.de/europe/liechtenstein-latest.osm.pbf";,
-          "path": "liechtenstein-latest.osm.pbf"
-        }
-      ]
-    },
-    {
-      "id": "import",
-      "needs": [
-        "download"
-      ],
-      "tasks": [
-        {
-          "type": "ImportOpenStreetMap",
-          "file": "liechtenstein-latest.osm.pbf",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps",
-          "databaseSrid": 3857
-        }
-      ]
-    },
-    {
-      "id": "index",
-      "needs": [
-        "import"
-      ],
-      "tasks": [
-        {
-          "type": "ExecuteSql",
-          "file": "indexes.sql",
-          "database": 
"jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps"
-        }
-      ]
-    }
-  ]
-}
diff --git a/examples/serve-vector-tiles/index.md 
b/examples/serve-vector-tiles/index.md
new file mode 100644
index 0000000..145617c
--- /dev/null
+++ b/examples/serve-vector-tiles/index.md
@@ -0,0 +1,95 @@
+---
+layout: default
+title: Serve Vector Tiles from PostGIS
+permalink: /examples//serve-vector-tiles/
+---
+
+# Serve Vector Tiles from PostGIS
+
+In this tutorial, we'll learn how to create vector tiles from the data 
imported into PostGIS.
+
+If you have not yet inserted data into your PostGIS database, please follow 
one of these three guides:
+
+- [Import OSM data into 
PostGIS](https://baremaps.apache.org/examples/import-osm-into-postgis/)
+- [Import Natural Earth data into 
PostGIS](https://baremaps.apache.org/examples/openstreetmap/)
+- [Import Contour lines from the ASTER dataset into 
PostGIS](https://baremaps.apache.org/examples/openstreetmap/)
+
+If you are in a hurry, consider skipping the "Under the Hood" sections.
+
+## Creating Vector Tiles
+
+In order to create vector tiles, Apache Baremaps requires JSON configuration 
files. The two configuration files used are:
+
+ - `tileset.json` - Defines all the information needed to retrieve the correct 
vector tile layers at different zoom levels.
+ - `style.json` - Defines the style of the different layers.
+
+For convenience, we have prepared a `tileset.json` and a `style.json` that 
correspond to each of the examples.
+
+Each of these files are available in the main repository of Apache Baremaps 
inside the examples' folder.
+
+- [For OpenStreetMap 
data](https://github.com/apache/incubator-baremaps/blob/main/examples/openstreetmap/)
+- [For contour lines 
data](https://github.com/apache/incubator-baremaps/blob/main/examples/contour/)
+- [For Natural Earth 
data](https://github.com/apache/incubator-baremaps/blob/main/examples/naturalearth/)
+
+First `cd` into one of the example directories that corresponds to the data 
you inserted inside your PostGIS database.
+Then let's preview and edit the map with the sample configuration files by 
executing the following command in a terminal.
+
+```
+baremaps map dev \
+  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
+  --tileset 'tileset.json' \
+  --style 'style.json'
+```
+
+Well done, a local development server should have started.
+You can now visualize the vector tiles in your browser 
([http://localhost:9000/](http://localhost:9000/))!
+Notice that the changes in the configuration files are automatically reloaded 
by the browser.
+
+### Under the Hood (Optional)
+
+Baremaps extensively rely on the fantastic 
[ST_AsMVT](https://postgis.net/docs/ST_AsMVT.html) functions released by the 
PostGIS team to produce [Mapbox Vector 
Tiles](https://docs.mapbox.com/vector-tiles/specification/).
+However, in the following excerpt of the json configuration file, none of 
these concepts appear in the SQL queries.
+
+```json
+{
+  ...
+  "vector_layers": [
+    {
+      "id": "aeroway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'aeroway'"
+        },
+        ...
+      ]
+    },
+  ],
+  ...
+}
+```
+
+Why don't we see these function calls in the configuration?
+Baremaps wants you to focus on the content of the tiles, and relieves you from 
the burden of writing complex SQL queries.
+In fact, at runtime, Baremaps merges all the queries of the configuration file 
into a single optimized query that produces vector tiles.
+
+In production, vector tiles are rarely served dynamically. Why is that so?
+First, a large blob store is much cheaper than a relational database to 
[operate](https://wiki.c2.com/?StorageIsCheap).
+Second, content delivery networks (CDNs) greatly improve web performances by 
caching static content close to the end user.
+Baremaps has been conceived with these lasting trends in mind.
+The following command produces a local directory containing precomputed static 
tiles.
+These tiles can be served with Apache, Nginx, or Caddy, but also copied in a 
blob store behind a content delivery network, such as Cloudflare, Stackpath, or 
Fastly.
+
+```
+baremaps map export \
+  --database 
'jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps' \
+  --tileset 'tileset.json' \
+  --repository 'tiles/'
+```
+
+## Conclusion
+
+In this tutorial, we learnt how to create vector tiles from PostGIS data with 
the help of Apache Baremaps.
+Prior to the release of Apache Baremaps, we believe that creating a pipeline 
for publishing vector tiles from OpenStreetMap data was a rather time-consuming 
task.
+As shown in this demonstration, Apache Baremaps tries to bring back the fun to 
creating a web mapping pipeline!
diff --git a/getting-started/index.md b/getting-started/index.md
new file mode 100644
index 0000000..e85d852
--- /dev/null
+++ b/getting-started/index.md
@@ -0,0 +1,15 @@
+---
+layout: default
+title: Getting Started
+permalink: /getting-started/
+---
+
+# Getting Started
+
+This section will get you started with the setup of Apache Baremaps to execute 
the examples. If you plan on running the 
+code directly, or using Apache Baremaps as a library, you should refer to the 
[Developer Manual](/developer-manual/).
+
+After installing the necessary components, the [Examples](/examples/) explain 
how to use Apache Baremaps to create a vector tileset from an OpenStreetMap 
extract, create an IP to location web service, and much more.
+
+Now head into [Installing the CLI](/getting-started/installing-the-cli/) to 
see how to set up the Apache Baremaps command line interface on your
+own machine to execute the examples.
\ No newline at end of file
diff --git a/getting-started/installing-postgis/index.md 
b/getting-started/installing-postgis/index.md
new file mode 100644
index 0000000..43828ff
--- /dev/null
+++ b/getting-started/installing-postgis/index.md
@@ -0,0 +1,33 @@
+---
+layout: default
+title: Installing PostGIS
+permalink: /getting-started/installing-postgis/
+---
+
+# Installing PostGIS
+
+This step is not required if you plan to execute the Geocoding or IP to 
location examples.
+
+For the insertion and generation of Vector tiles, you need to set up a 
[PostGIS](https://postgis.net/) database.
+This database will host all the data required to generate the vector tiles.
+
+The following docker image will allow you to jump start this installation:
+
+```
+docker run \
+  --name baremaps \
+  --publish 5432:5432 \
+  -e POSTGRES_DB=baremaps \
+  -e POSTGRES_USER=baremaps \
+  -e POSTGRES_PASSWORD=baremaps \
+  -d postgis/postgis:latest
+```
+
+You can then stop and start the container with the following commands:
+
+```
+docker stop baremaps
+docker start baremaps
+```
+
+From there you can go to the [Examples](/examples/) section. The [Import OSM 
data into PostGIS](/examples/openstreetmap/) example is the first step to 
produce custom high resolution vector tiles.
diff --git a/getting-started/installing-the-cli/index.md 
b/getting-started/installing-the-cli/index.md
new file mode 100644
index 0000000..bfd7b41
--- /dev/null
+++ b/getting-started/installing-the-cli/index.md
@@ -0,0 +1,35 @@
+---
+layout: default
+title: Installing the CLI
+permalink: /getting-started/installing-the-cli/
+---
+
+#  Installing the CLI
+
+In order to run Apache Baremaps, you first need to install Java 17 or a later 
version.
+[SDKMAN](https://sdkman.io/) provides a convenient Command Line Interface 
(CLI) to install and upgrade Java.
+
+To install Apache Baremaps, download and unzip the latest 
[release](https://github.com/apache/incubator-baremaps/releases/latest).
+Then, add the `/bin` folder to your `PATH` variable:
+
+```
+wget 
https://github.com/apache/incubator-baremaps/releases/latest/download/baremaps.zip
+unzip baremaps.zip
+export PATH=$PATH:`pwd`/baremaps/bin
+```
+
+Calling the `baremaps` command should now result in an output similar to the 
following:
+
+```
+Usage: baremaps [COMMAND]
+A toolkit for producing vector tiles.
+Commands:
+  import  Import OpenStreetMap data in the Postgresql database.
+  update  Update OpenStreetMap data in the Postgresql database.
+  export  Export vector tiles from the Postgresql database.
+  serve   Serve vector tiles from the the Postgresql database.
+```
+
+From there, head into [Installing 
PostGIS](/getting-started/installing-postgis/) if you plan to work with vector 
tiles.
+
+If you want to work on [Geocoding](/examples/geocoding/) or [IP to 
location](/examples/ip-to-location/), head directly into the related examples.
\ No newline at end of file
diff --git a/index.html b/index.html
index 35bd15f..500dffa 100644
--- a/index.html
+++ b/index.html
@@ -1,6 +1,6 @@
 ---
 layout: home
-title: Custom Vector Tiles
+title: Apache Baremaps
 ---
 <div class="home">
   <header>
@@ -9,18 +9,18 @@ title: Custom Vector Tiles
   <nav>
     <p>
       {% for item in site.data.menu.items %}
-      {% if item != site.data.menu.items[0] %} | {% endif %} <a href="{{ 
item.url }}">{{ item.page }}</a>
+      {% if item != site.data.menu.items[0] %} · {% endif %} <a href="{{ 
item.url }}">{{ item.page }}</a>
       {% endfor %}
     </p>
   </nav>
   <section>
     <p>{{ site.description }}</p>
     <p>
-      <a class="github-button" href="https://github.com/baremaps/baremaps"; 
data-size="large" data-show-count="true"
-         aria-label="Star baremaps/baremaps on GitHub">Star</a>
-      <a class="github-button" 
href="https://github.com/baremaps/baremaps/releases/latest";
+      <a class="github-button" 
href="https://github.com/apache/incubator-baremaps"; data-size="large" 
data-show-count="true"
+         aria-label="Star apache/incubator-baremaps on GitHub">Star</a>
+      <a class="github-button" 
href="https://github.com/apache/incubator-baremaps/releases/latest";
          data-color-scheme="no-preference: light; light: light; dark: dark;" 
data-size="large"
-         aria-label="Download baremaps/baremaps on GitHub">Download</a>
+         aria-label="Download apache/incubator-baremaps on GitHub">Download</a>
     </p>
     <a href="/assets/demo.html"><img src="/assets/screenshot.jpg" 
alt="screenshot"></a>
     <p><a class="edit" 
href="{{site.github.repository_url}}/edit/main/{{page.path}}"><i class="fas 
fa-edit"></i> Edit this page</a></p>
diff --git a/installation.md b/installation.md
deleted file mode 100644
index 3407486..0000000
--- a/installation.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-layout: default
-title: Installation
-permalink: /installation/
----
-
-# Installation
-
-In order to run Baremaps, you first need to install Java 8 or a later version. 
-[SDKMAN](https://sdkman.io/) provides a convenient Command Line Interface 
(CLI) to install and upgrade Java.
-
-To install baremaps, download and unzip the latest 
[release](https://github.com/baremaps/baremaps/releases/latest). 
-Then, add the `/bin` folder to your `PATH` variable:
-
-```
-wget https://github.com/baremaps/baremaps/releases/latest/download/baremaps.zip
-unzip baremaps.zip
-export PATH=$PATH:`pwd`/baremaps/bin
-```
-
-Calling the `baremaps` command should now result in an output similar to the 
following:
-
-```
-Usage: baremaps [COMMAND]
-A toolkit for producing vector tiles.
-Commands:
-  import  Import OpenStreetMap data in the Postgresql database.
-  update  Update OpenStreetMap data in the Postgresql database.
-  export  Export vector tiles from the Postgresql database.
-  serve   Serve vector tiles from the the Postgresql database.
-```
-
-In order to run Baremaps, you need to setup a [postgis](https://postgis.net/) 
database.
-The following docker image will allow you to jump start this installation:
-
-```
-docker run \
-  --name baremaps \
-  --publish 5432:5432 \
-  -e POSTGRES_DB=baremaps \
-  -e POSTGRES_USER=baremaps \
-  -e POSTGRES_PASSWORD=baremaps \
-  -d postgis/postgis:latest
-```
-
-You can then stop and start the container with the following commands:
-
-```
-docker stop baremaps
-docker start baremaps
-```
-
-From there, the [OpenStreetMap](/examples/openstreetmap/) example is a good 
introduction to Baremaps, it shows how to produce high resolution vector tiles.
diff --git a/notes/postgis.md b/notes/postgis.md
index 105a2cc..5a1185a 100644
--- a/notes/postgis.md
+++ b/notes/postgis.md
@@ -1,3 +1,3 @@
-# Postgis
+# PostGIS
 
 - https://osm2pgsql.org/doc/manual.html#tuning-the-postgresql-server
\ No newline at end of file


Reply via email to