Skip to content

Latest commit

Β 

History

1,624 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Bay Navigator

License: MIT Data License: CC BY 4.0

Level AAA conformance, W3C WAI Web Content Accessibility Guidelines 2.2

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

🎯 Project Goals

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

✨ Features

  • πŸ” 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=baynavigator for 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

βœ… Quality & Compliance

  • 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

πŸ”Œ Static JSON API

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/*.json return 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, as an MCP server

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-mcp

Nine 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.


πŸ“¦ On-device Knowledge Pack

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.


πŸ“š Documentation


Runtime Matrix

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:


Tech Stack

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 apps
  • local/ - 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 proxied ai.baytides.org and ollama.baytides.org, both retired in September 2026. The Worker is still deployed but its origins no longer resolve. Not to be confused with infrastructure/cloudflare/mcp-proxy/, which is live and serves /mcp.
  • infrastructure/ - Bicep templates (tor-onion/) and the Cloudflare Worker that routes /mcp (cloudflare/)

πŸ“‚ Repository Structure

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

🎯 Scope & Focus

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:

  1. Bay Area-specific programs (preferred)
  2. California statewide programs available to Bay Area residents
  3. National programs with Bay Area presence or significant local impact

🀝 How to Contribute

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.

For Everyone: Submit a Program

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

For Technical Contributors

Want to add programs directly or improve the site?
πŸ‘‰ See CONTRIBUTING.md for detailed technical instructions


πŸš€ Quick Start

Using the Static JSON API (Easiest)

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.json

See API_ENDPOINTS.md for complete API documentation.

Local Development

# 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

Regenerating the API

# After modifying YAML files in src/data/
npm run generate-api

# API files are generated in /public/api/ (deployed as /data/)

πŸ“Š Data Structure

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

Available Categories:

  • Childcare
  • Community Services
  • Education
  • Equipment
  • Finance
  • Food
  • Health
  • Legal Services
  • Library Resources
  • Museums
  • Parks & Open Space
  • Pet Resources
  • Recreation
  • Tax Preparation
  • Technology
  • Transportation
  • Utilities

Eligibility Groups:

  • income-eligible - πŸ’³ SNAP/EBT/Medi-Cal recipients
  • seniors - πŸ‘΅ Seniors (60+)
  • youth - πŸ§’ Youth
  • college-students - πŸŽ“ College students
  • veterans - πŸŽ–οΈ Veterans/Active duty
  • families - πŸ‘¨β€πŸ‘©β€πŸ‘§ Families
  • disability - πŸ§‘β€πŸ¦½ People with disabilities
  • lgbtq - 🌈 LGBT+ community
  • first-responders - πŸš’ First responders
  • teachers - πŸ‘©β€πŸ« Teachers/Educators
  • unemployed - πŸ’Ό Job seekers
  • immigrants - 🌍 Immigrants/Refugees
  • unhoused - 🏠 Unhoused
  • caregivers - 🀲 Caregivers
  • foster-youth - 🏑 Foster youth
  • nonprofits - 🀝 Nonprofit organizations
  • everyone - 🌎 Everyone

πŸ”„ Maintenance & Updates

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

πŸ”’ Privacy & Transparency

  • 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=directory so 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.

πŸ™ Acknowledgments

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

Contributors

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.


πŸ“ License

This project uses a dual-license model to ensure proper attribution while maximizing reuse:

Code License: MIT

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.

Data License: CC BY 4.0

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.


Why Dual License?

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

πŸ“§ Contact


Last Updated: February 11, 2026 Hosted on: Azure Static Web Apps

About

Free programs, services, and resources directory for the San Francisco Bay Area

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages