User Activity
Analytics
Who's online
Signed-in users active in the last 30 minutes, with their role and lifetime downloaded-elements count. Refreshes automatically every 15 seconds while this page is open.
Site status
Notification health
Whether approval, rejection and suspension emails actually left the server. A missing template or a mail failure used to pass silently — the admin saw “User approved” either way.
Users awaiting admin approval
Latest 8 signups
User profiles — photo directory
Every account with the passport photo supplied at signup — for putting a face to a name when reviewing an application. Read-only: use Manage on a card to jump to that user's row in Users & Approvals, where all the actions live.
Account deletion requests
Erasure is a right under the Data Protection Act, 2019, so these are held here as a worklist rather than only as a notification. Deleting an account is permanent and cascades across payments, requests and issues — confirm the person means it before you do.
Pending zone map purchases
Filed when a Platinum member clicks "Buy Zone Map" on a DC Policy zone. Billed per zone, like Survey Plans are billed per document. Confirm the Paybill payment, then click OK to grant a one-time unlock for that ONE zone — an invoice (NM-ZM-…) is written to their account at the same moment. Dismiss if it is a duplicate or the member changed their mind.
Ward map requests
Two kinds. A purchase is filed when a member clicks "Buy Ward Map" on a ward that has maps: confirm the Paybill payment, then OK to unlock that ward on their account — an invoice (NM-WM-…) is written at the same moment. A sourcing request is filed when nothing is on file for the ward; it is fulfilled by uploading a map from that ward's own drawer on the map, which closes it and notifies the member with the price. Here it can only be dismissed.
Survey Plan sourcing requests
Filed when a member clicks "Request Plan" on a parcel that has no Survey Plan on file at all — no charge is involved, so nothing here is a sale. To fulfil one, open that parcel on the map and upload the plan from its drawer: that files the document, binds it to the parcel, closes the request and notifies whoever asked, all in one step. Use Decline when the plan cannot be sourced (the requester is told), or Dismiss to close a duplicate silently.
Pending Survey Plan (FR) requests
Filed automatically the moment a Gold/Platinum member clicks "Buy Survey @ NKsh" on a parcel. Confirm the payment (they've been asked to send proof on WhatsApp), then click OK to grant a one-time voucher for that ONE document — or Dismiss if it's a duplicate or they changed their mind.
Reported issues — reply, resolve, archive
🔒 Parcels Cadastre download paywall
Platinum members must pay an extra one-time top-up before they can download the full Parcels Cadastre dataset. Confirm payment, then use the Grant/Revoke Parcels button on a user's row below.
🔒 DC Policy 2026 download paywall
Platinum members must pay an extra one-time top-up before they can download the DC Policy 2026 dataset. Confirm payment, then use the Grant/Revoke DC Policy button on a user's row below.
Survey Plan (FR) download paywall
Gold and Platinum members are billed per document, not a one-time account unlock — each parcel's Survey Plan (FR) is its own Ksh charge, spent the moment they view/download that one document. Confirm payment for a specific request in the queue below, then click OK to grant just that document.
Ward map paywall
Any signed-in member can buy a ward's maps — every file filed for that ward — for one Ksh charge, unlocked on their account once you confirm payment in the queue under Requests. Unlike Survey Plans this is not a one-time view: a ward has several files, and a voucher spent on the JPG would leave the PDF locked. Switch the paywall off and ward maps are included for everyone signed in.
Survey Plan (FR) sales & invoices
Every per-document charge that has been decided. An invoice is written automatically when you grant a request, and appears on the buyer's account page — use Invoice here to view or print a copy for them. Granted means paid but not yet viewed; consumed means they have since opened it.
Revenue & renewals
Top-up reconciliation
Parcels, DC Policy and Survey Plan (FR) unlocks are granted by hand after payment is confirmed off-platform. This is the ledger.
Custom layers — manage map themes
Files
Survey Plans (RIMS) — assets/data/rims
Upload a Registry Index Map PDF for a survey block. It's matched
to survey_blocks.geojson by block number and shows
up in the map's popup/drawer for that block automatically — no
separate publish step. A block can have multiple sheets (e.g.
Block 66 has 18) — uploading another sheet under the same block
number and label no longer errors, it's saved alongside the
others automatically. Use Delete to remove an outdated or wrong
sheet; to update one, delete it and re-upload the corrected PDF.
Parcel Survey Plans (FR) — assets/data/FRs
Upload a Survey Plan (FR / title deed reference) document for a
parcel. It's matched to parcels.geojson by FR number
and shows up in the map's parcel popup automatically — no separate
publish step. Viewing/downloading requires a Gold or Platinum plan
plus the Survey Plan (FR) top-up above. Each FR number can have only one
Survey Plan — use Delete to remove it, then re-upload to replace.
⬆ Bulk upload Survey Plans (FR)
Select up to 100 JPGs at once. Each file's FR number is taken from
its own filename, using a hyphen or an underscore
where the FR number has a slash — 191-1.jpg uploads as
FR 191/1, 33_142.jpg as
33/142, 1-78A.jpg as 1/78A.
Whichever you use, the file is stored under the underscored name.
Files are sent one at a time, so a bad file never blocks the rest
and you get a per-file result below. Anything named differently is
skipped — use the single upload above for those.
Each file must be under 10 MB. That is the live server’s
real post_max_size ceiling, not this app’s preference —
larger uploads are discarded before PHP sees them. Large-format plans
scanned at high dpi run well past that — a 1:1000 sheet at 600 dpi
is 70+ megapixels — and oversized files are rejected by the host's
firewall before they reach us, which shows up as an unhelpful
HTTP 403. Re-save those at a lower JPEG quality, or at about half
their pixel dimensions, before uploading.
An upload is rejected when no parcel in the cadastre carries that FR number — a survey plan can only be opened from a parcel popup, so one nothing links to would be invisible. To file such a plan, update the parcel data first, then re-upload.
Old Nairobi Maps (1880–1958) — assets/data/old_maps
Upload a historical Nairobi map image (JPG). It appears in the map's "Old Nairobi Maps" panel automatically — no separate publish step.
City Boundary Documents — assets/data/nairobi_maps
JPG, PNG or PDF reference documents/imagery. Each upload/delete
here updates assets/data/cityBoundary.docs.json (a
file the server creates and owns itself, so it stays writable
regardless of how cityBoundary.geojson was
originally uploaded) — the map merges it into the City Boundary
feature's properties for signed-in visitors, appearing as
regular attributes in the popup (within its 4-property limit)
and in full in the side drawer, as clickable links. Same concept
as Survey Plans (RIMS) above, but bound to the whole layer
rather than per-feature. Each click counts against a daily
download quota (Public 1, Silver 2, Gold 3, Platinum 10 —
admins unlimited); this list itself (View/Download here) is not
quota-limited.
Video Guide tutorials — video.html
Each row is one card on the public Video Guide page. Cards are fully yours to define — add as many as you like, name and describe each one, then upload an MP4 to it. A card with no upload yet shows the bundled default video so it never looks broken.
Release notes
The app asks users to hard-refresh but never says what changed. Publish a short note here and it becomes a reason rather than an instruction.
🔑 Generate a Data API key
Grants programmatic, key-authenticated access to every published map layer —
the built-in set and any active custom upload — via data_api.php
and the WFS endpoint below. No subscriber account needed. Scope which layers a
key can see and its daily request budget. The raw key is shown once, right
after creation — copy it immediately.
?key= and an active key appended. Any key below works, and a key scoped
to three layers offers only those three feature types.
Read-only — editing is not exposed over WFS. Budget generously: QGIS spends a request on every pan and zoom, not just on connecting.
Issued API keys
Only the first twelve characters of each key are kept. The server stores a hash, not the key, so the full value cannot be shown again after the moment it was created — if it is lost, revoke it and issue a new one.
Admin action history
Every consequential admin action (approvals, role/expiry changes, password resets, deletions, paywall config, Survey Plan (FR) request decisions, API key issuance) — most recent first.
Searches that found nothing
What users looked for and did not find — the clearest signal of which data to add next.
My notifications
Messages addressed to your own admin account — deletion requests, Survey Plan approvals and similar. The Unread — all users figure above counts every account's unread messages, not just yours, so the two will not match.