Why I built Volunteer Clinton County and gave it away
A first-person account of co-founding and developing Volunteer Clinton County, the free countywide civic platform. It covers the problems I saw from a board seat: recruitment nobody is paid to do, service hours that need real verification, and sensitive Pennsylvania clearance documents.

I co-founded Volunteer Clinton County with Rayne Burgin and built the platform because volunteer needs here were scattered. A flyer at the library, a post in some Facebook group, a table at an event, a friend who happens to mention it. I gave it away because the groups that most need help recruiting have nobody on payroll to do it.
The full story of my involvement is on my Volunteer Clinton County page. The technical build is on my software portfolio.
Key points
- Free to search, free for approved organizations, no paid placement, no premium tier
- Covers every borough and township in Clinton County, including Lock Haven, Mill Hall, Renovo, Avis, Flemington, Beech Creek, Lamar, and Loganton
- Five listing types: volunteer opportunities, community events, donation needs, collection drives, and open board or committee seats
- No account is required to browse listings or contact an organization
- Nonprofits, schools, libraries, churches, emergency-service groups, and civic programs register free and are reviewed before they can publish
- I developed it, and I still maintain it
What a board seat showed me
A board seat showed me that nobody is hired to recruit volunteers. I am treasurer at Beyond the Bell for Clinton County and president-elect at the Rotary Club of Downtown Lock Haven. In both rooms, recruitment lands near the end of the agenda and goes to whoever has room that month. The person who writes the post is also the person running the event, closing the books, or hauling the donations.
Small organizations do not have a recruitment function. They have people who already have a job and add recruitment to the pile when they can. Any tool that assumes a volunteer coordinator exists is built for somebody else.
The jobs that have no owner
Three jobs kept coming up when I asked local groups what they needed. None belongs to any one person, and none is glamorous.
| The job | What I saw before | What the platform does |
|---|---|---|
| Getting the word out | One post from whoever remembered, on whichever account they had access to | Listings you can filter by town, cause, schedule, age fit, and accessibility, plus a printable flyer with a QR code |
| Verifying service hours | A sign-in sheet, a text message, a spreadsheet one person kept | Volunteers log hours and organizations verify them through a locked routine that records every change |
| Handling clearances | Clearance PDFs sitting in somebody's email | Files kept in private storage, shared only through a link that expires |
Why volunteer hours needed their own system
Hours needed their own system because other people have to trust the number. A student needs a record a scholarship committee will accept. A court-ordered placement needs oversight somebody can document. A grant report needs a number a board member will stand behind in public.
So the hour log is locked and every change recorded, not a field anyone can quietly edit. Volunteers can export a record of their own service and keep a private calendar feed of what they signed up for.
Court-ordered and parole placements get a separate path. The supervising agency gets a single-use code that opens a window rather than an account. When the window closes, the system freezes a copy of exactly what was shown. The codes are stored as hashes, scrambled text nobody can reverse, so having the database does not get you a code.
That piece took longer to build than the entire opportunity search, and almost nobody will ever see it.
How I handled clearance documents
Pennsylvania clearance documents are the background check paperwork volunteer roles ask for, and they are sensitive. A volunteer who uploads one is handing over something with real consequences if it leaks, and I did not want to be casual about that.
Nothing a volunteer uploads ever gets a public address. An organization can only ask for a document if the volunteer is in its roster, has agreed to share, and is already in a conversation with that organization. The organization gets back a link that expires, not a file it keeps. Volunteers set the roster privacy field by field, so what an organization can see about them is their call and not mine.
I would rather hear from an organization that access feels inconvenient than explain to a volunteer how their clearance ended up somewhere public.
Why moderation lives in the database
Moderation lives in the database because I will not always be the person maintaining this. Rules that live in application code get forgotten by the next developer who touches the file. Rules that live in the database refuse.
All five listing types share one submission status machine with eight states. A single SECURITY DEFINER function, a protected database routine, is the only legal way to move a listing between those states. It validates the transition, stamps the timestamps, and writes an audit record that cannot be edited afterward.
A trigger, a rule the database runs automatically on every change, blocks any attempt to set a status directly. Neither the app nor the API can route around moderation.
The same instinct runs through the rest of it. Every organization's records sit in a dedicated Postgres schema, a walled-off section of the database, with row-level security that keeps other organizations out. Membership runs through four levels from owner down to viewer, and organizations move through a lifecycle from pending to approved to archived. A directory that any stranger can post to stops being a local directory very quickly.
What "gave it away" actually means
It means free to use, not handed over. I built it at no cost to the people who use it. I do not sell placement, and no tier unlocks anything. I still pay to run it, and I still fix it at night.
Free has costs that show up later. A directory full of dead listings is worse than no directory, so listings expire on their own. Organizations get a one-tap email link to refresh a listing without logging in.
Somebody with an idea and no organization behind them can submit through a form that needs no account. Staff with a flyer and no patience for forms can paste the text or upload the image, and a tightly limited AI step drafts the listing for them to correct.
The part I have not solved is habit. A countywide directory only works if organizations remember it exists at the moment they need people, and that is not a feature I can ship. It takes a phone call, an item on a board agenda, a conversation in a parking lot after a bed build. I spend more time on that than on the code now, which is not what I expected when I started.
Would I build it again
Yes, though I would build less of it. There are features in there because I could write them, not because anyone asked. The pieces that earn their keep are plain: a search that filters by town, a listing that does not go stale, an email that confirms you are signed up, a flyer somebody can print and tape to a door.
What I want from it is small. That someone in Renovo finds a Saturday they can give. That a board which has been asking the same five people for years hears from somebody new.
No dashboard tells me when that happens, and I am fine with that. I would rather hear it at a meeting, from a person who has no idea I built the thing.
Want to get in touch?