BayNavigator.org β A searchable directory of free and low-cost programs across the San Francisco Bay Area.
Find benefits and discounts for:
- π³ Income-eligible (e.g., SNAP/EBT and Medi-Cal recipients)
- π΅ Seniors (65+)
- π§ Youth
- π College students
- ποΈ Veterans and active duty military
- π¨βπ©βπ§ Families and caregivers
- π§β𦽠People with disabilities
- π€ Nonprofit organizations
- π Everyone
This community-driven resource aims to:
- Improve awareness of local programs and benefits
- Support financial accessibility across the Bay Area
- Reduce stigma around using assistance programs
- Promote community engagement and local exploration
- π Smart Search - Full-text search over a prebuilt index, running entirely in your browser β no search server
- π·οΈ Category Filters - Browse by type (Food, Health, Transportation, Technology, etc.)
- π Location Filters - Find programs by county or area
- π₯ Eligibility Filters - See only programs you qualify for
- βΏ Accessibility settings - text size (50-200%), line height, letter and word spacing, a high-legibility font (Atkinson Hyperlegible) and a dyslexia-friendly font (OpenDyslexic), colour-blind mode. Set them in Settings; they apply across every page
- π£οΈ Simple Language - swaps government wording for plain words ("eligibility" becomes "who can apply"). Both wordings are rendered into the page at build time and the switch is a CSS swap, so it is instant, works offline, and needs no AI service
- π± Mobile-Optimized - Works great on phones, tablets, and computers
- π PWA with Offline Support - Install as an app from the utility bar; service worker caching for offline access
- π¨ Theme Support - Light, dark, and auto modes with manual override
- π€ Carl - On-device assistant in the apps (Apple Intelligence), and an MCP server so any AI chatbot can search programs, municipal codes and crisis resources
- π Privacy-First - No personal data, no cookies, and no analytics or performance-monitoring scripts of any kind
- π Transparent Referrals - External program links carry
utm_source=baynavigatorfor anonymous impact tracking; no compensation or referral fees - π§ Step Flow + Local Preferences - Set eligibility and county in a guided overlay; preferences are saved only in your browser (local storage). No accounts or email subscriptions
- β¨οΈ Keyboard shortcut - press / to jump to the search box, switchable off in Settings (WCAG 2.1.4). Not Ctrl/Cmd+K, which browsers already use for their own search, and deliberately not Ctrl/Cmd+F, which is find-in-page and an assistive feature in its own right
- Data validation:
npm run validate:data(schema + referential integrity checks) - Accessibility checks:
npm run test:a11y(axe-core + Playwright, desktop + mobile) - PWA caching: network-first for
/data/*.json, cache-first for immutable build assets
Bay Navigator provides static JSON API files for accessing program data:
Base URL: https://baynavigator.org/data/
Not
/api/. Azure Static Web Apps reserves that route for its Functions backend, so the build relocates the generated files to/data/. Requests to/api/*.jsonreturn a server error.
Endpoints:
/data/programs.json- All programs (800+ total)/data/programs/{id}.json- Individual program by ID/data/categories.json- All categories/data/areas.json- Geographic service areas/data/groups.json- Audience groups (seniors, veterans, families, β¦)/data/search-index.json- Compact index used for in-browser search/data/emergency.json- Crisis and emergency contacts/data/municipal-codes.json- Municipal code coverage index/data/metadata.json- API metadata
Full specification: openapi/baynavigator-api.yaml
Features:
- β‘ Fast (CDN-cached, ~10-50ms response time)
- π Global CDN via Azure Static Web Apps
- π° Free to use
- π Open source
- π Updated automatically via GitHub Actions
Example:
fetch('https://baynavigator.org/data/programs.json')
.then((res) => res.json())
.then((data) => console.log(`Found ${data.total} programs`));Carl is Bay Navigator's assistant. Rather than running a model ourselves, we publish him over the Model Context Protocol so any AI chatbot can answer Bay Area questions grounded in this data.
Hosted (ChatGPT, Claude web β add as a custom connector):
https://baynavigator.org/mcp
Local (Claude Desktop, Claude Code, Cursor, Zed, VS Code):
npx -y @baytides/carl-mcpNine read-only tools: search_resources, list_all_matching, get_resource,
find_local_code, list_filters, transit_directions, get_local_conditions,
get_bay_area_sports, get_emergency_help. Everything returns source links so the
assistant can cite rather than paraphrase, and a no-match answer routes to 2-1-1 rather
than inviting the model to invent a program.
Ranked results say how many matches exist beyond the page being shown, and point at
list_all_matching to fetch the rest β an assistant that sees 25 of 57 should not tell
someone the other 32 do not exist.
See carl-mcp/README.md for the design notes β including why it
reuses the Knowledge Pack retrieval contract verbatim instead of reimplementing search.
The apps answer offline from a local SQLite/FTS5 corpus built by
npm run generate:pack. It ships in two parts.
Core (corpus.sqlite, always bundled) β programs, California codes, museum
admission. These are the answers someone needs when they don't know which
jurisdiction they're standing in, so they are never an optional download.
Ordinances (ordinances/<slug>.sqlite, downloaded on request) β one pack per
city, town and county. Municipal law is the bulk of the corpus and almost all of it
is irrelevant to any given person, so the apps let people choose:
| Choice | What it fetches |
|---|---|
| My city | that one pack |
| My county | the county's own code plus every city pack in it |
| Entire Bay Area | all of them |
The per-jurisdiction file is the atomic unit for all three tiers, so "county" and "all" are lists rather than separately-built blobs β nothing is duplicated on the CDN, and someone who lives in one city and works in another can add a second pack without re-downloading either.
manifest.json carries the catalog the picker renders: per-pack sha256 and bytes,
plus county and whole-Bay-Area rollups with real totals. Each tier also reports
available vs total, because scraper coverage is partial and a tier labelled
"Alameda County" should say it currently holds 3 of 15 jurisdictions rather than
imply the whole county.
Retrieval attaches the downloaded packs to the core corpus and unions the search
(openPackSet / searchPackSet in JS, LocalRetrievalService in Swift). A city
filter skips packs that can't match, so downloading everything doesn't cost a
hundred subqueries to answer a question about one street.
carl-mcp is unaffected β it's a server with no download budget, so it builds one
combined corpus from the published JSON feeds.
- Contributing Guide - How to contribute
- API Documentation - Static JSON API endpoints (see also OpenAPI spec)
- Accessibility - WCAG 2.2 AAA compliance details
- All Documentation - Complete docs directory
Use these versions for local development and CI parity:
- Node.js: 22.x LTS
- npm: 10+
- Git: latest stable
- Flutter (optional, mobile app work): 3.x
- Dart (optional, mobile app work): 3.x
Contributor setup docs reference this section:
Built with:
- Astro - Static site generator
- Tailwind CSS - Utility-first CSS framework
- Azure Static Web Apps - Hosting and CDN
- Model Context Protocol - Carl as an MCP server (
carl-mcp/) - Apple Intelligence (FoundationModels) - on-device Carl in the iOS/macOS apps
- MiniSearch - directory and homepage search, over a prebuilt index in the browser (
src/lib/search-core.ts) - Fuse.js - fuzzy matching in the standalone search bar component
- Azure Functions - the MCP server plus ~11 small endpoints in
azure-functions/ - Retired September 2026: vLLM/Ollama with Qwen2.5-3B and Typesense, both self-hosted
- Flutter + SwiftUI - Mobile/desktop apps
- Cloudflare - CDN, DDoS protection, and a Worker that serves
/mcp - YAML - Structured data storage for programs
- Static JSON API - Generated from YAML via Node.js script
Key Directories:
src/data/- Program data organized by category (YAML files)src/components/- Astro components (SmartAssistant, SearchBar, etc.)scripts/- Build, sync, and scraping scripts (100+)carl-mcp/- The Carl MCP server (also published as@baytides/carl-mcp)azure-functions/- Serverless backend (geocoding, push, forms, transit alerts, link checking)apps/- Flutter mobile/desktop + Swift native iOS appslocal/- launchd service configs for data syncs that ran on a self-hosted Mac Mini. Dormant since September 2026 β that machine was retired, so these syncs (missing persons, NPS parks) are not currently running and their data will go stale until they are rehomed.workers/ai-proxy/- Dormant. A Cloudflare Worker that proxiedai.baytides.organdollama.baytides.org, both retired in September 2026. The Worker is still deployed but its origins no longer resolve. Not to be confused withinfrastructure/cloudflare/mcp-proxy/, which is live and serves/mcp.infrastructure/- Bicep templates (tor-onion/) and the Cloudflare Worker that routes/mcp(cloudflare/)
bay-navigator/
βββ src/
β βββ data/ # Program data (YAML) β source of truth
β βββ components/ # Astro components (SmartAssistant, SearchBar, etc.)
β βββ pages/ # Route pages
β βββ layouts/ # Page layouts
β βββ i18n/ # Internationalization (10 languages)
β βββ styles/ # CSS stylesheets
βββ public/api/ # Generated JSON API (auto-generated at build)
βββ apps/ # Flutter mobile/desktop + Swift native iOS
βββ azure-functions/ # Serverless backend (geocode, push, congress)
βββ scripts/ # Build, sync, and scraping scripts (100+)
βββ carl-mcp/ # Carl as an MCP server (stdio + HTTP)
βββ local/ # launchd configs for data syncs (dormant, see below)
βββ workers/ # Cloudflare Worker for the retired AI proxy (dormant)
βββ infrastructure/ # Bicep templates (Tor) + the Cloudflare Worker serving /mcp
βββ tests/ # Playwright E2E + unit tests
βββ docs/ # Documentation
βββ README.md
This resource focuses on Bay Area programs. National or statewide programs are included when they:
- Have specific Bay Area locations or chapters
- Provide significant value to Bay Area residents
- Are widely used and impactful (e.g., Museums for All)
Geographic priority:
- Bay Area-specific programs (preferred)
- California statewide programs available to Bay Area residents
- National programs with Bay Area presence or significant local impact
We welcome contributions! There are two ways to help:
Note: By submitting a listingβwhether via pull request, issue, email, or APIβauthorized representatives acknowledge and agree to our Terms of Service, Partnership Requirements, and Non-Discrimination Policy.
Found a resource that should be listed? π Open an issue with:
- Program/service name
- Who it helps (eligibility)
- What benefit it provides
- Official website link
- Location/area served
- Any deadlines or special requirements
Want to add programs directly or improve the site?
π See CONTRIBUTING.md for detailed technical instructions
Access all program data via our static JSON API:
# Get all programs
curl https://baynavigator.org/data/programs.json
# Get categories
curl https://baynavigator.org/data/categories.json
# Get a specific program
curl https://baynavigator.org/data/programs/alameda-food-bank.jsonSee API_ENDPOINTS.md for complete API documentation.
# Clone the repository
git clone https://github.com/baytides/baynavigator.git
cd baynavigator
# Install dependencies
npm install
# Run local server
npm run dev
# View at http://localhost:4321# After modifying YAML files in src/data/
npm run generate-api
# API files are generated in /public/api/ (deployed as /data/)Programs are stored in YAML files under src/data/. Each program follows this format:
- id: unique-program-id
name: Program Name
category: Category Name
area: Geographic Area # County, "Bay Area", "Statewide", or "Nationwide"
city: City Name # Optional: specific city
groups:
- income-eligible # Eligibility groups
- seniors
- everyone
description: Brief description of the program
what_they_offer: | # Detailed benefits (optional)
- Benefit 1
- Benefit 2
how_to_get_it: Steps to access the program (optional)
timeframe: Ongoing
link: https://official-website.com
link_text: Apply- Childcare
- Community Services
- Education
- Equipment
- Finance
- Food
- Health
- Legal Services
- Library Resources
- Museums
- Parks & Open Space
- Pet Resources
- Recreation
- Tax Preparation
- Technology
- Transportation
- Utilities
income-eligible- π³ SNAP/EBT/Medi-Cal recipientsseniors- π΅ Seniors (60+)youth- π§ Youthcollege-students- π College studentsveterans- ποΈ Veterans/Active dutyfamilies- π¨βπ©βπ§ Familiesdisability- π§β𦽠People with disabilitieslgbtq- π LGBT+ communityfirst-responders- π First respondersteachers- π©βπ« Teachers/Educatorsunemployed- πΌ Job seekersimmigrants- π Immigrants/Refugeesunhoused- π Unhousedcaregivers- π€² Caregiversfoster-youth- π‘ Foster youthnonprofits- π€ Nonprofit organizationseveryone- π Everyone
This is a community-maintained project. Programs are verified periodically, but:
β οΈ Always check the official website for the most current information- π Availability and eligibility requirements can change
- π If you find outdated info, please open an issue
- No personal data, no cookies: The site does not collect or store personal information and sets zero cookies.
- No analytics at all: We load no analytics script, tag manager, session recorder, or error-reporting agent. The self-hosted Plausible instance this README used to describe was retired along with the rest of the self-hosted stack; nothing replaced it. The trade is that we cannot tell you which pages are popular.
- AI-powered features: We run no AI server. In the apps, Carl runs on your device via Apple Intelligence, so questions never leave it. Elsewhere, Carl is an MCP server your own AI assistant calls β that assistant's provider handles your conversation under their policy, and we receive only the search terms. Simple Language uses an authored word list and is rendered into the page at build time, so it involves no model and no request. The self-hosted inference server was retired in September 2026.
- Mobile app crash reporting: Optional Sentry crash reporting in mobile apps (can be disabled). See our Privacy Policy for details.
- Standardized UTMs for impact: External program links include
utm_source=baynavigator&utm_medium=referral&utm_campaign=directoryso program partners can see anonymous referral volume; no per-user tracking. - No compensation or paid placement: We do not receive fees, commissions, or referral payments for any listings or links.
- Security: Cloudflare (Project Galileo) provides TLS, CDN, and DDoS protection; hosting and API run on Azure Static Web Apps. Tor hidden service available for censorship-resistant access.
This project is maintained by volunteers who believe in making community resources more accessible. Special thanks to:
- All contributors who submit programs and updates
- Organizations providing these valuable services
- The open-source community for the tools that make this possible
Thanks to these wonderful people who have contributed to Bay Navigator:
To add a contributor, comment on an issue or PR with:
@all-contributors please add @username for code, content, doc, etc.
See the Emoji Key for contribution types.
This project uses a dual-license model to ensure proper attribution while maximizing reuse:
All code, including HTML, CSS, JavaScript, Astro components, and configuration files, is licensed under the MIT License.
You are free to:
- Use the code commercially
- Modify and distribute
- Use privately
Requirements:
- Include the MIT license and copyright notice
- Provide attribution to Bay Navigator
See LICENSE for full details.
All program data in src/data/ is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).
You are free to:
- Share and redistribute the data
- Adapt and build upon the data
Requirements:
- Give appropriate credit to Bay Navigator
- Provide a link to the license
- Indicate if changes were made
Suggested attribution:
Program data from Bay Navigator (https://baynavigator.org)
licensed under CC BY 4.0
See LICENSE-DATA for full details.
This approach ensures:
- Credit where credit is due - Both licenses require attribution
- Maximum community benefit - Other cities can create similar resources
- Commercial use allowed - Apps, tools, and services can be built using our work
- Open source forever - All improvements benefit the community
- π Found a bug? Open an issue
- π‘ Have a suggestion? Start a discussion
- π¬ Other inquiries: Create an issue and we'll respond
Last Updated: February 11, 2026 Hosted on: Azure Static Web Apps