Release Notes
Platform updates, new features, and improvements.
Platform updates, new features, and improvements.
If your membership expires while you're signed up for a members-only trip, you keep access to the trip details.
Rope's only as good as the knot. But we don't cut it while you're still on rappel.
If you signed up for a members-only trip and your membership expired before the trip date, the site locked you out of the trip detail page — even though you were still on the roster. You couldn't see the meeting location, sign your permit, or cancel your own signup.
The membership gate now checks whether you have an active signup before locking the trip. If you're already signed up, you keep full access to the trip details regardless of your current membership status.
Anyone whose annual membership lapses between signing up for a trip and the trip date. Previously you'd see a locked card with no way to interact. Now you see the full trip page as expected.
Authorized viewers can expand the trip roster to see everyone signed up by name, not just the headcount.
Used to be you'd squint at the paper signup sheet to figure out who else was fool enough to come. Now it's a button — and it won't let just anybody read it.
The roster section on a trip page used to show only a ring with counts. Now, if you're allowed to see it, you can expand that ring into the full list of who's coming.
Names are only shown to people who have a reason to see them:
Everyone else still sees just the headcount ring — participant names stay private.
The list is assembled on the server and trimmed to name, role, and status before it ever reaches your browser. Contact details and emergency information are never sent to this view.
Locked-content messages now consistently reference the $15/year membership instead of the retired vouching system.
Several surfaces that gate content behind membership still referenced the old recognition/vouching path that was retired on May 14. These now consistently describe the actual gate: membership at $15/year, with a link to the join page.
Destructive-action buttons now use inline confirm/cancel instead of browser popups that fail on mobile.
Used to be you tapped "Cancel Signup" on your phone and nothing happened. Reckon that's fixed now.
Every destructive action on the site — canceling a signup, declining a permit, deleting a trip — used the browser's built-in confirmation popup. That popup silently fails on many mobile browsers, WebViews, and PWA standalone mode. The button would do nothing, with no error message.
All confirmation prompts now render as inline confirm/cancel buttons directly on the page. No browser popup, no platform dependency. You tap the action, the button expands to show "Confirm" and "Cancel" right where you're looking.
This affects every surface with a destructive action:
If you've been managing trips or gear from your phone, some buttons may have appeared broken. They weren't — the browser was swallowing the confirmation dialog. This fix makes every action work reliably regardless of device or browser.
Trip and report content is now blocked from AI training crawlers and search-engine indexing, with a honeypot for the bots that ignore robots.txt.
Conservation matters more than your photo album. Glad someone said it out loud.
Specific cave names, locations, and access details are the kind of thing that gets caves trashed when they leak. Now that public AI training crawlers will scrape any unprotected web page for model training data, leaving trip and report pages open meant a cave name mentioned in a report could end up in a chatbot's answer to anyone who asked. That's done.
On the trip, event, report, and calendar pages:
x-robots-tag: noindex, nofollow, noai, noimageai, asking search engines not to index, follow links from, or use the content for AI features./trips from a normal browser, nothing changes.A new route at /cave-database looks like an attractive cave catalog but is entirely fake — fictional caves with plausible-but-wrong coordinates, all hand-written. The route is linked only from places real users won't click (hidden footer text), so any traffic to it is a bot ignoring noindex. Hits are logged with the visiting IP for later review.
Caves are physically fragile, biologically sensitive, and a real conservation problem when crowds find them. Cave locations are guarded for that reason — the National Speleological Society's Cave Conservancy guidelines are explicit about not publishing coordinates. AI training data ends up in models that confidently regurgitate it later. The block draws a clear line: marketing for the grotto stays open, cave content goes through membership.
Recognition is now a social vouching feature — leave a short note on another member's profile to recognize the caving experience you shared.
The "Recognized Member" badge is now a purely social feature. There is no longer a status threshold, no admin-managed recognition, and no permission gate tied to the badge. Recognition is just members vouching for each other — leaving short notes on profiles about their caving experience together.
The only thing gated behind anything on this site is membership ($15/year).
The badge is derived from the number of recognitions a member has received. Each tier earns one more bat. Tiers are computed live — no admin grant, no manual promotion.
| Bats | Threshold |
|---|---|
| 1 bat | 1+ |
| 2 bats | 3+ |
| 3 bats | 8+ |
| 4 bats | 20+ |
| 5 bats | 50+ |
Crossing a tier triggers a notification to the recipient.
A persistent in-app nudge for unsigned permits, a nav badge with the count, and a copy-link card for trip leaders.
Used to be you signed the landowner's clipboard with a golf pencil five minutes before the trip. The banner won't let you forget anymore.
If you signed up for a trip that needs a landowner permit, you might forget to actually sign it until the day-of. The system used to email you and call it good. Now it nudges harder as the trip approaches, and gives leaders the tools they need to keep things moving.
A banner above the main page nudges you about unsigned permits. It escalates with the trip date:
Each row shows the trip name and a button to sign. The banner clears as soon as you sign each pending permit.
Whenever you have at least one unsigned permit, a Permits (N) link appears in the top nav with the count. Clicking it takes you to a new page at /member/permits/pending that lists every permit you still need to handle.
After signing up for a permit-required trip, the success page now embeds the permit signature card directly. You can sign on the spot instead of digging through email to find the link.
Trip leaders, accepted co-leaders, and permit-bypass staff (trip managers, moderators, admins) now see Confirm, Bounce, and Decline buttons next to each signup on the manage panel — same audience that could already act on permits, just with a cleaner surface for doing it.
The trip detail page now shows a dedicated Permit link card for anyone who can act on permits. The card has a copy-to-clipboard button and an open-in-new-tab link so leaders can grab the URL without scrolling through a participant's signup view. If the trip needs a permit but no link is configured, the card flags it as a warning instead.
Three buttons where there used to be one. Reckon someone'll figure it out.
A new My Agenda page consolidates trips you're going on, trips you're leading, and event attendance. Editing a trip now opens a dedicated page instead of an inline panel.
Used to keep my trips on a paper clipboard pinned to the dashboard. Page is easier to update.
You had to look in two or three places to see your own caving life — a manage panel for trips you lead, the signups list for trips you joined, and the events page for what you said you'd attend. There's now one page that shows all of it.
A new page at My Agenda (linked from Tools) shows everything you're involved in:
Two filter tabs let you narrow by window (upcoming / past) and scope (going / leading). The Leading filter only shows up if you actually lead anything, so it stays out of the way for everyone else.
Trips on the agenda now wear pills that tell you their state at a glance:
Editing a trip no longer happens in an inline form on the manage panel. Clicking edit on any trip you own opens a dedicated page at /member/trips/[id]/edit with the full redesigned trip form. Public trip detail pages now also show an Edit button for trips you can edit, so you can jump straight from the trip board to editing.
One unified form for every trip — public, private, create, edit — with section navigation, new leader-contact controls, and proper permit handling on personal trips.
Used to be I'd squint at four different trip forms looking for the same field. Down to one now. About time.
If you've ever created or edited a trip on this site, you've used one of four different forms — grotto create, grotto edit, personal create, personal edit — each with its own quirks. That ended. Every trip flow now uses the same form, and you can tell where you are at a glance.
Whether you're starting a new public trip, editing a draft, creating a personal trip with friends, or editing one you already have, you're filling out the same form. Section names and fields are identical across all four flows; only what's relevant for your trip type shows up.
The form is split into sections — Basics, Description, Location, Permit, Approval, Roster, Leaders, and (for grotto trips) Publish Status. The header is sticky and shows your progress as a dot line. Click any dot to jump straight to that section without scrolling.
Personal trips now have the same permit handling as official grotto trips. If your trip needs a permit, you can flag it, set the permit owner, and signups go through the permit-signature flow just like a grotto trip. Previously, permit handling was grotto-only.
The legacy free-text columns (leaderName, leaderContact, permitReference) are gone. Leader identity now comes from the user picker, and permit data comes from the assigned permit record. If you had old free-text values in those fields, they were migrated to the new structured fields before the columns were dropped.
Cleaner data underneath, fewer places for the same name to be spelled three different ways. Won't say I told you so. But I did.
The post-payment page now tells you exactly what state your membership payment is in, with eCheck-specific copy for the slow ones.
Used to be we'd hand the treasurer a fistful of crumpled bills in the parking lot. At least now the slip says what's happening.
If you paid for membership and PayPal sent your payment as an eCheck, your account didn't activate immediately and you had no way to tell why. The signup page just said "thanks." Now the page knows the difference.
The page you land on after PayPal sends you back now reflects the actual state of your payment:
A new page at /admin/paypal-ipn shows the last 100 PayPal events the site has received — every verified payment notification, whether or not it activated a membership. Use it when a member says "I paid but it doesn't show" — the raw event is preserved so you can see exactly what PayPal sent.
Every verified PayPal notification is now stored to a new PayPalIpnLog table, so payment debugging no longer requires grepping the live server logs. The logging is wrapped so a database failure can't block the 200 OK back to PayPal (which would trigger PayPal's 15-retry storm).
Trip leaders and accepted co-leaders now occupy seats against a trip's group cap, so "spots left" reflects everyone actually going.
Back when we ran sign-ups on a paper clipboard, the leader's name was the first one written. We just forgot to count them. Math finally caught up.
Until now, the primary trip leader and any co-leaders sat outside a trip's max participants cap. A trip with a max of 20 and three leaders would still advertise "20 spots left" even though three people in the party were already going. That stops today.
Every trip's group cap now includes the people running the trip:
A trip with a max of 20 and three leaders now reads as 3 / 20 going before any participant has signed up. Seventeen seats remain available for signups.
If you set up a trip months ago expecting leaders not to count, that trip's effective signup capacity is now smaller by however many leaders you have. The system handles this gracefully — nothing breaks — but a few existing trips may now display as full or near-full when they weren't before. If that affects a trip you're running, raise the max in the trip settings.
When an accepted co-leader is removed from a trip, their seat opens up immediately and the next eligible signup on the waitlist gets promoted automatically. Pending invites that get declined don't change anything because pending invites never held a seat.
Capacity math, the registration state on the trips list, the signup endpoint, and the waitlist promoter all subtract leader seats from the same shared count. There is one source of truth for "how many seats are leaders holding," and every screen reads from it.
Rope's only as good as the knot. Same goes for the math behind a trip roster.
Submit a private trip for publication and turn it into an official grotto trip. Reviewers can approve, request changes, or reject — and your trip keeps its history through the whole process.
Back in my day we promoted a trip by handing the leader a beer in the parking lot. This is more auditable.
Until now, "personal trips" lived in a separate world from the official grotto trip board. If you wanted a trip you led to count for reports, the path was confusing. That's been rebuilt.
Every private trip you create now has a publication state, shown right on the trip card and in My Trips:
When you're ready, hit Submit for publication on a private trip. Reviewers see it in the admin queue alongside report submissions.
Trip managers, moderators, and admins can:
You'll see the review history on the trip's submission page.
Once a trip is published, edits and cancellations affect more people, so:
This makes it harder for a leader to silently change a trip out from under participants or other staff.
Trip reports now hang off the same canonical trip record — whether it started as a private trip you submitted or was created directly on the public board. There's only one source of truth for "did this trip happen, who led it, what got reported."
The leader of a private trip is locked to whoever created it. You can no longer reassign a private trip leader to someone else — that role is reserved for promoted/published trips and admin tools. This closes a small but real footgun where a private trip could end up "led" by someone who never agreed to lead it.
Won't say I told you so on the auto-notifications. But I did.
This is a substantial schema change: private trips and published trips share a single underlying record with an explicit publication status, instead of being shadow copies of each other. Existing personal trips and submissions were migrated automatically — nothing you've created in the past needs to be redone.
Jurisdiction is now derived automatically from the state, and the separate land manager field is gone.
Two small cleanups to the trip create/edit form:
No action needed for existing trips. The form is just shorter.
The trip detail page on mobile is tighter, the action bar stays compact, and the header no longer overlaps the sticky controls.
A pass over the mobile trip detail layout to fix several cramped or overlapping spots:
Small stuff matters. A jammed zipper on your pack ruins the whole trip just as fast as a bad anchor.
These are pure layout fixes — no functional changes to how signups or actions work.
New approval modes, signup stage badges, an "I signed the permit" action for members, and admin tools to manage permit owners.
Used to be we'd just leave a note on the landowner's truck and hope for the best. More steps now, but at least nobody falls through the cracks.
Trips that need a landowner permit now have a clearer end-to-end workflow. You'll see exactly where your signup stands at every step, and trip leaders have better tools to move people through the process.
Your spot on a permit-required trip can now be in one of these states, shown as a badge on the trip page and in My Trips:
You'll also get email notifications at each transition, and signup confirmation emails now include the permit owner's name and a link to where you sign.
When you reach the Permit signature required stage, your signup card shows a one-click button to mark the permit as signed. The leader gets notified to verify on their end.
When you create or edit a trip, the old "requires permit verification" checkbox is replaced with two cleaner controls:
The participants page shows each signup's stage and gives you per-row actions: approve an application, confirm a signed permit, or decline with a reason.
You also no longer count as a signup seat on your own trip — the seat count reflects participants only.
Two new things:
Whole lot of stages for what used to be a handshake. Not saying it's wrong.
The data model now uses explicit approval modes and signup stages instead of overloaded boolean flags, which is what made these clearer surfaces possible. Existing trips were migrated automatically; nothing you've done previously needs to be redone.
The mobile menu is easier to tap and no longer clips behind other elements.
A handful of fixes to the mobile hamburger menu:
Browse and search the member directory, view profile pages, and add a bio to your own profile.
We used to just know everybody. Grotto's getting big enough that a directory makes sense — won't say I like it, but I get it.
You can now find other members and see their profiles.
Head to the new Members page (in the navigation menu) to browse the full member list. There's a search bar at the top — type a name and results filter instantly.
Click any member's name — in the directory, on a trip report, or in a signup list — to see their profile. Profiles show:
Go to your profile settings and you'll see a new Bio field. Write a few words about yourself — it shows up on your public profile page.
When you vouch for someone, you can now add an optional note explaining how you know them. Notes are visible on their profile alongside the vouch.
Member profiles are only visible to other members. If you're not a member yet, you won't see the directory or profile pages.
Non-members signing up for trips now need the trip leader to approve their spot before they're confirmed.
Used to be you sized someone up in the parking lot by whether they brought their own helmet. A confirmation button is less personal, but harder to forget.
If you're not a current member and you sign up for a trip, the trip leader has to confirm your spot first.
Once approved, you'll see full trip details like the meeting location and map link. Until then, you'll only see the county and state.
Nothing changes. Members get confirmed instantly, same as before.
You'll see a new "Pending leader approval" section on your participants page when non-member signups come in. You can approve with one click, or decline with an optional reason that gets sent to the person.
Leaders can also turn on approval for all signups (members included) on a per-trip basis if they want tighter control.
You can now see platform updates on the new Release Notes page, and get notified when major features ship.
Back in my day you found out about changes when someone brought it up at the campfire. At least now it's written down.
We're building a lot of new stuff. Now there's a place to keep up with it.
The Release Notes page shows every update we ship — new features, fixes, and improvements. You'll find a link in the footer.
When something big ships, you'll get a notification. Major features also send an email if you want one. You can turn that on or off from your notifications page.
Sensitive cave locations and trip report details are now protected. Earn trusted status by participating to see more details on trips and reports.
Conservation matters more than convenience. Glad the website finally acts like it.
We care about cave conservation. Some cave locations are sensitive, and sharing them openly can lead to damage or unsafe visits. So we built a trust system.
Trip leaders can now hide cave names on their trips. If they do, anyone who hasn't earned trust yet sees a general label like "Trip in Hamilton County, TN" instead of the real cave name.
Trip reports work the same way. If you're not trusted, photos and videos are blurred and exact cave locations are hidden. You can still see the report text and general area, just not the specifics.
You earn trusted status by participating and getting vouched for by people who know you. There are two ways:
Once you qualify, it happens automatically on your next login.
Trip leaders and staff (trip managers, moderators, admins) are always trusted automatically.
Trust used to mean the old hands knew your face. Two trips and a vouch isn't so different, when you think about it.
You'll get a notification when you earn trusted status.