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


What people actually build with it
Each of these runs on the demo stack, against French public data. They are not personas — they are the projects, workflows and automations the seed creates, described as the work they do.
- DVF · Cadastre
Property and land value
Reconcile transaction records against cadastral boundaries and publish the result as a layer the whole team reads the same way.
HarvestMaterializationWorkflowsMap studioThe DVF register lists every French property transaction; the cadastre gives the parcels and communes they sit in. Neither is useful alone, and joining them by hand produces a spreadsheet nobody else can reproduce. Here the join is a published workflow: it counts mutations per commune, averages their declared value, and writes a derived dataset back into the catalogue — profiled like any other, so the next question starts from it.
- Register DVF and the cadastral communes from the public catalogue
- Materialize both; the profiler reports their CRS, geometry and quality findings
- Publish a workflow that joins mutations to communes and aggregates by value
- Compose the output as a choropleth layer with a category widget on the commune
- Isochrones · routing
Access and service coverage
Answer 'what is within twenty minutes of here' for every site in a layer, and keep the answer current as the source moves.
IsochronesJob queueAutomationsSharingCoverage questions are asked once and then quietly go stale. An isochrone run over a whole layer produces travel-time polygons as a dataset of their own, which means it can be styled, filtered, shared and — crucially — rebuilt. An automation bound to `dataset.refreshed` re-runs the whole thing when the underlying sites are re-harvested, so the coverage layer is never older than the data it describes.
- Run isochrones over every feature in a site layer, not one point at a time
- The result lands in the catalogue as a dataset, profiled and mappable
- Bind an automation to `dataset.refreshed` on the source layer
- Every re-harvest rebuilds the coverage without anyone remembering to
- Trees · cycle networks · sports facilities
Municipal asset inventories
Bring the small, messy, locally-published datasets together — and find out which of them can be trusted before you draw them.
CRS inferenceQuality findingsSuitabilityMap studioA municipality's own open data is where CRS problems live: a layer served in Lambert-93 but declared as WGS 84, another with coordinates carrying nine decimal places of false precision, a third whose newest date is from 2005. The profiler reports each one, with the reasoning and the remediation, and refuses to place the ones it cannot read. That refusal is the feature: a map that silently drew them would put a cycle network in the Gulf of Guinea.
- Register each source and materialize it
- Read the quality card: declared vs measured CRS, precision, freshness
- Fix or accept each finding — the platform never silently corrects one
- Compose what survives into one map, with cross-filtering widgets
- BD TOPO® · IGN
National reference data, in three dimensions
Extrude a building layer by its own height attribute and read the city as volume rather than as outlines.
3D extrusionMap studioVersioned assetsSharingBD TOPO ships building footprints with a measured height on every feature. Extruding by that column turns a polygon layer into a massing model — useful for anything where what matters is above ground: sightlines, solar exposure, shadow, or simply explaining a site to somebody who does not read plans. The extrusion is part of the saved map document, so the view is versioned and shareable like any other.
- Extract the departmental BD TOPO layers and materialize them
- Add the building layer and set 'Extrude by' to its height column
- Pitch the camera; the layer renders as volume, cross-filtered like any other
- Publish the map version and share it
- In-app assistant · MCP
Agent-assisted catalogue review
Put the question to an agent that can read every profile, and get an answer with the tool calls that produced it.
AssistantPlan-firstMCPConversation mirroringReviewing a catalogue is exactly the kind of tedious, mechanical reading a person does badly and an agent does well: open each profile, check whether a CRS was inferred, note the findings. The assistant works the same API under the same tenancy model, proposes before it acts, and shows every call it made. An external agent gets the same reach through MCP, and its transcript can be mirrored back into the app so the team sees the work.
- Ask the assistant which datasets cannot be placed on a map
- Watch the tool calls resolve, including the ones that return nothing
- Get the answer with the catalogue's own cards inline, not a paraphrase
- Mirror an external agent's session in if the work happened elsewhere
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.