Skip to main content

Release Notes

Platform updates, new features, and improvements.

Notable

Email Event Attendees Directly

Event organizers can email everyone who RSVP'd going straight from the event page — and the Follow button, which never did anything, is gone.

Turns out the Follow button was a doorbell wired to nothing. Emailing the folks who actually signed the list — that's how it should have worked from the start.

Email Everyone Going

Event organizers now have an Email attendees button on the event page. Write the message once and it:

  • Emails everyone who RSVP'd going — except you, since you wrote it, and anyone who has turned off email updates.
  • Posts a notice in their app — so it reaches people even if the email doesn't.
  • Shows as an update on the event page — the message becomes part of the event's discussion, where latecomers can find it.

Updates Reach the People Coming

Event announcement emails used to go out to whoever had "followed" the event. Now they go to the people who RSVP'd going. If you're attending, you're in the loop — no extra button to remember.

The Follow button is retired.

Behind the Scenes

Follower records were removed along with the feature. RSVPs were never tied to following, so nobody's attendance changed.

Major

One Discussion Feed With Pinned Notices

Trip and event updates and discussion now share one feed, and leaders can pin a notice to the top and email everyone in the same step.

Two boards for one trip meant half the club read the wrong one. Now it's one board with the important part nailed where you can't miss it — took us long enough.

Until now every trip and event had two places to talk: an Updates section for official announcements and a Discussion for everything else. Plans have a way of landing in whichever one you weren't reading. They're now a single conversation.

One Conversation Per Trip or Event

  • Everything in one place — official notices and regular chatter share one discussion, newest activity first.
  • Your history came along — past updates weren't deleted; they live in the merged discussion like any other post.
  • Same people, same rules — who can read, post, and reply hasn't changed. Only the number of tabs did.

Pin a Notice to the Top

Trip leaders and trip managers — and on events, the organizers — can now pin any post that starts a thread.

  • Pinned notices sit above the conversation — all of them, in full. The "meet at the gravel pull-off, not the gate" post doesn't scroll away under forty messages about carpools.
  • They show in your home feed too — a discussion card in the feed carries its pinned notices, so the important part travels with it.
  • Pins are reversible — when the notice goes stale, unpin it and the conversation goes back to normal.

Pin and Email in One Step

The composer has a new checkbox: Pin to top (emails all participants) on trips, Pin to top (emails everyone going) on events.

  • One tick does both — the post is pinned and an email goes out: to everyone signed up on a trip, or everyone who RSVP'd going to an event. People who've turned off email updates are skipped.
  • Only the post that starts a thread — replies can't be pinned or emailed.
  • The email sends once, when you post — unpinning later removes the notice from the top, but the email that already went out stays sent.

A Tidier Read

Along the way the discussion got a cleanup: posts no longer carry category labels, the mobile feed runs edge to edge, and the dividers between posts behave themselves.

Behind the Scenes

Existing official updates were converted into regular discussion posts during the merge. Nothing was removed, and updates that were emailed keep that record.

That checkbox emails the whole roster, so read your post twice before you tick it. A golf pencil never sent forty emails by accident.

Notable

Broadcast Emails With Real Formatting

Emails to trip participants and event attendees now arrive with real bold, italics, and links — and you can preview the exact email before sending.

Your Formatting Arrives Intact

Writing something in bold or adding a link used to arrive in the email as the raw symbols you typed around it. Emails now render the formatting: bold is bold, links are clickable.

A Toolbar So You Don't Have to Know the Symbols

The email composer for trip participants and event attendees now has a formatting toolbar. Click a button, get the formatting — no need to remember which squiggle makes italics.

See the Actual Email First

The composer's preview now shows the exact email your recipients will get — same layout, same formatting — instead of an approximation. What you approve is what lands.

Asterisks scattered through an email read like somebody swearing in Morse code. Glad the bold is just bold now.

Minor

Mentions Now Read as Names, Not Code

Mentioning someone shows their name everywhere it appears — in your notifications, in previews, and in the box while you type.

When you mention someone in a discussion or a post, the site stores a hidden tag alongside their name so it knows who to notify. In a few places that tag leaked through and showed up as raw text instead of the person's name.

Where it looked wrong

  • Notifications — a reply that mentioned someone showed a jumble of brackets and letters where the name should have been.
  • Conversation previews — the one-line preview under a collapsed thread showed the same jumble, and it ate enough characters to cut the preview short.
  • The reply box — replying to someone mid-thread filled your message with the raw tag before you'd typed a word.

What changed

Mentions now read as the person's name everywhere: in your notifications, in previews, and in the box while you're writing. Notifications you already had are fixed too, not only new ones.

One thing worth knowing, since it changes how mentions behave: what you see in the box is now exactly what gets sent. If you delete someone's name from your message before posting, they won't be notified. Previously a leftover hidden tag could still notify someone whose name you'd removed.

Notable

See Who's Volunteering

Volunteer names now show under each event role, volunteers get their own tag in the who's-going list, and claiming a role RSVPs you automatically.

Used to be the volunteer list lived on a clipboard in somebody's truck bed, and the truck left at six. This is an improvement, and it only took thirty years.

Event pages with volunteer roles now show who actually stepped up — and claiming a role handles your RSVP for you, since nobody in recorded history has hauled a cooler to an event they weren't attending.

Names Under Each Role

Each role in the Volunteer roles section now lists who claimed it, with a small pending tag on requests the event lead hasn't gotten around to blessing yet. Hit Show volunteers and the names drop in from the ceiling like loose breakdown — every caver's favorite thing to see overhead. Names are visible to active members only; everyone else gets the filled counts and is free to wonder.

Volunteers Stand Out in the Who's-Going List

The Show who's going reveal now tags volunteers with their own Volunteer label and color, so you can tell at a glance who's coming to enjoy the event and who's coming to work it. To find out which job each of them got roped into, check the volunteer section.

Claiming a Role RSVPs You

Volunteering for an event now marks you as going automatically — you were always coming, you're the one carrying the water jugs; the system just finally believes it. Withdrawing from a role keeps your RSVP in place, so if your plans fall through entirely, cancel the RSVP separately.

Stalactites are supposed to hold tight to the ceiling. Ours apparently didn't get the memo.

Major

The Grotto Site Goes Social

Post to the club, share trip photo albums, discuss trips and events, get notified when you're mentioned, and follow it all in a rebuilt home feed.

For forty years the club's news lived on a corkboard by the gear room and whatever got passed hand to hand. Putting it all on one page the whole membership can read — that's an upgrade I won't argue with.

This is the big one. The grotto site is no longer just a trip board — it's a place where the club talks to itself. Post what you're up to, share the photos from Saturday's trip, hash out an event in the comments, and see all of it land in one feed.

Your home feed, rebuilt

Your member home is now a live feed built around what the club is actually doing. Posts, trip and event discussions, new albums, and featured events flow in newest-first, and a redesigned layout carries you down through the day's activity like a descent — the deeper you scroll, the further back you go.

  • Post front and center — the composer sits at the top of the feed, so sharing something takes one line.
  • Filter to what you want — switch between everything and the Activity view to focus on club activity.
  • Built for your phone — a mobile More sheet tucks the side navigation out of the way, the header slides away as you read, and the feed loads more as you keep scrolling.

Post to the club

Every member now has a posts section on their profile and can broadcast to the club feed.

  • Text, photos, and @mentions — write an update, attach photos, and tag other members by name.
  • Reactions and comments — react to a post or reply in the comments; the author gets notified when you do.
  • A real photo viewer — tap any photo to open it full-screen, then zoom, pan, and swipe between shots.
  • Members-only — posts are visible to active members, and they live on your profile and at their own shareable link.

Shared photo albums for trips and events

Every trip and event now has a shared photo album that everyone on the roster can add to — the answer to "send me the pics after."

  • One album per trip or event — anyone who was there can upload; event albums pool photos across occurrences with date sections.
  • It comes to you — a new album surfaces as a card in the feed and bumps back up when someone adds photos, and you'll get a nudge to add yours after a trip wraps.
  • Find them all — a My Albums page collects every album you can see in one place.

Discussions on trips and events

Every trip and event now has a discussion space, and it flows into your feed — no more chasing plans through group texts and half-remembered phone calls.

  • Official updates — trip leaders and event managers post announcements, the "meet at the gravel pull-off, not the gate" kind of thing. Signed-up attendees get notified, and it lands in their email.
  • Posts and replies — anyone on the trip or event can start a thread and reply: carpools, gear questions, the realistic underground time.
  • In your feed — discussions surface as cards, newest activity first, so you can catch up across everything you're on and reply without leaving the page.
  • Who can post and moderate — people on the trip or event read and post; leaders, co-leaders, and managers post the official updates; managers and moderators can edit or hide a post to keep a thread on track. On members-only trips, if you're signed up you keep discussion access even if your membership lapses.

Mentions that actually reach people

Type @ in any trip or event discussion, update, or comment and you'll get name suggestions for the people who can actually see that thread. Whoever you mention gets a notification in their bell — and when you reply to someone, they're mentioned automatically, so the person you're answering knows.

Featured events

Event managers can now feature an event to put it front and center. Featured events pin to the top of the member feed, and — for public, everyone-welcome events — ride a rotating deck-carousel hero on the site's public homepage. There's a cap, and the spotlight clears itself once the event has passed.

Behind the scenes

  • Photos are access-checked now — album, report, and profile-post images are served through routes that verify you're allowed to see them, instead of being publicly reachable by URL.
  • The member roster is members-only — the member directory and search are limited to active members and staff.
  • Deleting an event no longer destroys memories — removing an event now hides it but keeps its shared album intact, and it can be restored.

Just remember the cave doesn't care how many reactions the photo gets. Log the trip, pack it out, and let the pictures come second.

Notable

Free-Form Gear Notes

The required-gear list on a trip is now a free-form field that starts from the standard kit and you can edit however the cave calls for.

Standard kit hasn't changed in thirty years. Being able to scribble "bring the 45, the pit's deeper than the book says" right on the trip — that helps.

When you create a trip, the required gear is now a single free-form field instead of a fixed list plus extras.

Start from the kit, edit freely

New trips prefill the field with the standard kit, so you're never starting from a blank box. From there, write whatever this cave actually calls for — add the long rope, flag the tight spot, drop a line that doesn't apply. It supports Markdown, so lists and emphasis render cleanly on the trip page.

Behind the scenes

Trips you've already posted were backfilled so their gear list shows exactly what it showed before — nothing to redo.

Minor

Permit Confirmations Update the Roster Right Away

Confirming a participant's permit now updates their status on the roster immediately, without reloading the page.

On the participants page, marking someone's permit as confirmed used to leave them showing "Pending Permit" until you reloaded the whole page — so it looked like nothing had happened.

Now the roster updates the moment you confirm a permit. The participant's status flips right there on the page, no reload needed.

Notable

Managers Hear About New Trips, Not Every Edit

Trip managers get a notification when a new trip is published, and editing a published trip no longer sends one.

Time was, you heard about a new trip from a fresh card tacked to the grotto board. Now the folks who keep the schedule get word the moment it's posted.

If you help run the grotto's schedule, the app now tells you when a trip goes up.

What changed

  • A new published trip notifies the managers — when someone creates and publishes a trip, the trip managers (everyone but the person who made it) get a notification linking straight to it. It works the same way as the notice you already get when a published trip is canceled.
  • Editing a published trip is quiet now — changing the details of a trip that's already live no longer sends a notification, so a fixed typo or a nudged meeting time doesn't ping everyone.
Minor

Accurate Signup Counts on the Trip Board

The trip board and calendar now show the same signup count as the trip's own page.

The trip board and the calendar could show one fewer signup than the trip's own page. It happened on trips with a co-leader who hadn't been accepted yet but had also signed up as a participant — their seat was dropped from the count on the board while it still counted on the trip page.

Now every place that shows how many people are signed up counts them the same way, so the number on a trip card matches the number on the trip itself.

Minor

Screen-Reader Labels for Trip Report Ratings

The rock rating buttons on the trip report form now have names a screen reader can announce.

When you write a trip report, you rate it on things like difficulty, fun, mud, and scenery with a row of five rock icons. Those buttons had no labels, so a screen reader couldn't say which rock was which or what you'd picked.

Each rock now announces its rating — "Difficulty: 3 of 5," and so on — and reports whether it's the one currently selected, so the ratings can be set without seeing the screen.

Notable

Tighter Trip-Leader Contact Privacy

A trip leader's email and phone show only to the people meant to see them.

A leader's phone number isn't for the whole mountain to have. Good to see it fenced off.

Trip leaders' contact details are now shared more carefully.

Who sees leader contact

  • A trip leader's email and phone now appear only to the people they're meant for — based on the leader's sharing settings and whether you're signed up or a member — and not to anyone who shouldn't have them.

Behind the scenes

  • The trip board and trip detail data were tightened so leader contact details aren't sent along where they aren't needed.
  • Signing in now runs a constant-time check, so the login form can't be used to figure out which email addresses have accounts.
Notable

Edit and Delete Your Chat Messages

Fix a typo or take back a message in trip chat, and chat links now open straight to the conversation.

Used to be once you hollered it down the passage, it was said and done. Now you get a do-over.

Trip chat now lets you tidy up after yourself, and getting into a chat is quicker.

Edit or delete your own messages

  • Edit — fix a typo or update details after you've sent a message. It keeps a small edited marker so nobody's left guessing whether it changed.
  • Delete — take down a message you'd rather not leave up.
  • The Message actions menu only shows on your own messages. You can read everyone else's, but you can't edit or remove them.

Straight to the conversation

  • Opening a trip's chat — from a notification, the trip Discussion page, or the nudge right after you sign up — now drops you directly into that trip's chat window, instead of opening the full chat list first.
Notable

Email Your Trip Participants

Trip leaders, co-leaders, and trip managers can email everyone on the roster straight from the participants page.

Used to be a change of plans meant a phone tree and a note left under somebody's wiper blade. One message to the whole roster beats that.

If you run trips, you can now reach everyone signed up without leaving the participants page.

Email everyone signed up

The participants page has a new Email participants button. Write your message, confirm, and it goes out as an email to everyone signed up who hasn't turned off trip email — a weather call, a change of meeting spot, a gear reminder. It's also recorded as an official update on the trip, so there's a record of what was sent.

The button tells you it has nobody to reach when a trip has no signups yet, so you're not emailing an empty room.

Co-leaders and trip managers can speak officially too

Posting an official update used to be the trip leader's job alone. Now the leader's accepted co-leaders and the grotto's trip managers can post official updates — and send these emails — as well. If you're helping run a trip, you no longer have to track down the lead to get word out.

Behind the scenes

Who counts as an official-update sender is now decided by one shared rule across the trip discussion and the participants page, so the people who can post an update and the people who can email the roster are always the same set.

Minor

Cleaner Participant Permit Roster

Participant roster rows now stack name and actions so long names stop wrapping mid-word, and permit buttons read cleaner.

On the participants page, the permit roster used to cram each person's name, status, and action buttons onto one line. When the buttons got crowded they starved the name column, so longer names broke mid-word and multi-word status badges collapsed into a smudge.

Each row now stacks: the name and its status pill sit on top, with the actions on their own line below. Status badges stay on a single line, the "member hasn't notified yet" note wraps as a normal caption, and the permit buttons drop the participant's name from their labels — it's already shown on the row — so the whole thing is easier to scan.

Major

Caving Skills on Member Profiles

Record your vertical proficiency, descenders, and ascending systems on your profile so members can see who's ready for rope.

Used to be you found out who could pass a knot when they were already hanging off one, in the dark, with the group waiting. Writing it down ahead of time is the smarter play.

Your profile now carries a caving-skills section: a plain record of what you can do on rope and the gear you run. Fill in your own from your profile page, and it shows up for other members when they look you up.

Rate what you can do on rope

Eight vertical skills — changeover, rebelay, redirect, knot pass, Tyrolean traverse, J-hang, guided rappel, and guided climb — each get a single honest rating:

  • Not yet — haven't done it.
  • Learning — can do it with help or supervision.
  • Comfortable — solid on your own.
  • Can teach — confident enough to walk someone else through it.

Leave anything blank that doesn't apply. Nothing is filled in for you.

Mark the gear you run

Check off the descenders you use — rack, micro-rack, bobbin, Stop, Simple, Munter hitch — and the ascending systems you climb — frog, ropewalker, Texas, Mitchell. If you run something that isn't on the list, there's a free-text field for each so you can add it.

You can also note the year you started caving and the year you started doing vertical, and your profile works out how long that's been.

How it shows up

What you enter is visible to other members on your profile, so a trip leader sizing up a roster can see at a glance who's comfortable on rope and who's still learning. You edit your own; you can't change anyone else's.

A checkbox says you own a rack. It doesn't say you can rig it on a windy lip with cold hands. Leaders still have to watch the rope.

Notable

Every Time Now Reads in Eastern

Trip, event, and email times now show in Eastern with an "ET" label and read the same for everyone, and editing a trip no longer drifts its saved time.

A trip time ought to mean the same thing whether you read it in Chattanooga or three states over. Took a while, but now it does.

Times on the site used to render in whatever timezone your phone or computer happened to be set to. A trip that started at 9:00 PM in Chattanooga could read as 8:00 PM for a member on Central time, with nothing on the page to say which zone you were looking at. Now every absolute time is shown in the grotto's home zone, Eastern, with a clear ET label — and it reads the same for every member no matter what device or timezone they're on.

Times you'll see in Eastern

  • Trips and events — start and end times on cards, lists, detail pages, the permit queue, and the gear pages all show in Eastern with ET.
  • The calendar — times on the month grid and agenda show in Eastern, and events are now grouped under the Eastern calendar day they fall on. A late-night trip lands on the right day for everyone instead of slipping a day forward or back depending on who's looking.
  • Email — signup confirmations, gear reminders, leader invites, and manager digests now state trip and event times in Eastern with ET, so the time in your inbox matches the time on the site.
  • Dates and timestamps elsewhere — report dates, "member since" dates, gear due dates, and the timestamps on chat, notifications, and activity feeds all read in Eastern.

Editing a trip no longer shifts its time

There was a bug where editing a trip could silently move its start or end time by your device's timezone offset — open a trip to fix a typo, save, and the time would quietly drift. That's fixed. Trip and event times now stay put when you edit, and when you enter a time in a form it's read as Eastern, matching what gets displayed.

Behind the scenes

Nothing about how times are stored changed — the fix is in how they're shown and read back. A few intentional spots were left alone: membership expiration dates and "5 minutes ago"-style relative times are unchanged, and the "Add to calendar" links you hand off to Google, Outlook, or Apple Calendar were already correct and stay as they are.

Minor

Trip Times No Longer Cut Off on Narrow Phones

On a skinny phone, a trip's full start–end time now shows on its own row on the trip page instead of being cut off.

On a narrow phone, the trip page used to squeeze the date and time into a small column next to the cave, difficulty, and spots — which cut off the end of the time. An overnight trip might read "10:29 PM – 3:…" with no way to see when it actually ended.

Now the date and time get their own full-width row at the top of that bar, so the whole range is always visible. The cave, difficulty, and spots sit in a wider row below, which also stops longer labels like "Advanced" from being trimmed.

Notable

See Who's Going — and an Event's Trips

Event pages now show a prominent RSVP and who's-going panel, plus the trips and volunteer roles that belong to the event.

A name on a list used to mean a name on a clipboard. Now you can see the whole party before you commit.

Event pages got a real overhaul. The cramped attendance card in the corner is gone, replaced by a proper RSVP and roster, and the page now shows the trips and volunteer work that belong to the event.

Who's going

  • A clear Going panel shows the headcount and a peek at who's attending.
  • Show who's going opens the full roster — searchable by name, paged for long lists, with the same flying-bat reveal as the trips page.
  • Attendee names are members-only. If you're not signed in as a member you'll see the count, but not the names.

Trips in this event

  • Every trip attached to the event is listed right on the page, each as a one-line row with its time and how many seats are filled.
  • Each row shows the cave's orientation — Horizontal or Vertical — so you know what gear to pack.
  • If you haven't RSVP'd yet, a banner reminds you that one RSVP unlocks signup for all of these trips.

Volunteer roles

For workdays and events that need hands, the volunteer roles now sit in the main column with a clear count of open spots, instead of being buried in the sidebar.

Notable

Attach Trips While Building an Event

Event managers can attach and detach existing trips directly from the event create and edit forms.

Used to take a stack of index cards and a parking-lot holler to pin trips to a gathering. One form does it now.

Event managers can now pull trips into an event straight from the event form, instead of opening and editing each trip on its own. The form lists the trips that are eligible to attach, and you can attach or detach them as you build or edit the event.

  • Only published trips can be attached to an event.
  • A trip linked to an event has to fall within the event's dates — the trip form warns you if a date drifts outside the event's window, and an out-of-range date won't save.
Notable

A Redesigned Calendar Month View

The month view is rebuilt to be legible on phone and desktop, with color-coded entries and a tap-to-open day view.

Spent years reading topo maps by headlamp. A calendar I can read at a glance is the least a screen can do.

The calendar's month view was hard to read — crammed on a phone, and bloated with repetitive tags on desktop. It's been rebuilt to be legible at any size.

On desktop

  • Each day shows up to three entries as clean one-line rows: a colored bar for the type, the title, and the time.
  • Trips are shaded by difficulty and events by kind, so you can read a day's mix at a glance instead of decoding repeated tags.
  • A members-only entry is marked with a small lock; a signup limit shows a short Waitlist, Full, or Closed chip — an open signup shows nothing.
  • Busy days collapse the rest into "+N more," which opens that day's full list.

On phone

  • The month is now a compact grid — each day shows its date and a few color dots — sitting above a full-month agenda with real titles and times.
  • Tap a day on the grid and the agenda jumps straight to it. The dots are just a map; the details live right below.
  • This replaces the old cramped month cards and the short week-at-a-time view that didn't let you plan far enough ahead.

One more thing

Private draft trips no longer show up on the calendar — a trip stays yours alone until it's published.

Major

Trips Can Now Live Inside an Event

Events can hold a set of trips, and one RSVP to the event unlocks signup for all of them.

Used to be a "cave-in" was a weekend, a cooler, and a clipboard nailed to a tree. Now the whole thing hangs together on one page.

The grotto runs gatherings that are really a bundle of trips under one banner — a regional meet, a multi-day cave-in. Until now those trips floated on the calendar with no connection to the event they belonged to. Now an event can act as a container for its trips, and your RSVP to the event is the key that unlocks them.

RSVP once, then sign up for the trips

When a trip is part of an event, signing up works in two steps:

  • RSVP to the event first. The trip stays fully visible to everyone — you can see the cave, the time, the leader — but the signup button is locked until you've RSVP'd to the event.
  • Then sign up for as many of the event's trips as you like. One RSVP unlocks all of them.

If you already signed up for a trip before it was attached to an event, you stay signed up — and you're added to the event's RSVP list automatically, so you show up as going and won't be asked to RSVP again.

The calendar groups them together

On the calendar, an event and its trips now read as one unit instead of scattered entries. The event shows how many trips it holds, and opening it lists them with their own signup buttons — or a single "RSVP to unlock" line if you haven't RSVP'd yet.

Cancelling your RSVP is honest about the trips

If you cancel your RSVP to an event, you're also stepping back from its trips. Before anything happens you'll see exactly which trip signups that will cancel and you confirm it — no silent surprises, and anyone on a waitlist behind you gets promoted as usual.

If an event is called off

When an event is cancelled, signup for its trips closes on its own — the trips themselves aren't deleted, so the page still tells the story. If the event comes back on, signups reopen.

Won't pretend I never signed up for three caves and forgot two of them. The list it shows you before cancelling an RSVP is a kindness.

Notable

Signup Grace for Membership Lapse

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.

What Changed

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.

  • Existing signups — you can still view the trip, see the meeting location, sign permits, manage gear, and cancel if needed.
  • New signups — still require an active membership. The gate only relaxes for people already on the roster.

Who This Affects

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.

Minor

Membership Gate Copy Fix

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.

  • Blurred media placeholder (trip reports, photos) — previously said "available to recognized members" and pointed to the trips page. Now says membership is required and links to /join.
  • Locked detail prompt — previously said "log in and keep an active membership" without naming the price. Now includes the $15/year price point.
  • Member tools access card — previously said "join to unlock member tools" without context. Now names the membership price.
Notable

Inline Confirmations for Mobile

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.

What Changed

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:

  • Trip signup — cancel signup, decline co-leader invite
  • Trip management — delete trip, approve/decline signups, confirm/bounce/decline permits
  • Gear rentals — return gear, cancel rental
  • Calendar events — delete event
  • Admin tools — permit verification queue actions

Why It Matters

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.

Notable

See Who's Going on a Trip

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.

Show who's going

  • A Show who's going button sits under the roster ring. Tap it and the participants fan out into a list; Hide roster folds it back up.
  • If you've asked your device to reduce motion, the list simply appears without the flourish.

Who can see the roster

Names are only shown to people who have a reason to see them:

  • The trip leader and any accepted co-leaders
  • Trip managers and above
  • Anyone signed up to that trip

Everyone else still sees just the headcount ring — participant names stay private.

What each row shows

  • The participant's name
  • Whether they signed up with a member account or as a guest
  • Their signup status — confirmed, pending permit, awaiting approval, or waitlisted

Behind the scenes

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.

Notable

Recognition becomes a social feature

Recognition is now a social vouching feature — leave a short note on another member's profile to recognize the caving experience you shared.

What changed

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).

How it works now

  • From another member's profile, click Vouch for {name} to leave a recognition. An optional 280-character note explains why.
  • Recognitions are visible on the recipient's profile, attributed to the author.
  • You can edit or remove a recognition you wrote from the recipient's profile.

Bat tiers

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.

BatsThreshold
1 bat1+
2 bats3+
3 bats8+
4 bats20+
5 bats50+

Crossing a tier triggers a notification to the recipient.

What was removed

  • Auto-grant pipeline that fired on every login (2 trips + 1 vouch, or 2 vouches)
  • Admin Grant/Revoke Recognition controls
  • The trust-level launch announcement modal
  • All "trust level" permission gates (these had already been replaced with membership gates in a prior change; this release deletes the now-dead code)
Notable

Anti-Scraping Protections

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.

What's blocked

On the trip, event, report, and calendar pages:

  • AI training crawlers — GPTBot, ClaudeBot, anthropic-ai, Google-Extended, PerplexityBot, CCBot, Bytespider, Applebot-Extended, Diffbot, FacebookBot, Amazonbot, and others get a 403.
  • Search-engine indexing — every response carries x-robots-tag: noindex, nofollow, noai, noimageai, asking search engines not to index, follow links from, or use the content for AI features.
  • robots.txt — politely asks the same bots to stay out of the same paths, which the well-behaved ones honor.

What's still open

  • Marketing pages — home, about, join, permits, and the recognition page stay indexable. These are where new members find us.
  • Real visitors and members — the block only triggers on user-agent. If you load /trips from a normal browser, nothing changes.
  • Conventional search engines (Google, Bing) — they can still index the public marketing pages so people searching for "Chattanooga grotto" or "Chattanooga caving club" can find us.

Honeypot for bots that ignore the rules

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.

Why this matters

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.

Notable

Permits Pending Banner and Leader Actions

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.

Pending permit banner

A banner above the main page nudges you about unsigned permits. It escalates with the trip date:

  • More than 14 days out — silent (just the Permits nav badge).
  • 14 days or closer — amber banner with a "sign now" call to action.
  • 48 hours or closer — red, non-dismissible banner.

Each row shows the trip name and a button to sign. The banner clears as soon as you sign each pending permit.

Permits navigation badge

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.

Sign right after you sign up

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.

Leader actions on the manage panel

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.

Permit link card for leaders

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.

Notable

My Agenda Page and Dedicated Trip Edit

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.

My Agenda

A new page at My Agenda (linked from Tools) shows everything you're involved in:

  • Trips you're signed up for — with your current signup state (confirmed, waitlisted, pending permit, etc).
  • Trips you're leading — both published and draft.
  • Event attendance — grotto events you've RSVP'd to.

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.

Status pills

Trips on the agenda now wear pills that tell you their state at a glance:

  • DRAFT — a private trip you're leading that you haven't published yet. Reminds you it's not visible on the public board.
  • CANCELLED — an event occurrence that's been called off. Shows dimmed so it doesn't disappear silently.

Dedicated trip edit page

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.

Major

Trip Form Redesign

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.

One form for every trip

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.

Section navigation

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.

New fields

  • Leader phone — an optional phone number, separate from the leader email. Useful for trips where last-minute coordination matters.
  • Show my email to signups — a leader-level toggle controlling whether confirmed signups see your email. Off by default — only on when you want it shared.

Permits on personal trips

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.

Behind the scenes

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.

Notable

PayPal Pending Payment Visibility

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.

What you see after paying

The page you land on after PayPal sends you back now reflects the actual state of your payment:

  • Membership active — when PayPal has already confirmed payment, your account is already a member, and you can keep going.
  • Pending eCheck — your bank takes 3–5 business days to clear an eCheck. The page tells you that and what to expect.
  • Declined or failed — if PayPal rejects the payment, you see why instead of a silent failure.
  • Still waiting on PayPal — for the brief window between PayPal redirecting you back and PayPal's confirmation reaching the server, you see a "still waiting" message instead of a misleading success.

For admins

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.

Behind the scenes

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).

Notable

Trip Leaders Count Toward Capacity

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.

How the count changed

Every trip's group cap now includes the people running the trip:

  • The primary leader counts as one of the seats. Always.
  • Each accepted co-leader counts as one more seat. Pending invites don't count until they're accepted.
  • Cancellations and waitlist movement still work the same way for participant signups — leaders simply hold their own seats alongside the rest of the roster.

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.

What you'll see

  • The roster ring on a trip's detail page now shows a "Leaders" row in the legend, in a new leather-bronze tone, distinct from the green "Confirmed" row. The center number includes leaders.
  • Trip cards on the trips list show a fraction that includes leaders. A trip with one leader and zero signups out of ten reads "1 / 10," not "0 / 10."
  • The "spots left" number in the action bar reflects the same math. If the trip is full once leaders are counted, registration shows as closed (or waitlist-open, if waitlist is enabled).
  • The activity feed shows the same leader-inclusive "spots left" everywhere a trip's availability appears.

Existing trips that are now full

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.

Co-leader changes free seats

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.

Behind the scenes

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.

Minor

Simpler Trip Creation Form

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:

  • Jurisdiction is automatic. You no longer pick a jurisdiction by hand — it's derived from the state you select. Same data, one less field.
  • Land manager field removed. Permit owner already covers landowner contact, so the redundant land manager field has been retired.

No action needed for existing trips. The form is just shorter.

Major

Trip Publication Workflow

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.

Submit a private trip for publication

Every private trip you create now has a publication state, shown right on the trip card and in My Trips:

  • Private Trip — only you and people you invite can see it.
  • Pending Review — you've asked for it to be promoted; a trip manager is reviewing.
  • Changes Requested — a reviewer left feedback for you to address.
  • Rejected — the trip won't be promoted.
  • Published Trip — it's live on the public trip board like any officially-led trip.

When you're ready, hit Submit for publication on a private trip. Reviewers see it in the admin queue alongside report submissions.

Reviewer actions

Trip managers, moderators, and admins can:

  • Approve and publish — the trip flips to a Published Trip and shows up on the public board.
  • Request changes — leaves a note for the creator; they can edit and resubmit.
  • Reject — closes the submission with a reason.

You'll see the review history on the trip's submission page.

Notifications when promoted trips change

Once a trip is published, edits and cancellations affect more people, so:

  • Edits to a published trip notify all trip managers.
  • Cancellations notify both the trip's signed-up participants and the manager group.

This makes it harder for a leader to silently change a trip out from under participants or other staff.

Reports tie to canonical trips

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."

Private trip leadership

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.

Behind the scenes

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.

Notable

Mobile Trip Detail Polish

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:

Compact mobile header

  • The trip header on mobile is shorter so more of the page is visible without scrolling.
  • The difficulty badge is now in the header itself, no longer hidden in the body.
  • The header stays sticky as you scroll without overlapping the action bar.

Action bar improvements

  • The sticky action bar matches the header row's width and doesn't push content under the site nav.
  • When your spot is pending a permit signature, the action bar links directly to the permit instead of a generic page.
  • Status row (signup state, spots remaining) is centered and readable at narrow widths.

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.

Major

Permit & Approval Workflow Rebuild

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.

New signup stages

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:

  • Pending leader approval — your application is waiting for the trip leader.
  • Permit signature required — the leader approved you; you need to sign the landowner permit.
  • Pending permit verification — you've signed; waiting for the leader to confirm.
  • Confirmed — you're set. Meeting location and map link are unlocked.

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.

"I signed the permit" action

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.

For trip leaders

When you create or edit a trip, the old "requires permit verification" checkbox is replaced with two cleaner controls:

  • Approval mode — auto-confirm members, or require explicit approval for everyone.
  • Permit owner — pick the landowner from a dropdown (or none, if the trip doesn't need one).

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.

For admins

Two new things:

  • The permit verification queue is split into Attested (members who marked the permit signed and need leader confirmation) and Stale signature (older entries that haven't moved). Easier to focus on what's blocking.
  • A new /admin/permit-owners page lets you add, retire, and restore permit owners that show up in the trip-creation dropdown.

Whole lot of stages for what used to be a handshake. Not saying it's wrong.

Behind the scenes

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.

Major

Member Profiles

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.

Member directory

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.

Profile pages

Click any member's name — in the directory, on a trip report, or in a signup list — to see their profile. Profiles show:

  • Name and avatar (auto-generated from your initials if you haven't set a photo)
  • Bio, if they've written one
  • Trip history and reports
  • Trust status and vouches

Add a bio

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.

Vouching with notes

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.

For non-members

Member profiles are only visible to other members. If you're not a member yet, you won't see the directory or profile pages.

Minor

Mobile Navigation Improvements

The mobile menu is easier to tap and no longer clips behind other elements.

A handful of fixes to the mobile hamburger menu:

  • Larger tap target so it's easier to hit on small screens
  • Menu items no longer clip behind the page content
  • Active page indicator is more visible
  • New overflow menu gives quick access to Members, Tools, My Trips, and Admin pages
Major

Release Notes & Notifications

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.

Major

Trusted Members

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.

What changes

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.

How to become trusted

You earn trusted status by participating and getting vouched for by people who know you. There are two ways:

  • 2 completed trips + 1 vouch — go on at least two trips and have a trusted member vouch for you.
  • 2 vouches from trusted members — if two people who are already trusted vouch for you, that's enough on its own.

Once you qualify, it happens automatically on your next login.

Trip leaders and staff (trip managers, moderators, admins) are always trusted automatically.

What trusted members see

  • Real cave names on trips where the leader chose to hide them
  • Full photos and videos in trip reports

What everyone else sees

  • A placeholder name like "Trip in [County], [State]" for hidden caves
  • Blurred photos and no video embeds in reports
  • General area labels instead of exact locations

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.

Notable

Leader Approval for Non-Member Signups

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.

How it works

  1. You sign up for a trip like normal.
  2. Your spot shows as "pending leader approval" — your seat is held while you wait.
  3. The trip leader gets notified and can approve or decline from the participants page.
  4. You get an email and notification either way.

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.

If you're a member

Nothing changes. Members get confirmed instantly, same as before.

For trip leaders

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.