Skip to main content

Geoart Builder

Build paired posted and final coordinates for geocache geoart.

Paste final coordinates, optionally paste matching posted/art coordinates, then drag the posted pins into the artwork. Posted pins are constrained to the 2 mile limit around their paired final, and finals are checked against the 528 ft physical-cache spacing rule. For the maximum workspace, close the sidebar before arranging larger geoart.

Import
FAQ & How to Use
What does this tool do?

Geoart Builder helps you lay out a series of geocaches whose posted (publicly visible) coordinates form a shape on the map, while the actual finals stay close enough to the posted pin to satisfy geocaching.com's 2 mile bogus-coordinate rule. It validates the two distance rules every reviewer checks (posted within 2 mi of final, finals at least 528 ft apart), lets you drag pins around, and exports GPX, CSV, and map images for submission.

Your coordinates stay private. Everything runs in your browser. Nothing you enter, upload, or export is sent to CacheSleuth or any other server. See the privacy note below for details.

Is my data private?

Yes. This tool runs entirely in your browser. Your cache names, posted and final coordinates, cache types, and notes are never uploaded to CacheSleuth or sent anywhere outside this browser session.

  • Spreadsheets you upload (.xlsx, .csv, .numbers) are read locally in your browser. The file itself is never transmitted.
  • GPX, CSV, project JSON, and map images are generated on your device and saved straight to your downloads.
  • Nothing is stored on a server and there is no account. Your data lives only in this tab and is gone when you reload or close it, so export a project JSON if you want to keep working later.
  • The only outside requests are for the background map tiles from the map provider (so the map can draw). Those requests reveal the map area you are viewing, never your cache data.
"Posted" vs "Final": which is which?
  • Posted (aka virtual, fake, art, bogus): the coordinates the public sees on the cache page. These form the artwork.
  • Final (aka actual, physical, real): where the cache is actually hidden. Always within 2 mi of its posted pin.
Four ways to add caches
  1. Paste lists: drop finals into the left textarea, one per line. Each line can carry optional fields separated by a pipe: Name | coordinate | type | note (type and note are optional, and a bare coordinate or "Name | coordinate" still works). Type names map the same way as the spreadsheet import (so "multi", "trad", "mystery", and so on). Optionally paste matching posted coords on the right. Click Build Geoart.
  2. Upload spreadsheet: an .xlsx, .csv, or Mac .numbers file. The tool's own exported Cache CSV imports straight back in. See the spreadsheet section below.
  3. Add Cache: open a small form to add one cache at a time. Posted defaults to the final if left blank.
  4. Import Project: reload a previously exported geoart-project.json to keep editing where you left off.

A fifth way, Image to Pins, turns an inspiration image into the posted artwork for finals you already have. See its own section below.

Image to Pins: trace an image with your posted pins

Image to Pins takes an inspiration image and an existing set of final coordinates and works out posted (art) coordinates so the posted pins trace the picture on the map, while keeping every posted pin within the 2 mile limit of a real final. It is for the common geoart case where the finals are already fixed (a park, a trail network, a grid you have permission for) and you want the public coordinates to form a shape.

How to use it

  1. Load your finals first, by pasting a finals list or uploading a spreadsheet. The spreadsheet can carry all the usual submission columns (name, type, size, difficulty, terrain, attributes, hint, description); those ride along untouched.
  2. Click Image to Pins and drop in an image. High-contrast silhouettes and logos read best. The tool traces it into a cloud of dots, one dot per cache. The dot count defaults to your number of finals.
  3. Tune the look with the Invert, Threshold, Contrast, and Density falloff controls, or Reshuffle dots for a different arrangement.
  4. Click Place on map. The tool auto-fits the dot cloud over your finals and matches each dot to a final within the limit.
  5. On the map, drag the center handle to move the image and the rim handle to rotate and resize it, or use the Rotate slider and the size buttons. The match re-solves live as you adjust.
  6. Click Use these pins to write the posted coordinates onto your caches. Everything else about each cache stays exactly as it was.

What "within range" means

  • Each dot becomes one posted pin and is matched one-to-one to a final. A dot that has no final within the limit (set by the Posted limit dropdown, 2 mi by default) shows red and is left out of the artwork; the finals it would have used keep their current posted pin.
  • The 2 mile limit is generous, so a reasonably spread series usually places every dot. Exceptions show up mainly when finals are tightly clustered (the image has to stay small) or have big gaps the image spans. The readout above the map always shows how many placed, for example "all 30 within 2 mi" or "26 of 30 placed, 4 too far".
  • The picture's detail is limited by the number of finals: 30 caches make a 30-dot silhouette, not a photograph.

Still private. The image is read and processed entirely in your browser and is never uploaded, just like your coordinates.

Coordinate formats accepted

Enter latitude first, then longitude, separated by a space or comma. Direction comes from a hemisphere letter (N/S and E/W) or a +/- sign. All examples below are Big Ben in London. Every format works in the paste boxes, the Add Cache form, the row editors, and spreadsheet cells.

  • Degrees decimal minutes (DDM) — the geocaching standard: N 51 30.042 W 000 07.476
  • DDM with symbols: N 51° 30.042' W 000° 07.476'
  • Decimal degrees (DD): 51.5007, -0.1246 or N 51.5007 W 0.1246
  • Degrees / minutes / seconds (DMS): N 51 30 03 W 000 07 29 or N 51° 30' 03" W 000° 07' 29"
  • Signed decimals, no hemisphere letters: +51.5007 -0.1246
  • Compact packed numbers: N5130.042 W0007.476 (packed DDM) or N513003 W000729 (packed DMS)

The parser reads any non-letter character as a separator, so extra spaces, commas, and degree symbols are all fine. North and East are positive; an S, W, or a minus sign flips the sign.

It also accepts every notation from the Batch Coordinate Converter, so you can paste grid and code formats directly (one per line, or as a spreadsheet cell):

  • MGRS: 30U XC 99567 09427
  • UTM: 30 U 699567.54 5709427.56
  • Plus Code: 9C3XGV2G+75J525
  • Geohash: gcpuvpmm2d79
  • Maidenhead: IO91WM50BE10MH46
  • OSGB grid: TQ 30270 79641
  • GeoHex: QE01666112473272870570
  • Geo3x3: W9633932282187272119
  • NAC: GZNMMH RKH34G
  • Mercator: X: -13870.4085, Y: 6710344.2598
  • Reverse Wherigo: 015301 506204 068070, and RWIG day1976: AP8JF A99WI

Each pin holds one location, so every value you paste must encode both latitude and longitude (these grid and code formats already do).

Best practices for your spreadsheet

The importer auto-detects most layouts. Alongside the coordinates you can add optional Cache Type, Size, Difficulty, Terrain, and Hint columns that import straight into the submission fields, plus a private Note column. A simple example:

NamePostedFinal
Geoart 01N 51 30.500 W 000 08.000N 51 30.042 W 000 07.476
Geoart 02N 51 30.600 W 000 07.900N 51 30.100 W 000 07.400

You can also keep latitude and longitude in separate columns. Put one value per column and label them clearly so the importer pairs them correctly, for example Posted Latitude / Posted Longitude and Final Latitude / Final Longitude. In the mapping modal these map to Posted latitude (N/S), Posted longitude (E/W), and the Final equivalents. Cells can be full values like N 51 30.042 and W 000 07.476, or the compact packed number 5130.042 and 0007.476 (read as N latitude and W longitude — include the hemisphere letter in the cell if you are south of the equator or east of the prime meridian).

What the auto-detector recognizes

  • Full coordinate in one cell: a header containing Final, Real, Actual, or Physical maps to the final; Posted, Fake, Virtual, Bogus, or Art maps to the posted.
  • Separate latitude and longitude columns: pair a latitude column (header N/S, North/South, Lat, or Latitude) with a longitude column (header E/W, East/West, Lon/Lng, or Longitude). If the header itself does not say posted or final, put a section label such as a merged Posted Coordinates or Final Coordinates heading in the row directly above the headers and the importer assigns the pair from it.
  • Inline qualifiers: a latitude/longitude header with no posted or final word defaults to posted. Add a final-style word to mark it as the final, for example a Latitude column is posted while a Real Latitude column is the final.
  • Compact packed numbers: a cell like 5130.042 reads as 51° 30.042' and 0007.476 as 0° 07.476'. Latitude columns default to N and longitude columns to W; include the hemisphere letter in the cell for other hemispheres.
  • Name column: headers like Name, Label, Title, Cache Name, Waypoint Name, Point, or Marker become the cache label. If none is found, caches are auto-numbered Geoart 01, Geoart 02, and so on.
  • Cache type column: a header like Cache Type or Type sets the posted pin icon. Values are matched loosely, so Mystery, Unknown, Multi, Multicache, Multi-cache, Traditional, Letterbox, and Wherigo all work. Anything unrecognized falls back to Mystery.
  • Difficulty and terrain columns: a header of D, Diff, or Difficulty sets the cache difficulty, and T, Terr, or Terrain sets the terrain. Values are snapped to the valid 1 to 5 range in half steps. Blank cells keep the Submission defaults value.
  • Container size column: a header like Size or Container sets the size. Micro, Small, Regular, Large, and Other all work; anything else (or blank) keeps the default.
  • Hint column: a header like Hint imports into the cache hint (shown encrypted on the cache page), not the private note.
  • Note column: a header like Note, Notes, Comment, Remarks, Memo, or Description is kept as a private per-cache note. Notes are never shown on the map or in the exported images; they ride along in the Cache CSV and the project JSON.
  • Ignored columns: Bonus, Number, No., #, ID, Correct Answer, Distance, Status.

Tips for clean imports

  • Keep header rows at the top. If the importer guesses the wrong header row, bump the "Header row" number in the mapping modal.
  • Every column dropdown can be overridden, and you can switch worksheets from the sheet dropdown.
  • If your sheet only has posted (no finals filled in yet), the row imports anyway: posted becomes the final and the posted pin starts on top of it. You can drag it later.
  • A section heading that spans two columns only needs to label the first column of the section.
  • The live preview at the bottom of the mapping modal shows a parsed/failed count for the first rows, so you can confirm the mapping before importing.
Distance rules & resolvers
  • Posted limit (2 mi by default, switchable to 1.995 mi): any posted-to-final pair beyond the chosen limit opens the "Posted Too Far" walker after an upload or Add. Per pair you can Accept (caps at 2 mi and clears the warning), Save edited posted, or Move posted to final. Use the Posted limit dropdown above the map to tighten to 1.995 mi instead, which leaves a small safety margin under the hard reviewer limit.
  • 2 mi hard cap: dragging a posted pin past 2 mi snaps it back to just under 2 mi. The same cap is enforced on manual coordinate edits, no matter which limit you pick.
  • 528 ft (0.1 mi) final spacing: any two finals closer than this trigger a red banner. Clicking Resolve opens a walker that lets you edit either coordinate or skip to the next pair. The banner stays visible until every conflict is resolved.
Working with the map
  • Drag any pin to move it. Posted pins are clamped to 2 mi from their final.
  • Layer checkboxes toggle posted pins, final pins, 2 mi limit circles, 528 ft spacing circles, posted-to-final lines, and labels.
  • Pin display: turn on Hide pin numbers and Small pins above the map to declutter dense artwork.
  • Recenter pans to the center of all currently visible pins; View All fits the map to them.
  • Map layers: switch between Mapbox Street, Mapbox Satellite, Mapbox Outdoors, OpenStreetMap, Esri Satellite, Esri Street, Esri Topo, and OpenTopoMap from the layer control.
  • Clicking inside a row in the list below the map zooms to that pair.
Selecting rows and bulk editing
  • Filter Rows searches every field: label, index, icon name, coordinates, distance, and status.
  • Select shown selects every row matching the current filter; Clear Selection deselects them again.
  • Only not ready filters the list down to caches still missing a required submission field (the count beside it shows how many), so you can jump straight to what needs attention and fix or bulk-apply just those.
  • To change the posted icon (or any submission field) on just the selected caches, set it in the Submission defaults panel and use Apply to selected; Apply to all caches changes every cache at once.
Exports
  • Export Project: a JSON snapshot you can re-import later. Includes labels, cache types, notes, your row selections, and both coordinate sets, so Import Project restores everything exactly.
  • Posted GPX: waypoints at the posted coords with the per-row icon type. Drop into Garmin or Geocaching.com submissions.
  • Finals GPX: private waypoints at the real finals, tagged as Final Location. Keep these to yourself.
  • Cache CSV: one row per cache with both sets of coords, the cache type, size, difficulty, terrain, attributes, hint, long description, your note, and the validation status. This file imports straight back via Upload spreadsheet: name, type, note, size, difficulty, terrain, hint, attributes, long description, posted, and final columns are all recognized automatically, so the whole sheet round-trips. Each attribute carries its id (for example Scenic view (#8); No Dogs (#1)) so it re-imports exactly; distance and status are ignored.
  • Posted Image / Finals Image: the map briefly expands to fullscreen and zooms out to frame every pin, captures a PNG, then snaps back to your previous view. The Posted image is the clean shareable artwork: just the numbered posted pins, no validation overlays. The Finals image is your working copy and also draws the 528 ft spacing rings, the 2 mile limit circles, and the posted-to-final connector lines. Labels are left off both so the numbers stay readable. If the export fails, switch to the OpenStreetMap base layer and try again (some satellite tiles refuse cross-origin canvas).
Preparing a batch submission

Beyond the coordinates, each cache can carry the rest of the fields the geocaching.com hide form asks for, so a big geoart becomes far less repetitive to submit.

  • Submission defaults: once you have caches, the panel above the row list sets the name pattern, posted icon, size, difficulty, terrain, attributes, hint, and long description that most caches share. Tick only the fields you want to change, then Apply to all caches or Apply to selected writes just those onto the caches already on the list. Any submission columns you mapped at import (size, difficulty, terrain, hint, attributes, and long description) come in populated already, and you fill or override the rest from this panel afterward. A name pattern like GeoArt {nn} numbers every cache in order. Use {n} for no leading zeros, or {nn}/{nnn}/{nnnn} to pad to two, three, or four digits; numbers past the pad width still count up in full.
  • Description editor: the long description has an Edit / preview button (in the defaults panel and on each row) that opens a WYSIWYG editor with a View HTML source toggle, just like the one on geocaching.com. It renders at geocaching's exact cache page width (670px, adjustable) so it looks right, with Fit and zoom controls for small screens.
  • Per-cache overrides: open Submission details on any row to change that cache's size, difficulty, terrain, attributes, hint, page text, or waypoints individually. The Submission-ready count at the top tracks how many caches have a name, a size, and listing text, with no half-filled waypoint (any waypoint with a name or description also needs a coordinate).
  • Submission helper: steps through the caches one at a time with a copy button on every field, so filling the hide wizard becomes copy, paste, Next instead of retyping everything.
  • Submission GPX: a full export (with size, D/T, attributes, hint, and description) for your own records or GSAK. Geocaching.com does not import a GPX to create listings, so this is for you, not an upload.
  • Form-fill helper (advanced): an optional userscript that pre-fills the hide form from your batch. It never submits for you. Use it at a human pace and at your own risk, and be sure you know what geocaching.com's Terms of Use allow before using it; it is a convenience, not a bulk submitter. The Submission helper is the always-safe alternative. Large geoart is best coordinated with your local reviewer in advance.

Still private. The submission fields, like everything else here, stay in your browser. Nothing is uploaded to CacheSleuth.

Why did some rows get skipped, and how do I fix them?

A row is skipped only when its final cell (and posted cell) are empty or cannot be parsed. If just the posted cell has data, it is promoted to the final instead of being skipped.

Before importing: the mapping modal shows a live preview with a parsed/failed count for the first rows. If you see failures, fix the column dropdowns or the bad cells before you import.

After importing: a banner lists the exact spreadsheet row numbers that were skipped, with a snippet of each so you can find them in your file. To bring them in, do any of these:

  • Re-open Upload spreadsheet and correct the column mapping, then re-import.
  • Fix the offending cells in your spreadsheet (a common cause is a missing hemisphere letter or stray text) and re-import.
  • Add the few stragglers by hand with Add Cache.