Skip to main content
Currently in the planning stage. We welcome inquiries from seniors and their families.

A Welcoming Place to Call Home.

We’re planning a comfortable, supportive home for seniors in the New York City area—with thoughtful daily assistance, meaningful companionship, and a personal touch.

Illustrative photo of two older adults smiling and sharing a warm conversation over tea in a bright, comfortable living room
Warm conversation and everyday comfort Illustrative Photo
Illustrative photo of a sunlit, welcoming residential living room with comfortable armchairs and warm natural wood accents
A calm, home-like atmosphere Illustrative Photo
About Torrington Hope

Comfort, Connection, and Everyday Support.

At Torrington Hope, our vision is to create a welcoming home where seniors feel respected, connected, and supported. We believe that comfortable surroundings, familiar routines, and caring relationships can make a meaningful difference in everyday life.

We are developing our plans to serve seniors in the New York City area and welcome conversations with individuals and families interested in learning more.

Designed Around Everyday Living

Rather than feeling institutional, our goal is a warm residential setting where daily life unfolds at a comfortable, unhurried pace.

Planned Services

Thoughtful Support for Daily Living.

Below are the planned services we are designing for Torrington Hope. Final offerings will be subject to applicable approvals, staffing, and individual needs.

Housing

Comfortable residential living in a welcoming home environment.

Meals

Daily meals with attention to preferences and applicable dietary needs.

Housekeeping

Support with keeping living spaces clean and comfortable.

Laundry

Assistance with clothing and household linens.

Personal Care Assistance

Planned support with everyday personal routines.

Medication Assistance

Planned assistance with medication routines within the scope permitted for the home.

Activities and Companionship

Opportunities for conversation, recreation, and social connection.

Transportation Coordination

Help coordinating transportation for appointments and everyday needs.

All services described above reflect our current planning goals. Specific service availability and scope will be confirmed prior to opening in accordance with applicable approvals and individual resident needs.

Our Approach

A Personal Approach to Feeling at Home.

As we shape Torrington Hope, four guiding principles inform every decision we make about the home environment and daily life.

Dignity and respect

Recognizing each person’s individuality, life story, and personal preferences in the rhythm of everyday living.

Comfort and familiarity

Planning calm, inviting living spaces and steady daily routines that help seniors feel at ease and genuinely at home.

Connection and companionship

Encouraging shared meals, unhurried conversation, and welcoming moments of social connection throughout the week.

Communication with families

Valuing thoughtful, transparent communication with family members and loved ones as partners in everyday support.

Interest List & Inquiries

Stay Connected with Torrington Hope.

Interested in learning more for yourself or a loved one? Join our interest list to receive updates as our plans develop, or send us a question.

Direct Contact Details

Service Area
Serving the New York City area
We read every inquiry carefully and respond personally. You can also review our .
Optional
Preferred contact method

Enter a phone number above to select Phone as your preferred contact method.

Optional

Please do not include medical records or sensitive health information.

Common Questions

Frequently Asked Questions

Torrington Hope is currently in the planning stage. We are accepting inquiries and interest-list signups as we develop our plans.

Torrington Hope

Privacy & Inquiry Information Notice

Torrington Hope respects the privacy of seniors, families, and visitors who reach out to us. This notice explains what information our inquiry form collects and how we use it while we are in the planning stage.

1. Information We Collect

When you submit our inquiry or interest-list form, we collect your full name, email address, who you are inquiring for, your preferred contact method, and your acknowledgment of our planning status. If you choose to provide them, we also collect your phone number, optional message, and whether you opted in to receive occasional email updates.

Sensitive Information Notice: Please do not submit medical records, diagnoses, financial account numbers, or other sensitive health information through this website.

2. How We Use Your Information

  • To respond directly to your questions or inquiry via your preferred contact method.
  • To send occasional planning updates about Torrington Hope if you checked the optional email updates box (or joined our interest list).
  • To send an internal alert to our team letting us know a new inquiry has arrived (our internal SMS alert does not contain your personal details or message).
Action Required Before Launch

3. Service Providers, Retention & Opt-Out Details to Confirm

  • Email & SMS Delivery Providers [CONFIRM BEFORE LAUNCH]: Website inquiries are transmitted through our hosting provider and email/SMS notification services (for example, [Insert chosen email provider, e.g., Postmark / AWS SES / Resend] and [Insert chosen SMS provider, e.g., Twilio]).
  • Retention Practices [CONFIRM BEFORE LAUNCH]: Inquiry emails are retained in our business mailbox for [Insert retention period, e.g., up to 24 months or until you request deletion] so we can follow up as plans progress.
  • Managing Email Updates & Deletion Requests [CONFIRM BEFORE LAUNCH]: You may opt out of email updates or request deletion of your inquiry details at any time by emailing [email protected] [or clicking the unsubscribe link in any update email, if mailing list software is used].
Deliverables & Server Configuration

Backend Code (`api/inquiries.js`) & Launch Setup Guide

Important Integrity Note: In accordance with Torrington Hope’s technical requirements, this website never simulates or fakes successful form delivery. Submitting the form sends a real `POST /api/inquiries` request. Until you deploy the serverless endpoint below with live email and SMS credentials, the form will safely preserve visitor input and display a clear fallback (`[email protected]`).

1. How to Preview and Deploy the Site

  • Local Preview: Open index.html directly in any browser, or run npx vercel dev / npx netlify dev to run both the static frontend and the /api/inquiries serverless function locally.
  • Recommended Deployment: Deploy to Vercel, Netlify, or Cloudflare Pages with a Node.js serverless function at /api/inquiries.js.

2. Adding the Future Logo and Public Phone Number

  • Public Phone Number: Open index.html and locate SITE_CONFIG at the top of the <script> block. Set PUBLIC_PHONE_NUMBER: "(212) 555-0199" and PUBLIC_PHONE_TEL: "+12125550199". The header “Call Us” button and Contact section phone link will automatically unhide. Leave empty ("") until a real number is active.
  • Official Logo: Locate id="site-brand" in the <header> and replace the monogram/wordmark spans with your <img src="/logo.svg" alt="Torrington Hope" class="h-11 w-auto" />.

3. Required Server Environment Variables (.env)

Store all credentials strictly on the server. Never expose API keys or the internal SMS notification number in browser code.

# Email Delivery Configuration (Resend / Postmark / SendGrid / SMTP)
RESEND_API_KEY="re_your_live_api_key"
VERIFIED_SENDER_EMAIL="[email protected]"
INQUIRY_DESTINATION_EMAIL="[email protected]"

# Internal Business SMS Notification Configuration (Twilio)
TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TWILIO_AUTH_TOKEN="your_twilio_auth_token"
TWILIO_FROM_NUMBER="+15550001111"
INTERNAL_NOTIFICATION_SMS_NUMBER="+19175550000"

# Allowed Origin for CORS Protection
ALLOWED_ORIGIN="https://torringtonhope.com"

4. Serverless Backend Code (api/inquiries.js)

Save this file at api/inquiries.js in your project root. It enforces server-side validation, field length limits, honeypot spam checks, IP rate limiting, email delivery with Reply-To set to the visitor’s email, and fault-tolerant SMS notification to your internal number without logging message contents.

/**
 * Torrington Hope — Secure Inquiry Notification Endpoint (api/inquiries.js)
 * Runtime: Node.js 18+ (Vercel / Netlify / AWS Lambda compatible)
 */

const RATE_LIMIT_WINDOW_MS = 15 * 60 * 1000; // 15 minutes
const MAX_REQUESTS_PER_WINDOW = 5;
const ipRequestMap = new Map();

function isRateLimited(ip) {
  const now = Date.now();
  const record = ipRequestMap.get(ip) || { count: 0, start: now };
  if (now - record.start > RATE_LIMIT_WINDOW_MS) {
    ipRequestMap.set(ip, { count: 1, start: now });
    return false;
  }
  record.count += 1;
  ipRequestMap.set(ip, record);
  return record.count > MAX_REQUESTS_PER_WINDOW;
}

function escapeHtml(str = '') {
  return String(str)
    .replace(/&/g, '&')
    .replace(//g, '>')
    .replace(/"/g, '"')
    .replace(/'/g, ''');
}

export default async function handler(req, res) {
  if (req.method !== 'POST') {
    return res.status(405).json({ error: 'Method not allowed' });
  }

  // 1. Verify Server Configuration
  const {
    RESEND_API_KEY,
    VERIFIED_SENDER_EMAIL,
    INQUIRY_DESTINATION_EMAIL = '[email protected]',
    TWILIO_ACCOUNT_SID,
    TWILIO_AUTH_TOKEN,
    TWILIO_FROM_NUMBER,
    INTERNAL_NOTIFICATION_SMS_NUMBER
  } = process.env;

  if (!RESEND_API_KEY || !VERIFIED_SENDER_EMAIL) {
    return res.status(503).json({
      error: 'Server notification credentials are not yet configured.'
    });
  }

  // 2. Rate Limiting
  const clientIp =
    (req.headers['x-forwarded-for'] || '').split(',')[0].trim() ||
    req.socket?.remoteAddress ||
    'unknown';

  if (isRateLimited(clientIp)) {
    return res.status(429).json({
      error: 'Too many requests. Please wait a few minutes or email [email protected].'
    });
  }

  const body = req.body || {};

  // 3. Honeypot Spam Protection (Silently reject bots)
  if (body.company_website && String(body.company_website).trim() !== '') {
    return res.status(200).json({ ok: true });
  }

  // 4. Sanitize & Validate Inputs + Enforce Length Limits
  const fullName = String(body.fullName || '').trim();
  const email = String(body.email || '').trim();
  const phone = String(body.phone || '').trim();
  const inquiringFor = String(body.inquiringFor || 'A family member').trim();
  const preferredContact = String(body.preferredContact || 'Email').trim();
  const message = String(body.message || '').trim();
  const emailUpdates = Boolean(body.emailUpdates);
  const planningAck = Boolean(body.planningAck);

  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  const allowedInquiringFor = ['Myself', 'A family member', 'Someone else'];
  const allowedContact = ['Email', 'Phone'];

  if (!fullName || fullName.length > 120) {
    return res.status(400).json({ error: 'Please provide a valid full name (up to 120 characters).' });
  }
  if (!email || email.length > 254 || !emailRegex.test(email)) {
    return res.status(400).json({ error: 'Please provide a valid email address.' });
  }
  if (phone.length > 30) {
    return res.status(400).json({ error: 'Phone number must be 30 characters or fewer.' });
  }
  if (preferredContact === 'Phone' && !phone) {
    return res.status(400).json({ error: 'Please provide a phone number if Phone is your preferred contact method.' });
  }
  if (!allowedInquiringFor.includes(inquiringFor) || !allowedContact.includes(preferredContact)) {
    return res.status(400).json({ error: 'Invalid selection submitted.' });
  }
  if (message.length > 2000) {
    return res.status(400).json({ error: 'Message must be 2,000 characters or fewer.' });
  }
  if (!planningAck) {
    return res.status(400).json({ error: 'Please confirm that you understand Torrington Hope is in the planning stage.' });
  }

  // 5. Send Email Notification to [email protected]
  //    (Uses verified sender address and sets visitor's email as Reply-To)
  const emailHtml = `
    

New Website Inquiry — Torrington Hope

Name: ${escapeHtml(fullName)}

Email: ${escapeHtml(email)}

Phone: ${escapeHtml(phone || 'Not provided')}

Inquiring For: ${escapeHtml(inquiringFor)}

Preferred Contact Method: ${escapeHtml(preferredContact)}

Opted into Occasional Email Updates: ${emailUpdates ? 'Yes' : 'No'}

Planning-Stage Acknowledgment: Confirmed


Message:

${escapeHtml(message || '(No message included)')}

`; try { const emailResponse = await fetch('https://api.resend.com/emails', { method: 'POST', headers: { 'Authorization': `Bearer ${RESEND_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ from: `Torrington Hope Website <${VERIFIED_SENDER_EMAIL}>`, to: [INQUIRY_DESTINATION_EMAIL], reply_to: email, subject: `New Inquiry from ${fullName} (${inquiringFor})`, html: emailHtml }) }); if (!emailResponse.ok) { console.error('Email provider returned non-200 status:', emailResponse.status); return res.status(502).json({ error: 'We could not deliver your inquiry right now. Please email [email protected] directly.' }); } } catch (err) { console.error('Email delivery network error occurred.'); return res.status(502).json({ error: 'We could not deliver your inquiry right now. Please email [email protected] directly.' }); } // 6. Send Brief Internal SMS Notification // - Contains NO personal details or visitor message // - Sent ONLY to the internal business notification number // - If SMS fails, the email inquiry is already saved; we do not fail the visitor's request if (TWILIO_ACCOUNT_SID && TWILIO_AUTH_TOKEN && TWILIO_FROM_NUMBER && INTERNAL_NOTIFICATION_SMS_NUMBER) { try { const twilioUrl = `https://api.twilio.com/2010-04-01/Accounts/${TWILIO_ACCOUNT_SID}/Messages.json`; const smsParams = new URLSearchParams({ To: INTERNAL_NOTIFICATION_SMS_NUMBER, From: TWILIO_FROM_NUMBER, Body: 'New Torrington Hope website inquiry received. Check your email for details.' }); const smsRes = await fetch(twilioUrl, { method: 'POST', headers: { 'Authorization': 'Basic ' + Buffer.from(`${TWILIO_ACCOUNT_SID}:${TWILIO_AUTH_TOKEN}`).toString('base64'), 'Content-Type': 'application/x-www-form-urlencoded' }, body: smsParams.toString() }); if (!smsRes.ok) { console.warn('Internal SMS alert failed with status:', smsRes.status); } } catch (smsErr) { console.warn('Internal SMS alert encountered a network error; email inquiry succeeded.'); } } return res.status(200).json({ ok: true }); }

5. End-to-End Testing & Remaining Launch Checklist

  1. Verify Domain & Sender: Verify torringtonhope.com (SPF/DKIM) with your email provider and set VERIFIED_SENDER_EMAIL.
  2. Configure Internal SMS: Provision your Twilio number and set INTERNAL_NOTIFICATION_SMS_NUMBER to the internal staff phone.
  3. Test Real Inquiry: Submit the form on staging, verify that [email protected] receives the formatted email with Reply-To set to the visitor’s address, and confirm the internal phone receives “New Torrington Hope website inquiry received. Check your email for details.”
  4. Test SMS Failover: Temporarily set an invalid TWILIO_AUTH_TOKEN and submit an inquiry—verify the email still arrives and the visitor sees the thank-you state without duplicate retries.
  5. Finalize Privacy Notice: Replace the three [CONFIRM BEFORE LAUNCH] placeholders in the Privacy Dialog with your final provider names and retention policy.