Intry

Tech stack

Languages, frameworks, infrastructure, and third-party services used by Intry.

Overview

Intry is a TypeScript-first system: the Core API and most tools share Node.js runtimes, with mobile on Expo and several UIs on Next.js.

Core platform

LayerTechnology
RuntimeNode.js
HTTPExpress 5
ORMPrisma
DatabasePostgreSQL
Background jobspg-boss (PostgreSQL-backed; no Redis required for workers)
Core deployRailway (typical)
Error trackingSentry

Authentication & access

Use caseMechanism
Admin dashboard APIWorkOS SSO (legacy) and/or Clerk Organizations (migration); Unkey API keys for automation
Property managers / B2BClerk org membership (clerkUserId on User; org:role in session)
Residents (portal)Clerk → JWT exchange via /api/v1/auth/clerk-session
Residents (mobile)Clerk or legacy email/password → JWT Bearer
Internal opsTailscale identity + intry-ops permissions

See Auth for current vs target (ADR-004) state.

Telephony & messaging

CapabilityProvider
Voice / buzzerTelephonyProvider abstraction — Twilio or Telnyx via TELEPHONY_PROVIDER
Voice webhooks/twilio/* or /telnyx/* (mirrored routes)
SMS / WhatsAppTwilio or Telnyx through TelephonyProvider
OTP verificationTwilio Verify (src/services/verify.ts)
Push (mobile)Knock workflows → FCM (Android) and APNs (iOS)
SMS fallbacksCarrier SMS via TelephonyProvider when user flags enable fallbacks

Billing & analytics

AreaServices
SubscriptionsStripe direct (ADR-005; no Clerk Billing)
Plan tier cacheClerk org publicMetadata.plan_tier (target); Tenant DB fallback
Product analyticsMixpanel, PostHog
APM / logsNew Relic (Core start script)

Mobile observability (intry-app)

ToolPurpose
EAS ObserveProduction startup/render perf (SDK 55, expo-observe in intry-app)
SentryMobile crash and error tracking
Vexo / PostHogIn-app product analytics

See EAS Observe for Intry integration notes.

Support & comms

AreaServices
Resident/PM chatChatwoot (widgets in portal/app; AI bot in Core webhooks)
Omnichannel notificationsKnock

API surface

SurfaceBase pathConsumers
Admin/api/admin/*Admin SPA, MCP, internal tools
Resident v1/api/v1/*Portal, mobile app
Voice gateway/twilio/*, /telnyx/*Carrier callbacks
Legacy mobile/access/*, /devices/*, /registration/*Older app builds
Webhooks/stripe, /webhooks/clerk, /webhooks/10dlc/eventsStripe, Clerk, Telnyx 10DLC

Frontends & tools

AppStackHosting (typical)
AdminExpress proxy + static templates + Clerk gatewayFly.io (intry-admin)
Admin 2.0 (target)Next.js App Router + shadcn/ui (IN-103)Fly.io
PortalNext.js + Clerk + i18nFly.io / Vercel
MobileExpo / React Native + Clerk + EAS Observe (prod perf)EAS builds
Prop1Vite + React + ExpressFly.io (separate DB)

Configuration

  • Multi-environment admin: proxy sends X-Admin-Env: DEV, TEST, STAGING, or PROD to route to the correct Core base URL.
  • Telephony provider: TELEPHONY_PROVIDER=twilio or telnyx (per-number VirtualNumber.telephonyProvider is canonical for voice).
  • Secrets: Never commit .env; use platform secrets (Railway, Fly, Vercel) per environment.

Last verified: 2026-06-21 (commit 293c4a7)

On this page