BC’s nonprofit sector is running on heart but short on hands. Thousands of organizations need skilled volunteers, yet the systems connecting willing people to the right opportunities are fragmented and underpowered. Our solution, RootSAP, bridges that gap by enabling nonprofits to co-create and co-host volunteer training workshops. Through a shared platform that matches organizations by location, cause, and skill needs, nonprofits can design collaborative learning experiences that train volunteers once and benefit many. Volunteers get exposure to multiple causes, a richer sense of community, and credentials that support long-term engagement. Instead of competing for capacity, nonprofits build it together; creating sustainable, cross-sector human infrastructure for BC’s social good network.
RootSAP is a platform where non-profit organizations can simply enter their information, choose their availability, and then get matched with a similar non-profit organization and have a custom-made event itinerary created for them to co-host training sessions for volunteers. Volunteers will be able to attend and gain real-life skillsets for future opportunities, and a chance to meet up and connect with organizers.
Frontend: React, Vite, Tailwind CSS, Framer Motion, JavaScript
Backend: Python, Node.js, Express, SQLite, OpenAI API, TypeScript
We initially had some issues deciding on the form of the data being stored, as well as integrating frontend with the backend in order to process and display data. But we were able to successfully ping the appropriate endpoints to make this work.
We are proud of building a working backend script that correctly handles data as intended as well as designing the UI and fixing bugs during the process.
We learned out to use Framer Motion for UI design, how to use Python with Node.js as a backend setup, as well as how to integrate frontend with backend code.
In the future, we look forward to expanding our app to include multi-language support as well as voice-over support in order to increase accessibility.
- Node.js and npm
- Python 3
- An
OPENAI_API_KEYfor AI-generated workshop content
Frontend:
cd frontend
npm installBackend:
cd backend
npm install
python3 -m pip install openai python-dotenvCreate a backend/.env file with:
OPENAI_API_KEY=your_openai_api_key
PORT=4000cd backend
npm run devThe backend runs on http://localhost:4000.
cd frontend
npm run devThe frontend runs on http://localhost:8080 and proxies API requests to the backend.
Visit http://localhost:8080 in your browser.
The backend still uses the existing JSON files as the primary store.
An optional SQLite addon can mirror workshop registrations and RSVPs in parallel, so it does not change the current API behavior.
Set these environment variables for the backend process:
SQLITE_ENABLED=trueSQLITE_DB_PATH=../db/workshops-addon.sqlite(optional override)
If SQLITE_ENABLED is not set, the addon is disabled by default.
workshop_prompt_runs: canonicalinput_jsonandoutput_jsonmatching Pythoninput.jsonandoutput.jsonrsvps: mirrored from/api/workshops/:id/rsvp
workshop_prompt_runs also keeps helper columns (organization/contact/topic/title) for easier filtering,
but the JSON documents remain the source of truth.
If SQLite write/mirror fails, requests still succeed using the JSON flow.
