InReach
InReach is the world’s first open source verified LGBTQ+ resource platform.
Install / Use
/learn @weareinreach/InReachREADME
- About
- Getting Started
- Project Structure
- Usage
- Integrations
- Roadmap
- Support
- Project assistance
- Contributing
- Authors & contributors
- Security
- License
- Acknowledgements
About
InReach is the world’s first tech platform matching LGBTQ+ people facing persecution and discrimination with safe, verified resources.
The InReach App is available on web (desktop and mobile), and native iOS and Android. Over 9,000 services across the U.S. are currently listed, with new verified services added every day by trained volunteers. InReach’s open-source technology instantly matches LGBTQ+ people in need with independently verified safe housing, medical and mental health care, immigration and other legal help, meal assistance, education and employment, translation, community and spiritual support, and more critical services. InReach is a comprehensive, digital one-stop-shop for all intersectional community needs, with listed verified services for LGBTQ+ asylum seekers, refugees and other immigrants, BIPOC communities, transgender folks, youth and caregivers, and more. The InReach App is free for everyone – including lawyers, case managers, social workers, and other service providers and community organizations searching for affirming resource referrals for LGBTQ+ clients.
<!-- <details> <summary>Screenshots</summary> <br> > **[?]** > Please provide your screenshots here. | Home Page | Login Page | | :-------------------------------------------------------------------: | :--------------------------------------------------------------------: | | <img src=".github/images/screenshot.png" title="Home Page" width="100%"> | <img src=".github/images/screenshot.png" title="Login Page" width="100%"> | </details> -->Built With
Getting Started
Prerequisites
pnpm
This project uses pnpm to manage packages. To install, run the command:
npm -g install pnpm
or follow the instructions on pnpm's installation page.
Docker
Docker (& docker compose) are used for local databases. Instructions to install Docker can be found here
Installation
To install the required packages & dependencies:
pnpm install
Project Structure
InReach/
├── @types/ # Shared TypeScript types/overrides
├── apps/
│ ├── app/ # InReach Application
│ └── web/ # InReach Main Site
├── docker/ # Docker compose file for local DB instance
├── lambdas/
│ ├── cognito-messaging/ # AWS Lambda to generate Cognito emails
│ └── cognito-user-migrate/ # AWS Lambda for user migration
├── packages/
│ ├── analytics/ # Analytic event handling
│ ├── api/ # tRPC API route definitions
│ ├── auth/ # NextAuth settings
│ ├── config/ # Other shared configs
│ ├── crowdin/ # Crowdin API/OTA
│ ├── db/ # Prisma DB schema & other db scripts
│ ├── env/ # Environment variable validation
│ ├── eslint-config/ # Custom ESlint configuration
│ ├── ui/ # React components shared between apps
│ └── util/ # Misc utility scripts/modules
└── patches/ # Patched npm packages
Usage
To start the development live servers:
pnpm dev:app # Starts Next.js for the InReach WebApp
pnpm dev:web # Starts Next.js for inreach.org (future project)
pnpm dev:ui # Starts Storybook for UI component development
Next.js based projects will be available at http://localhost:3000
Storybook will be available at http://localhost:6006
Integrations
Crowdin
InReach integrates with Crowdin to manage multilingual translations for both common UI content and dynamic org-data.
- Common translations (
common,landingPage,services) are static JSON files. Updates are made via PR merges after Crowdin export. - Org-data translations (
orgn_*namespaces) are dynamic and always live. They are fetched via the OTA (Over-The-Air) system, ensuring the latest translations are immediately available in the app.
OTA Flow:
- Crowdin exports translations for both common and database-backed namespaces.
- OTA generates a manifest file (
manifest.json) that tracks the latest version of each namespace. - The app calls the Edge API endpoint
/api/i18n/loadwith the requested language (lng) and namespaces (ns). - The loader fetches translations from:
- Redis cache (fastest)
- File-based JSON for common namespaces
- DB-backed keys for org-data namespaces
- Updated translations are stored in Redis for subsequent requests.
- Org-data translations appear live in the app immediately, without requiring a PR merge.
- Org-data translations (orgn_*) are live via OTA.
- Common translations require a PR merge to update dev/main.
Crowdin Integration - Code Overview
The Crowdin integration in InReach involves a set of packages and files that handle fetching translations from Crowdin, caching them, and serving them to the app. Below is a structured list of the key code files controlling this integration.
1. Crowdin Client Package (@weareinreach/crowdin)
| File | Purpose |
|------|---------|
| ota/index.ts | Fetches OTA manifests from Crowdin and downloads translation files or keys. |
| ota/edge.ts | Provides edge-compatible functions for OTA, suitable for Next.js Edge runtime. |
| cache/index.ts | Handles Redis caching of translations to reduce repeated network calls. |
| api/index.ts | REST API wrapper for Crowdin interactions (if needed). |
2. App Layer (@weareinreach/app)
| File | Purpose |
|------|---------|
| src/pages/api/i18n/load.ts | Next.js API Edge route that serves translation data to the app. It reads from Redis cache and falls back to OTA for missing keys. |
3. DB / Static Migration Layer (@weareinreach/db)
| File | Purpose |
|------|---------|
| prisma/data-migrations/* | Static migration jobs that run once to update translation keys or other data in the database. |
| prisma/dataMigrationRunner.ts | Runner that executes all pending migration jobs against the Prisma database. |
Summary of Flow
- Crowdin produces translation files and an OTA manifest.
- Crowdin Client (
ota) downloads translations and keys, using Redis cache to minimize network calls. - App (
i18n/load.ts) fetches translations for requested languages and namespaces, reading from cache or OTA as needed. - Database (
data-migrations) is updated only for static migration jobs viadataMigrationRunner.ts. OTA updates for org-data happen dynamically at runtime; static translations are applied once via migrations.
Crowdin Costs:
Crowdin Usage Overview (from Billing info)
- Managers: InReach has 10 users with the ability to manage translations. The plan allows up to 1,000,000 managers, before hitting a limit.
- Words: Inreach has used 28,188,094 words of a 100,000,000-word allowance. Crowdin tracks all words in the project, including source strings and translations.
Implications:
- InReach is using the open-source plan, which has very high limits for managers and words.
- Crowdin doesn’t charge based on how the app fetches translations (OTA or PRs). They charge based on words in the translation project and the number of managers.
Roadmap
See the open issues for a list of proposed features (and known issues).
- [Top Feature Requests](https://github.com/weareinreach/inreach/issues?q=label%3Aenhancement+is%3Aopen+sort%3Areacti
Related Skills
node-connect
341.6kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Writing Hookify Rules
84.6kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
review-duplication
99.5kUse this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
