FreeSurfer (lh.pial, lh.inflated…), GIfTI .surf.gii incl. flat patches, .mz3 and more.
Click border points in order; Close ROI joins the last to the first.
Draw only the crossing part; both ends extend to the edge. Two points are enough.
Click to place a landmark. Click an existing one to remove it.
Saved ROIs never overlap: the one higher in the list keeps shared vertices.
Reloads a session .json or exported .label.gii with editable borders.
Exports write saved ROIs: save the filled region, then export it from here.
Coordinates are written in the loaded surface's space.
One label per vertex; each ROI keeps its name and colour.
Editable border points and landmarks; load it back under Saved ROIs.
Drop a FreeSurfer, GIfTI or MZ3 surface here
Load a FreeSurfer or GIfTI surface — folded, inflated, spherical, or an unfolded flat — and mark regions by clicking along their border. The points are joined by the shortest path across the mesh, so the border follows the surface rather than a straight line through it. ROIs are drawn in sequence and partition the surface: each one's border becomes the edge the next is closed against, so neighbouring ROIs share a boundary exactly instead of having overlapping vertices.
With Include boundary vertices off, a saved ROI does not own the row it was drawn along, so the next ROI drawn against it claims that row. Tick it before saving to keep the border where you clicked it.
Sharing applies to every loaded surface with the same vertices (the same subject), for overlays loaded before and after the checkbox is ticked. Matching surfaces share the colour map, range and visibility; removing an overlay removes it from all of them. Unticking keeps existing groups shared and leaves new overlays on the surface they are loaded onto.
Every overlay is drawn only where the mask is non-zero. A file with "curv" or "curvature" in its name (lh.curv, hemi-L_curv.shape.gii) is treated as anatomy and always shown; for any other file, tick "Always show this overlay". A file with "mask" in its name can just be dropped on the viewer.
Saved ROIs never overlap. The list is a priority order: where two ROIs would share vertices, the one higher in the list keeps them and the lower one is trimmed to what is left. Because an ROI is stored as its border, moving a border re-shapes every ROI below it automatically. A saved ROI's rim also acts as an edge for the next one, so you only need to click the new border, not the shared one. Use ▲▼ to change the order, ✎ to reopen a border, or select a name to export that ROI.
Load ROIs from a file restores ROIs saved by this app — a
.surfannotate.json session, or a .label.gii it
exported — with their border points, so they can be edited or added to. They
are appended below any ROIs already listed. The session file is the editable
form; the .label.gii exports carry the same inside them.
lh.pial, lh.white,
lh.inflated, lh.sphere, flat surfaces.surf.gii, .mz3, .obj,
.stl, .ply, .vtk, .srf,
.off.annot, .label,
.label.gii, .shape.gii, CIFTI .dscalar.nii.label and .annot, which open in
freeview, Workbench, nibabel and NiiVue.label.giiYour surfaces, overlays and labels never leave this machine — everything runs in this browser tab, with no upload, account or server.