GIS developer for a Florida county. I write scripts and tools for everyone to use, and increasingly for people working within the GIS community.
They are single-file Python, MIT licensed. Each one guards a specific production
failure I have watched happen, and the README opens by describing that failure rather
than the feature list. Anything destructive is dry-run by default and needs --apply.
Most carry a --self-test you can run before trusting the tool:
python <tool>.py --self-test
Thirteen need an Esri library to run (arcpy or the arcgis Python API): agol-relink,
arcade-rule-deploy, arcpy-nullscan, fcload, fcpatch, fullpull, gdbprune, hostedreap,
safe-republish, sightline, svcdrift, whowrites, xydrift.
Ten of those thirteen still run their self-test without one, because the import is deferred
until the tool actually reaches a geodatabase or a portal. Three do not: fullpull and
sightline need their library present even to self-test, and arcpy-nullscan is an
older script with no self-test at all.
The other twenty-nine are standard library only and run anywhere Python 3 does. That
includes two that read Esri formats without Esri software: cimscan parses .aprx and
.lyrx with no ArcGIS installed, and gdbxray reads a geodatabase schema through GDAL.
| itemcensus | Inventory every item in an organization, and refuse to report a total the server cannot prove is complete. Search counts accurately only to 10,000. |
| sharewatch | Diff your sharing posture against yesterday, because the platform keeps no audit log. Read-only. |
| sightline | Audit web maps for layers their viewers cannot see. Broken sharing, dead services, public maps pointing at secured data. |
| agol-relink | Bulk-replace REST service URLs across Portal content, including the StoryMap and Experience Builder drafts other tools miss. |
| hostedreap | Delete hosted feature layer rows that no longer exist in your source. Backup first, dry run by default. |
| fullpull | Download every layer of a REST service into a File Geodatabase, verified against the server's own record count. |
| whobreaks | Every item referencing the one you are about to delete, including the Experience Builder drafts a dependency graph never opens. |
| ghostsvc | Services the server runs but the portal never registered. They answer anonymously and appear in no sharing report. |
| safe-republish | Refuse to truncate a feature class when the staged replacement fails a plausibility check. |
| fcload | Load a dataset into a geodatabase, refusing the imports that corrupt silently. |
| gdbxray | Print the schema ogrinfo will not show you: subtypes, attribute rules, attachment linkage. |
| gdbprune | Delete stale leaf versions from a versioned Enterprise geodatabase, printing the plan first. |
| arcade-rule-deploy | Deploy Arcade attribute rules, preflight-checked and idempotent. Resolves every FeatureSetByName before writing. |
| arcadecheck | Inventory every Arcade expression you own and say which ones can leave with you. |
| geocodesift | Audit a geocoded batch instead of believing its match rate. A ZIP-centroid fallback still scores 98. |
| tzrot | Find date fields reinterpreted as UTC, and count the records whose calendar day moved. |
| roadmiles | Certify centerline mileage and refuse to count the same road twice, including the copy digitized backwards. |
| arcpy-nullscan | Report NULL and blank values across every layer and standalone table in a map, including null geometry. |
| ringwind | Name every GeoJSON ring wound against your declared convention. A backwards ring makes point-in-polygon answer backwards. |
| sidestamp | Check what is stamped on each side of a centerline against the polygon that side fronts, and prove the sides are not reversed. |
| pl94 | Read the Census PL 94-171 file for any US county, refusing a block extract that does not reconcile to the county total. |
| fcpatch | Apply reviewed attribute corrections, refusing any row whose current value is no longer the value that was reviewed. |
| nalmatch | Reconcile a parcel layer against the tax roll. Refuses any ID rule that would merge two parcels into one key. |
| idreuse | Measure how far apart two rows sharing an ID actually are. A key that matches is not evidence they are the same object. |
| xydrift | Name the rows whose stored coordinate columns disagree with their own geometry, and resync only those. |
| feedstamp | Refuse to run the pipeline when the delivery is not a new, complete one. Yesterday's file is still a file. |
| svcdrift | Diff a published service against the dataset it came from, rather than calling two different schemas the same. |
| restfake | A mock ArcGIS REST server that fails the way ArcGIS actually fails: 200 OK with an error body. |
| pytlint | Static analysis for Python toolboxes. Never imports the file it checks. |
| cimscan | Report every data source in a tree of .aprx and .lyrx files with no ArcGIS licence. |
| gdbfence | Refuse the commit that puts a geodatabase, or a shapefile missing its .prj, into git. |
| clonedrift | Name every script on a share that exists in more than one version, and say what the versions disagree about. |
| alwayszero | Name every unattended script that cannot report failure. Task Scheduler has said 0x0 for four years. |
| whowrites | Name every script that empties a feature class, and never name a reader as the thing that destroyed it. |
| jobharness | One import gives a scheduled script logging, retry, resume and a safe unzip. Standard library only. |
| logsift | Mine a scheduled job's own logs into metrics, refusing the number that is really a timestamp. |
| litswap | Rename a string constant across a tree of scripts without touching one comment or docstring. |
| svcguard | Guarantee an ArcGIS Server service restarts around risky maintenance, even on failure. |
| taskpulse | Audit every Windows scheduled task and report which ones are silently failing. |
| stalehost | Find every file still naming the host you are retiring, and never call a tree clean it could not finish reading. |
| svcsource | Report what is behind every service on an ArcGIS Server site, and say which ones it could not resolve. |
| prostall | Diagnose why ArcGIS Pro is slow here, measure every answer, and never record a crashed probe as a finding. |
Start here if you are browsing: safe-republish is the shortest example of the idea. It refuses a truncate-and-append when the replacement data is not believable, because the row count people check first is the one that misses a 37 percent loss on a large layer.



