A beautiful, personalized love message application built with React, TypeScript, and Supabase. Send your special someone a unique daily love note with animations and confetti!
- π Password Protected - Each user has their own secret code
- π Daily Love Quotes - Unique quotes fetched from database by date
- π€ Personalized Greeting - Users are greeted by their name
- π Animated Characters - Shuffled and rotating character images
- π Confetti Celebration - Beautiful confetti on successful login
- π± Mobile Responsive - Looks great on all devices
- Node.js (v18 or higher)
- npm or yarn
- Supabase Account (free tier works!)
-
Clone the repository
git clone https://github.com/yourusername/l-message.git cd l-message -
Install dependencies
npm install
-
Set up Supabase
- Go to supabase.com and create a new project
- Wait for your project to be ready
- Go to Settings β API and copy your:
- Project URL
- Anon/Public key
-
Create environment variables
Create a
.envfile in the project root:VITE_SUPABASE_URL=your_supabase_project_url VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
-
Set up the database
Go to your Supabase project β SQL Editor and run:
-- Create users table (stores password and name) CREATE TABLE users ( id SERIAL PRIMARY KEY, password VARCHAR(255) UNIQUE NOT NULL, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); -- Create quotes table (stores daily love quotes) CREATE TABLE quotes ( id SERIAL PRIMARY KEY, quote TEXT NOT NULL, date DATE UNIQUE NOT NULL ); -- Enable Row Level Security (recommended) ALTER TABLE users ENABLE ROW LEVEL SECURITY; ALTER TABLE quotes ENABLE ROW LEVEL SECURITY; -- Create policies to allow read access CREATE POLICY "Allow read access to users" ON users FOR SELECT USING (true); CREATE POLICY "Allow read access to quotes" ON quotes FOR SELECT USING (true);
-
Add sample data
-- Add users (customize these!) INSERT INTO users (password, name) VALUES ('iloveyou', 'Baby'), ('sweetheart', 'My Love'), ('princess', 'Beautiful'), ('myqueen', 'Gorgeous'); -- Add daily quotes (add more for each day!) INSERT INTO quotes (quote, date) VALUES ('You are the reason I smile every day π', '2025-12-05'), ('Every moment with you is a treasure π', '2025-12-06'), ('You make my heart skip a beat π', '2025-12-07'), ('I fall for you more every single day π', '2025-12-08'), ('Being with you feels like home π π', '2025-12-09'), ('You are my today and all of my tomorrows π π', '2025-12-10'), ('Loving you is the best decision I ever made π', '2025-12-11'), ('You are my favorite notification π±β€οΈ', '2025-12-12'), ('My heart beats your name π', '2025-12-13'), ('You are the missing piece to my puzzle π§©β€οΈ', '2025-12-14');
-
Start the development server
npm run dev
-
Open your browser
Visit
http://localhost:5173and enter one of your secret codes!
l-message/
βββ public/
β βββ character/ # Character images
β βββ one.png
β βββ two.png
β βββ three.png
β βββ four.png
β βββ five.png
β βββ six.png
β βββ seven.png
βββ src/
β βββ lib/
β β βββ supabase.ts # Supabase client
β βββ App.tsx # Main application
β βββ main.tsx # Entry point
β βββ index.css # Tailwind CSS styles
β βββ vite-env.d.ts # TypeScript declarations
βββ .env # Environment variables (create this!)
βββ .gitignore
βββ package.json
βββ tailwind.config.js
βββ vite.config.ts
βββ README.md
-
Add your images to
public/character/ -
Update the
characterImagesarray inApp.tsx:const characterImages = [ "/character/your-image-1.png", "/character/your-image-2.png", // Add more... ];
Update the color in App.tsx and src/index.css:
/* src/index.css */
body {
background-color: #ffc5d3; /* Change this to your color */
}In Supabase SQL Editor:
INSERT INTO users (password, name) VALUES ('secretcode', 'Their Name');In Supabase SQL Editor:
INSERT INTO quotes (quote, date) VALUES
('Your love quote here π', '2025-12-15');| Column | Type | Description |
|---|---|---|
| id | SERIAL | Primary key |
| password | VARCHAR(255) | Unique secret code |
| name | VARCHAR(255) | User's display name |
| created_at | TIMESTAMP | Creation timestamp |
| Column | Type | Description |
|---|---|---|
| id | SERIAL | Primary key |
| user_id | INTEGER | Reference to users table |
| quote | TEXT | The love message |
| date | DATE | Date for this quote |
| created_at | TIMESTAMP | Creation timestamp |
-- Add a new user
INSERT INTO users (password, name) VALUES ('newpassword', 'Darling');
-- Get the user's ID (check in Supabase Table Editor or use)
-- Then add their personalized quotes
INSERT INTO quotes (user_id, quote, date) VALUES
(4, 'Your first personalized message π', '2025-12-05'),
(4, 'Your second personalized message π', '2025-12-06'),
(4, 'Your third personalized message π', '2025-12-07');- Frontend: React 18 + TypeScript
- Styling: Tailwind CSS v4
- Animations: Framer Motion
- Database: Supabase (PostgreSQL)
- Build Tool: Vite
- Effects: react-confetti, react-use
{
"react": "^18.x",
"react-dom": "^18.x",
"framer-motion": "^11.x",
"react-confetti": "^6.x",
"react-use": "^17.x",
"@supabase/supabase-js": "^2.x",
"tailwindcss": "^4.x"
}- Push your code to GitHub
- Go to vercel.com and import your repository
- Add environment variables in Vercel dashboard:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Deploy!
- Push your code to GitHub
- Go to netlify.com and import your repository
- Set build command:
npm run build - Set publish directory:
dist - Add environment variables in Netlify dashboard
- Deploy!
- Never commit your
.envfile - It contains sensitive keys - Add
.envto.gitignore- Already done in this template - Supabase Row Level Security - Make sure policies are set correctly
- HTTPS required - Use HTTPS in production for security
MIT License - Feel free to use this for your loved ones! π
Created to spread love and happiness. Share it with someone special!
Questions? Open an issue or reach out!