Slippy is a SvelteKit/Bun app for making private map projects and publishing them as static MapLibre sites.
- Bun 1.2+
- An S3-compatible object storage provider for published project assets
- A transactional email provider for one-time login codes
- Stripe, if you want paid publishing enabled
bun install
cp .env.example .envFill in .env, then run:
bun devThe app creates its SQLite database on first use at DB_PATH (./data/slippy.sqlite by default).
Run this before publishing changes:
bun run checkThat runs the public repo hygiene scan, unit tests, production build, and bun audit.
Core:
ORIGIN="https://example.com"
DB_PATH="./data/slippy.sqlite"
EMAIL_HMAC_SECRET="generate-a-long-random-secret"
ADMIN_EMAILS="admin@example.com"Public app and asset URLs:
PUBLIC_APP_ORIGIN="https://example.com"
PUBLIC_MAP_DOMAIN="maps.example.com"
PUBLIC_CONTACT_EMAIL="hello@example.com"
PUBLIC_ASSETS_ORIGIN="https://assets.example.com"
PUBLIC_TILES_ORIGIN="https://tiles.example.com"
PUBLIC_FONTS_ORIGIN="https://fonts.example.com"
PUBLIC_WORLD_PMTILES_URL="https://tiles.example.com/world.pmtiles"
PUBLIC_VECTOR_COAST_RING_URL="https://tiles.example.com/coast-rings/global/coast-rings-global.pmtiles"
PUBLIC_COASTAL_SDF_URL="https://tiles.example.com/coastal-sdf.pmtiles"Object storage:
PUBLIC_BUCKET_REGION="eu"
S3_ENDPOINT="https://s3.example.com"
S3_REGION="fr-par"
S3_ACCESS_KEY_ID="..."
S3_SECRET_ACCESS_KEY="..."
S3_PROJECT_ID=""Email:
EMAIL_DELIVERY="scaleway"
EMAIL_FROM="no-reply@example.com"
EMAIL_FROM_NAME="Slippy"
SCW_SECRET_KEY="..."
SCW_PROJECT_ID="..."
SCW_REGION="fr-par"For local email testing without a provider:
EMAIL_DELIVERY="console"Stripe:
STRIPE_SECRET_KEY="sk_..."
STRIPE_PUBLISHABLE_KEY="pk_..."
STRIPE_PRODUCT_ID="prod_..."
STRIPE_MONTHLY_PRICE_ID="price_..."
STRIPE_YEARLY_PRICE_ID="price_..."
STRIPE_PORTAL_CONFIGURATION_ID="bpc_..."
STRIPE_WEBHOOK_SECRET="whsec_..."To create the Stripe product, prices, portal configuration, and webhook:
STRIPE_SECRET_KEY="sk_..." STRIPE_PUBLISHABLE_KEY="pk_..." bun run stripe:setup -- --origin https://example.comInstall Bun on the server, then clone and build:
git clone https://github.com/fo-rk/slippy.git /opt/slippy
cd /opt/slippy
bun install --frozen-lockfile
cp .env.example .env
bun run checkEdit /opt/slippy/.env with production values, then build and start:
bun run build
bun run startExample systemd service:
[Unit]
Description=Slippy
After=network.target
[Service]
WorkingDirectory=/opt/slippy
EnvironmentFile=/opt/slippy/.env
ExecStart=/root/.bun/bin/bun /opt/slippy/build/index.js
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.targetExample Caddy reverse proxy:
example.com {
reverse_proxy 127.0.0.1:3000
}Published map sites are written to S3-compatible storage. Configure DNS and bucket/static-site hosting for your chosen PUBLIC_MAP_DOMAIN pattern.
Slippy is copyright (C) 2026 Fork Studios Ltd.
The source code is licensed under the GNU Affero General Public License v3.0 or later. See LICENSE.md.
The Slippy name, logo, domains, and hosted service branding are property of Fork Studios Ltd and are not licensed for reuse except where explicitly stated.
Keep these out of GitHub:
.env,.env.*,.dev*data/tmp/node_modules/build/and.svelte-kit/*.pmtiles,*.mbtiles, SQLite databases, and generated font glyph folders
The local bulky coast/font work files live in tmp/ and are intentionally ignored.