A comprehensive family and home management system designed to be self-hosted in your own home. Manage allowances, chores, calendars, and display family information on kiosk displays with full control over your data.
- π¨βπ©βπ§βπ¦ Family Management - Create and manage family member accounts with role-based permissions
- π° Allowance Tracking - Track allowance balances and transaction history for each family member
- β Chore Management - Create, assign, and track chores with completion status
- π Calendar Integration - Integrate Google Calendar and iCal feeds to display upcoming events
- π€οΈ Weather Widget - Display current weather conditions using OpenWeather API
- πΌοΈ Google Photos - Connect Google Photos and display photo slideshows on kiosk displays
- πΊ Kiosk Display Mode - Full-screen dashboard optimized for touchscreens with screensaver
- π Secure Authentication - JWT-based authentication with admin/user roles
- π± Mobile Friendly - Responsive design works on desktop, tablet, and mobile
The system consists of two main components:
- Language: Rust (Axum framework)
- Database: PostgreSQL
- Features:
- RESTful API for all client operations
- JWT authentication and authorization
- Background tasks for photo/weather refresh
- Database migrations with SQLx
- Framework: React 19 + TypeScript
- UI Library: Material-UI (MUI)
- State Management: TanStack Query (React Query)
- Features:
- Admin dashboard for family management
- Settings and configuration interface
- Kiosk mode for displays
- Responsive design with dark/light themes
- Rust 1.80+ (Install Rust)
- Node.js 20+ and npm (Install Node.js)
- PostgreSQL 15+
- Google Cloud Project (for Google Photos/Calendar) - See GOOGLE_CLOUD_SETUP.md
- OpenWeather API Key (free tier) - Get API Key
-
Clone the repository
git clone <repository-url> cd home
-
Set up environment variables
cp .env.example .env nano .env # Edit with your valuesRequired values:
DATABASE_URL- PostgreSQL connection stringJWT_SECRET- Generate with:tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 64GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET- From Google Cloud ConsoleOPENWEATHER_API_KEY- From OpenWeather
See ENV_SETUP.md for detailed configuration.
-
Install frontend dependencies
cd frontend npm install cd ..
-
Run database migrations and seed data
cd backend # Ensure your PostgreSQL database is running and DATABASE_URL is correct cargo run --bin seed cd ..
-
Start the services (recommended: use 2 terminal windows)
Terminal 1 - Backend:
cd backend cargo watch -x run # Or without watch: cargo run
Terminal 2 - Frontend:
cd frontend npm run dev -
Access the application
- Frontend: http://localhost:5173
- Backend API: http://localhost:4000
-
Login with default credentials
- Username:
admin - Password:
password
β οΈ Change this password immediately in production! - Username:
-
Family Management (
/users)- Add family members with names, birthdays, and roles
- Assign admin privileges
- Change passwords
-
Allowance Management (
/allowance)- View all family member balances
- Add credits (allowance payments)
- Add debits (purchases/penalties)
- View transaction history
-
Chore Management (
/chores)- Create chores with names and rewards
- Assign to family members
- Mark chores as complete/incomplete
- Track completion status
-
Settings (
/settings)- Configure weather zip code
- Connect Google account for Photos and Calendar
- Add calendar feeds (iCal URLs or Google Calendar)
- Manage display tokens for kiosk mode
- Backup and restore system data
-
Create a display token
- Go to Settings β Display Tokens
- Click "Create Token" and name it (e.g., "Living Room Display")
- Copy the generated token
-
Access display mode
- Navigate to
/displayon your kiosk device - Enter the display token
- The display will show:
- Weather widget
- Upcoming calendar events
- Allowance balances
- Pending chores
- Photo slideshow (if Google Photos connected)
- Navigate to
-
Features:
- Automatic screensaver after 1 minute of inactivity
- Horizontal scrolling cards
- Refreshes data every minute
- No authentication required (token-based)
home/
βββ backend/ # Rust backend API
β βββ src/
β β βββ handlers/ # API route handlers
β β βββ middleware/ # Auth middleware
β β βββ models/ # Data models
β β βββ utils/ # Helper utilities
β β βββ main.rs
β βββ migrations/ # SQLx database migrations
βββ frontend/ # React frontend
β βββ src/
β βββ api/ # API client
β βββ components/ # React components
β βββ context/ # React context providers
β βββ pages/ # Page components
β βββ types/ # TypeScript types
β βββ utils/ # Helper utilities
βββ .env # Environment configuration
Backend:
cargo watch -x run- Auto-reload on file changescargo test- Run testscargo run --bin seed- Seed database with admin user
Frontend:
npm run dev- Development server with hot reloadnpm run build- Production buildnpm run lint- ESLint checking
Migrations are managed with SQLx and run automatically on startup.
To create a new migration:
cd backend
sqlx migrate add <migration_name>
# Edit the generated SQL file
sqlx migrate runThe project includes a Helm chart for easy deployment to Kubernetes.
- Configure overrides: Create a
charts/home/values-local.yamlfile with your specific settings (hostname, ingress class, etc.). This file is ignored by git. - Deploy:
helm install home ./charts/home -f charts/home/values-local.yaml
Use the provided docker-compose.yml to spin up the entire stack including PostgreSQL.
docker-compose up -d-
Install dependencies
# Install Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Install Node.js curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # Install PostgreSQL sudo apt-get install postgresql
-
Clone and configure
git clone <repository-url> ~/home cd ~/home cp .env.example .env nano .env # Configure for production
-
Build frontend
cd frontend npm install npm run build cd ..
-
Build backend
cd backend cargo build --release cargo run --release --bin seed cd ..
-
Run with systemd Create service files in
/etc/systemd/system/:home-backend.service
Enable and start:
sudo systemctl enable home-backend sudo systemctl start home-backend -
Serve frontend Use nginx or enable
SERVE_FRONTEND=truein backend.
- JWT Authentication - Secure token-based authentication
- Password Hashing - Argon2 password hashing
- CORS Protection - Configurable CORS origin
- Rate Limiting - Login endpoint rate limiting (2 req/sec)
- Display Tokens - Separate token system for kiosk displays
- Environment Variables - Sensitive config stored in
.env(not committed)
β οΈ Change default admin password immediatelyβ οΈ Generate a strong random JWT_SECRET (64+ characters). Note: The system will automatically generate and save one to the database on first startup if not provided via environment variable.β οΈ Keep Google OAuth credentials secureβ οΈ Use HTTPS in productionβ οΈ Regularly backup your databaseβ οΈ Rotate display tokens periodically
This is a personal/family project, but suggestions and improvements are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is for personal/family use. Feel free to use and modify for your own needs.
- Built with Rust and Axum
- Frontend powered by React and Material-UI
- Icons from Material Icons
- Weather data from OpenWeatherMap
- Calendar parsing with iCal.js
- ENV_SETUP.md - Detailed environment configuration guide
- GOOGLE_CLOUD_SETUP.md - Google Cloud Platform setup instructions
- GEMINI.md - Project context for AI assistance
- Ensure you've run
cargo run --bin seedto create the admin user - Check that JWT_SECRET is set in
.env
- Verify GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are correct
- Check that redirect URI matches in Google Cloud Console:
http://localhost:4000/api/google-photos/callback
- Verify OPENWEATHER_API_KEY is valid
- Ensure zip code is set in Settings
- Make sure you're accessing
/display(not other protected routes) - Verify the display token is valid
- Check that API is accessible
- For PostgreSQL, check your connection limit and ensure the database server is running.
Made with β€οΈ for families