Open data is not a dataset.It is a claim to check.
DjiniousMap harvests geospatial data, measures what it actually contains, and refuses to draw it until the coordinates support a reading. What survives that becomes a live map, a spatial analysis, a workflow — or an answer an AI agent gives your team.
- Harvest
- Profile
- Compose
- Act


A catalogue, a map studio, and an analysis engine that share one tenancy model
Most geospatial stacks are three products stitched together: something that ingests, something that draws, something that computes. Each keeps its own copy of who may see what. DjiniousMap is one control plane, and the isolation is enforced underneath all three.
Harvested catalogue
data.gouv.fr · your own sourcesA harvester pulls public datasets and registers them with their source URL, licence and classification. Registered is not the same as present: nothing is copied into the platform until you materialize it, and the catalogue says plainly which is which.
CRS inference
EPSG · declared vs measuredThe publisher's declared coordinate reference system is treated as a claim. The platform measures the coordinates, names the CRS they are actually in, and reports its confidence. When the two disagree, both are kept and the disagreement is shown.
Quality findings
with remediation, and with 'undetermined'Excess coordinate precision, stale data, invalid or null geometry — each finding explains what was measured, why it matters, and what to do. When there is nothing to judge by, the verdict is Undetermined rather than a guess dressed as a result.
Map studio
deck.gl · IGN basemapsCompose materialized datasets into layers, style them, filter them, and add category, histogram, formula or time-series widgets that cross-filter the map. A map is a versioned asset, so a view can be published, shared and rolled back.
Spatial analysis
isochrones · routing · geocodingRun isochrones, routes, forward and reverse geocoding, and spatial joins against materialized layers. Results land back in the catalogue as datasets of their own, so an analysis output is a first-class input to the next one.
Workflows and automation
event and schedule triggersAuthor a pipeline on a canvas, publish it as a versioned asset, and trigger it on a schedule or on an event — `dataset.refreshed`, for instance. Runs execute on a leased job queue and stream their progress live.
Four stages, and the platform will not skip one
The order matters, and it is enforced rather than recommended. A dataset cannot be drawn before it is profiled, because until it is profiled the platform does not know what projection its numbers are in — and drawing them anyway is how a layer ends up in the Gulf of Guinea.
Harvest
Register a dataset from the public catalogue or from one of your own connections. Registration records where the data lives, who publishes it, how it is licensed and how it is classified — public, internal, restricted or confidential. No features have moved yet.
- Public harvest from data.gouv.fr, with the publisher's own identifiers preserved
- Your own sources through connections, registered the same way
- Registered but not materialized is a first-class state, shown as such in the catalogue


Profile
Materializing copies the features into the platform and profiles them: feature count, geometry types, spatial index, null and invalid geometry rates, the temporal columns, and the coordinate reference system the numbers are actually in. The profile is what everything downstream trusts.
- The declared CRS is a claim; the inferred CRS is a measurement, reported with a confidence
- A disagreement between them is surfaced, never silently corrected
- Where no CRS can be inferred, the dataset is refused for mapping and the table preview still works


Compose
Bring materialized datasets together as layers on a map: style them, order them, filter them, and add widgets that cross-filter every other layer. The map is a document, versioned like any other asset, so a published view is reproducible and a bad edit is one version away from undone.
- Category, histogram, formula and time-series widgets, each cross-filtering the map
- Time replay over any column the profiler identified as temporal
- IGN and other basemaps, with the layer paint drawn from the product's own design tokens


Act
Run an analysis, publish a workflow, schedule it, share the result. Work that takes time runs on a leased job queue with heartbeats, so a worker that dies mid-run releases its lease instead of stranding the job — and every mutation lands in an append-only audit log on the way past.
- Isochrones, routing, forward and reverse geocoding, and spatial analysis over materialized layers
- Workflows authored on a canvas, published as versioned assets, triggered by schedule or event
- Public share links and embeddable maps, including a conversational embed


Two stores, two enforcement mechanisms, and neither of them is application code
A cross-tenant read in DjiniousMap does not fail a check in a request handler. It returns nothing, because the database was never willing to produce the rows. That is a different class of guarantee from a well-reviewed `if` statement, and it is the reason the platform is built on two stores rather than one.
- SurrealDB evaluates a PERMISSIONS clause per verb against the record the connection signed in as — a denied read returns nothing and a denied write returns nothing to check.
- PostgreSQL uses row-level security with FORCE, which applies to the owning role too: it is nosuperuser and nobypassrls, so there is no principal that can read past a policy.
- Every request opens its transaction through a helper that sets the organization first. A request with no resolved organization cannot open a transaction at all.
- The isolation suite derives its expectations from the grants rather than from a hand-written list, so a table added without a policy fails the walk instead of passing unnoticed.
Identity comes from an HttpOnly session cookie whose SHA-256 hash is all the platform stores. Request headers are not consulted for identity at all, so a caller cannot claim an organization by asking for one. There is no override and no development stub.
An agent that works the catalogue, not a chat box bolted to the side
The assistant runs against the same API and the same tenancy model you do. It searches the catalogue, reads a quality card, proposes an analysis plan before running anything, and shows every tool call it makes as it makes it. External agents get the same surface through an MCP server with scoped tokens.
- Plan first: the agent proposes an analysis and waits, rather than running and reporting
- A live trace of every tool call, argument and result — including the ones that failed
- An MCP server with per-token scopes, so an outside agent gets exactly the reach you granted it
- Conversation mirroring: an external agent's transcript renders in the app's own assistant


The limits, stated here rather than discovered later
A platform that measures data honestly should describe itself the same way. These are real constraints of the product as it stands, not a modesty section.
It is not a tile server
Materialized datasets are served as vector tiles for the studio's own rendering. It is not a general-purpose tile hosting product and does not try to be one.
Inference has a confidence, and sometimes it is zero
When nothing in the coordinates supports naming a CRS, the platform says so and refuses to place the dataset on a map. The table preview still works. That is the designed outcome, not a failure to handle.
Freshness is a hint, not a verdict
A stale-data finding is derived from a column identified as temporal by the shape of its values. A dataset that is genuinely current can carry an old date for an unrelated reason, and the finding says so in as many words.
The mirrors can drift, so there is a command that checks
Three PostgreSQL rows are projected from SurrealDB records. That is the one thing in the architecture that can go out of step, so a reconcile command enumerates both sides and exits non-zero when they disagree.
See it against your own data
The fastest way to judge a catalogue is to point it at something you already know is messy. Bring a dataset you have argued about, and we will profile it live.