GISPulse Portal
Open-source web UI for the GISPulse geospatial engine.
What's here
React + Vite + TailwindCSS portal — the public, AGPL-licensed companion to the
gispulse Python engine. Provides:
- Map workspace — MapLibre + DeckGL, layer tree, basemap switcher, style editor
- Workflows workspace — visual node editor (React Flow) for building rule pipelines
- Datasets / Catalog / Schema workspaces — browse, query, upload, inspect
- Marketplace — browse capability plugins (read-only)
- Local login — single-user authentication via API key
What's NOT here (lives in private gispulse-portal-pro)
- Admin / RBAC pages (Users, ApiKeys, Audit, Schedules, Settings, Usage, Queue)
- SSO OIDC callback page
- Billing pages (Pricing, Subscription)
- AdminGuard component, AdminLayout, admin API client + store
These are extended at app composition time when gispulse-portal-pro is
installed alongside this package.
Install paths
This repo dual-publishes. Pick the install path that fits your workflow:
| Install | What you get | Typical user |
|---|---|---|
pip install gispulse |
CLI + runtime ESB + API only (no UI) | servers, CI/CD, headless, power users |
pip install gispulse-portal |
Same as above plus the bundled SPA, served same-origin | users who want the local workbench |
| Hosted SPA on GH Pages | Marketing site + Try-it demo against demo.gispulse.dev backend |
drive-by visitors |
The PyPI wheel ships the pre-built SPA inside the Python package and exposes it via:
from gispulse_portal import PORTAL_DIST_PATH
# -> Path to the bundled SPA, ready to mount with FastAPI StaticFiles
The gispulse portal CLI command (in the gispulse package) detects
gispulse_portal and mounts it at /portal automatically. If the package is
not installed, it prints a helpful install hint instead of failing.
Frontend dev
pnpm install
pnpm dev # → http://localhost:5173
pnpm build # → ./dist
pnpm test
By default the portal expects the engine at http://localhost:8000.
Override with VITE_API_BASE_URL env var.
# Run the engine separately
pip install gispulse[postgis,api,raster,network]
uvicorn gispulse.adapters.http.app:create_app --factory --port 8000
Build & publish (maintainers)
This repo dual-publishes on every v*.*.* tag:
- GH Pages SPA —
deploy.ymlruns on everymainpush, builds viapnpm build, and force-pushes the result to thedeploybranch (served by GitHub Pages). - PyPI wheel —
release.ymlruns on tag push:pnpm install && pnpm build(produces./dist)- copies
./dist→gispulse_portal/dist/(so it gets included aspackage_data) python -m build --outdir python-dist(produces wheel + sdist)- smoke-tests the wheel in a clean venv
- publishes to PyPI via trusted publisher (OIDC) — no token in repo
Local wheel build
pnpm install
pnpm build
rm -rf gispulse_portal/dist
cp -r dist gispulse_portal/dist
python -m build --outdir python-dist
ls -la python-dist/
# gispulse_portal-1.5.1-py3-none-any.whl
# gispulse_portal-1.5.1.tar.gz
Local install smoke test
python -m venv /tmp/smoke && /tmp/smoke/bin/pip install --upgrade pip
/tmp/smoke/bin/pip install python-dist/gispulse_portal-*.whl
/tmp/smoke/bin/python -c "
from gispulse_portal import PORTAL_DIST_PATH
print(PORTAL_DIST_PATH)
assert PORTAL_DIST_PATH.is_dir()
assert (PORTAL_DIST_PATH / 'index.html').is_file()
print('ok')
"
Version policy
The git tag is the single source of truth. The release workflow asserts that
the tag, pyproject.toml, and gispulse_portal/__init__.py __version__
all match before publishing — a mismatch fails the build.
License
AGPL-3.0-or-later. Network use = source disclosure obligation. See LICENSE.
For self-hosted or SaaS deployment with proprietary modifications, contact ImagoData about the commercial dual-license at contact@imagodata.com.
Metadata
Release files for gispulse-portal 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gispulse_portal-2.0.0.tar.gz | 918.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gispulse_portal-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.9 MB
Release files / gispulse_portal-2.0.0.tar.gz
| Download URL | gispulse_portal-2.0.0.tar.gz |
|---|---|
| Size | 918.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5399fc138ed06046be4b3f5e9e946e3d69c4451929440e13292e2216f917d073
|
|
BLAKE2b-256 checksum How to use checksums |
77e62c434cfd3566c42485d1f10b53c74a64097a2fde0686352efbe940807363
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 23, 2026.
Transparency logRelease files / gispulse_portal-2.0.0-py3-none-any.whl
| Download URL | gispulse_portal-2.0.0-py3-none-any.whl |
|---|---|
| Size | 931.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0bb2ec4327fd0227ef6220339fc55d251c0c4b5051ec81b082f730c15254bc73
|
|
BLAKE2b-256 checksum How to use checksums |
bfb0a5d682787a29a085194d2f27bcbab795c4b3740e189045ea8001001fa860
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 23, 2026.
Transparency log