Skip to content

fo-rk/slippy

Repository files navigation

Slippy

Slippy is a SvelteKit/Bun app for making private map projects and publishing them as static MapLibre sites.

Requirements

  • 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

Local Setup

bun install
cp .env.example .env

Fill in .env, then run:

bun dev

The app creates its SQLite database on first use at DB_PATH (./data/slippy.sqlite by default).

Verification

Run this before publishing changes:

bun run check

That runs the public repo hygiene scan, unit tests, production build, and bun audit.

Required Environment

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.com

Deploy To A Linux Server

Install 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 check

Edit /opt/slippy/.env with production values, then build and start:

bun run build
bun run start

Example 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.target

Example 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.

License

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.

Repository Hygiene

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.

About

Create beautiful slippy maps that live on S3-compatible buckets

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages