A simple, friendly web application for coordinating family visits with a resident. Designed to help families schedule visits without calendar conflicts, logins, or confusing tooling.
Enable quick visit scheduling from any device, even for non-technical family members, while ensuring everyone sees the same up-to-date agenda in real time. The app protects privacy while allowing lightweight collaboration through anonymous authentication.
- Calendar View: Interactive calendar to select and view dates with scheduled visits
- Daily Agenda: See all visits for a selected date with visitor names, times, and durations
- Upcoming Visits: Comprehensive view of all future scheduled visits grouped by date
- Visit Booking: Create new visits with visitor name, date, time, duration, and optional notes
- Visit Management: Edit or delete visits you've created (ownership-based)
- Real-Time Sync: Automatic updates across all devices when visits are added or modified
- Offline Support: Notifications when the network connection is lost
- Privacy-First: Uses anonymous authentication—no accounts or personal information required
- React 19 - UI framework
- TypeScript - Type safety
- TanStack Router - File-based routing with type-safe navigation
- TanStack Query - Data fetching and caching
- Vite - Build tool and dev server
- Lucide React - Icon library
- Firebase Firestore - Real-time database for visit data
- Firebase Anonymous Authentication - Privacy-preserving user identification
- Firebase Hosting - Static site hosting
- Vitest - Unit testing framework
- Biome - Linting and formatting
- GitHub Actions - CI/CD pipeline
- Node.js (version specified by your nvm installation)
- npm
- Firebase project with Firestore and Anonymous Authentication enabled
- Clone the repository:
git clone <repository-url>
cd resident-rendezvous- Install dependencies:
npm install- Set up environment variables:
Create a
.envfile in the root directory with your Firebase configuration:
VITE_FIREBASE_API_KEY=your_api_key
VITE_FIREBASE_AUTH_DOMAIN=your_auth_domain
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_APP_ID=your_app_id
VITE_APP_NAME=Resident Rendezvous
VITE_APP_DESCRIPTION=Visit coordination appStart the development server:
npm run devThe app will be available at http://localhost:3000
Build the application:
npm run buildThe production build will be created in the dist/ directory.
Preview the production build locally:
npm run serveDeploy to Firebase Hosting:
npm run deployThis command will:
- Build the application (
vite build) - Type-check the codebase (
tsc) - Deploy to Firebase Hosting (
firebase deploy)
The project includes a GitHub Actions workflow (.github/workflows/test-and-deploy.yml) that:
- Runs tests on every push and pull request
- Automatically deploys to Firebase Hosting when changes are pushed to the
mainbranch
To use automated deployment:
- Set up the required GitHub Secrets:
VITE_FIREBASE_API_KEYVITE_FIREBASE_AUTH_DOMAINVITE_FIREBASE_PROJECT_IDVITE_FIREBASE_APP_IDFIREBASE_SERVICE_ACCOUNT_RESIDENT_RENDEZVOUS
- Set up GitHub Variables:
VITE_APP_NAMEVITE_APP_DESCRIPTION
Run the test suite:
npm testCheck for linting issues:
npm run lintFix linting issues automatically:
npm run lint:fixFormat code:
npm run formatRun both linting and formatting checks:
npm run checksrc/
├── components/ # React components
│ ├── calendar/ # Calendar-related components
│ ├── forms/ # Form components
│ ├── layout/ # Layout components
│ └── visits/ # Visit-related components
├── firebase/ # Firebase configuration and utilities
├── hooks/ # Custom React hooks
├── integrations/ # Third-party integrations
├── routes/ # TanStack Router file-based routes
├── types/ # TypeScript type definitions
└── utils/ # Utility functions and tests
Visits are stored in Firestore with the following structure:
- Date: ISO date string (YYYY-MM-DD)
- Time: 24-hour format (HH:mm)
- Visitor Name: Name of the visitor
- Duration: Visit duration in minutes
- Description: Optional notes about the visit
- User ID: Anonymous Firebase Auth UID for ownership tracking
The app uses Firestore listeners to automatically sync visit data across all connected devices. Changes appear instantly without page refreshes.
When the network connection is lost, users see a notification toast. The app will automatically sync when connectivity is restored.