Your meetings. Your schedule. Your journey.
A free, open-source tool to organize recovery meetings, track your sobriety, and find local groups nearby. Fully customizable themes, AI-powered search, and cross-device sync when you create an account.
Built with care · No data collected · Open Source
Sign in to sync your calendar, settings, and sobriety tracker across all your devices.
We'll email you a link to set a new password
Permanently removes your account and all data
Enter your new password below.
Recovery Calendar is a Progressive Web App (PWA) that helps users track recovery meetings, find nearby meetings, and manage their recovery schedule. It works like a native app — installable on phones, works offline, and syncs across devices.
The entire front-end lives in a single index.html file. The back-end consists of Netlify serverless functions and a separate Meeting Aggregator API that crawls and indexes meetings from national databases.
Hosts both the Recovery Calendar PWA and the Meeting Aggregator. Auto-deploys from GitHub on every push to the main branch. Also runs serverless functions for search, chat, and schedule parsing.
Two repositories store all source code. Push changes with git add -A && git commit -m "message" && git push — Netlify auto-deploys.
Handles user authentication (Google sign-in and email/password) and stores each user's meeting data in Firebase Realtime Database. Data syncs in real-time across devices. The app also works offline via localStorage with sync-on-reconnect.
Project: recovery-calendar-14708
Sends email notifications like welcome emails and weekly schedule reminders directly from the browser — no backend email server needed. Uses pre-built HTML email templates.
A separate Next.js app that crawls meeting data from national sources, parses it, and serves it via a search API. The PWA calls this when users search by ZIP code in "Find Meetings."
Tech stack: Next.js, TypeScript, Prisma ORM, PostgreSQL
Live URL: meeting-aggregator.netlify.app
Search endpoint: /api/search (POST with zipCode, radius, program)
Serverless Postgres database that stores all crawled meeting data (56,000+ meetings across the US), ZIP code lookup tables, crawl job history, and source configurations. Free tier.
The Basic Meeting List Toolbox is the standard API for NA meetings worldwide. The aggregator queries the "Tomato" server (a global aggregator) once per US state to get complete national coverage. Returns structured JSON with meeting names, times, locations, and coordinates.
Parser: bmlt_json (51 state queries)
AA has no single national feed. Each intergroup runs a WordPress site with the "12 Step Meeting List" (TSML) plugin, which exposes a JSON API. The aggregator pulls from 95 intergroup feeds covering approximately 40 US states, providing near-national AA coverage.
Parser: meeting_guide
To add more AA coverage: Find an intergroup website, check if /wp-admin/admin-ajax.php?action=meetings returns JSON, and add it to prisma/seed.ts.
Enables offline functionality and caching. The service worker caches the app shell so the PWA works even without internet. Located at sw.js in the project root.
Defines how the app appears when installed on a phone: name, icons, theme color, and display mode. Located at manifest.json in the project root.
Three serverless functions run on Netlify, defined in netlify/functions/:
cd ~/Claude\ Projects/Recovery\ Calendargit add -A && git commit -m "description" && git pushcd ~/Claude\ Projects/Recovery\ Calendar/meeting-aggregatorgit add -A && git commit -m "description" && git pushTo manually trigger a refresh (the .env file already contains the Neon DATABASE_URL):
cd ~/Claude\ Projects/Recovery\ Calendar/meeting-aggregatornpm run devcurl -X POST http://localhost:3000/api/admin/crawl -H "Content-Type: application/json" -d '{"deduplicate":false}'To add a new AA intergroup to the aggregator:
[site]/wp-admin/admin-ajax.php?action=meetingsprisma/seed.tsnpm run db:seed then npm run crawl (with DATABASE_URL for cloud)
The main search endpoint. Accepts JSON body with these parameters:
Response includes: meetingName, program, dayOfWeek, startTime, endTime, format, access, attendanceMode, locationName, street, city, state, zip, lat, lng, virtualUrl, virtualMeetingId, virtualPassword, confidenceScore, distanceKm, distanceMiles
Virtual/Hybrid meetings without coordinates are included in radius searches without distance filtering, so they always appear in results regardless of location.
IMPORTANT: The local .env and Netlify must use the SAME Neon DATABASE_URL. If they differ, local crawls won't appear on the deployed site.
Total additional cost beyond existing Netlify plan: $0/month
Choose how you'd like to reset your calendar:
Searching for meetings near you...
This may take a few seconds
Set the date and time your recovery journey began.