Inspiration
Every volunteer-run sports team runs on the same fragile system: one exhausted team parent holding the whole season in their head. Who's bringing snacks Saturday. Who's driving carpool. Whether the game actually got moved because of rain. When that person misses a week, the whole team feels it.
We went looking for a Slack agent idea the way most hackathon teams do — starting broad, in productivity and ops tooling. Almost every direction we explored (meeting recaps, commitment tracking, grant management for nonprofits, incident response, OSS community support bots) turned out to already be a saturated, venture-funded market. That pattern itself became the insight: Slack's AI ecosystem has been extremely well built out for teams that can pay for software. It has not been built for the millions of volunteer-run groups — youth sports leagues, PTAs, tenant unions, mutual aid groups — that generate zero revenue potential and therefore no commercial interest. Sideline is built for that audience specifically.
What it does
Sideline is a Slack agent that runs the weekly logistics a volunteer team usually loses to chat scroll:
Weekly sign-ups as tappable buttons — /sideline-setup snacks, carpool, ref configures the roles, /sideline-prompt posts them, and claiming a role is one tap, live-updating for the whole channel. Reminders that only nag what's actually missing — instead of pinging the whole channel every time, Sideline nudges about open roles only, so people who already signed up aren't bothered again. Decision memory — /sideline-ask did we move Saturday's game? (or just @-mentioning the bot) searches the channel's own history and answers directly, instead of someone scrolling through 200 messages. Calendar sync — /sideline-reschedule pushes confirmed schedule changes to a shared Google Calendar. New-member onboarding — anyone who joins the channel gets an automatic DM summarizing the current round and what's still needed. /sideline-status — a quick read of who's covered what, without hunting for the original post.
How we built it
Sideline is a Node.js app on the Slack Bolt SDK, running in Socket Mode so it needs no public server for the hackathon build. Weekly sign-ups and claims are rendered with Slack's Block Kit interactive components. The "decision memory" feature searches live channel history and ranks results with a real Porter2/Snowball stemmer, structured as a single swappable function so it can be replaced with the Real-Time Search API directly once that's available on bot tokens. Calendar sync goes through a Google service account today, with the integration point documented for a drop-in MCP server swap. State (rotation config, current claims, calendar event mappings) is stored in a small JSON file behind an async lock, intentionally scoped for a single small team rather than built out as a database from day one.
Challenges we ran into
The idea itself was the first real challenge. Nearly every generic "Slack + AI" pain point we considered meeting recaps, commitment tracking, support triage, grant management turned out to already have a well-funded incumbent, once we actually searched instead of assuming. That forced a real pivot: stop competing with venture-funded startups on commercially valuable problems and build for an audience they structurally won't chase.
On the technical side, an aggressive self-review turned up several bugs worth naming honestly rather than glossing over:
A race condition in the state store: two people tapping different role buttons within milliseconds of each other could both read the same starting state, and the second write would silently overwrite the first reproduced directly with concurrent claims, and in one run the interleaved writes actually corrupted the JSON file itself, crashing every read after it. Fixed with an in-process async lock and confirmed under a stress test of eight concurrent claims, including a genuine duplicate-role race. A crash-on-fresh-install bug in the cron scheduler: a broken file-existence check meant the very first scheduled run on a brand-new install (before anyone had configured a channel) would throw and could take the bot down. A word-matching bug in the decision-memory search: an early hand-rolled stemmer stripped "-ed" from "moved" to get "mov" but left the query word "move" alone, so they silently never matched — this was supposed to be the headline example and it didn't actually work. Fixed by swapping in a real stemming library instead of continuing to patch our own suffix-stripping logic. Silent data loss: re-running the weekly prompt command used to wipe every existing claim with no warning. Now it detects existing claims and requires explicit confirmation before overwriting.
Every one of these was caught by writing a test that tried to break the specific thing, not by assuming the code worked because it looked reasonable.
Accomplishments that we're proud of
Treating "does this idea already exist" as a real, checkable question instead of an assumption and being willing to throw out several plausible-sounding ideas once the market research said otherwise. And catching the JSON-corruption bug before it ever hit a real user, by deliberately trying to break the code with concurrent requests instead of only testing the happy path.
What we learned
The biggest risk in a hackathon isn't execution speed, it's building something polished that already exists. Searching aggressively, early, and honestly including for the "obviously fine" ideas saved far more time than it cost. On the engineering side: code that passes a single happy-path test can still hide a bug that only shows up under concurrency, and it's worth the extra ten minutes to write the test that tries to break it.
What's next for Sideline
Swap the fallback channel-history search for the Real-Time Search API directly once it's available to bot tokens. Route calendar sync through an MCP server instead of a direct service account integration. Move state from a single JSON file to a real database if Sideline is ever deployed across more than one small team at a time. A lightweight season-view dashboard for teams that want to see the whole rotation at a glance, not just this week's round.
Built With
- google-calender-api
- javascript
- node.js
- npm
- slack-api
- slack-block-kit
- slack-bolt
Log in or sign up for Devpost to join the conversation.