Send heartfelt letters to the people you love. Beautiful, shareable, and free.
Live site: https://abbel-dawit.github.io/Cici
- Write and send letters with a beautiful envelope UI
- Shareable links — recipients get a unique URL, not a long encoded blob
- Two-way replies — recipients can reply with one tap
- Stamp picker, confetti, background music
- Save letters as PNG images
- Fully serverless — hosted on GitHub Pages, stored in Supabase
/
├── index.html ← The entire app (single file)
├── heart.mp3 ← Background music (you provide this)
└── README.md
Go to your Supabase project → SQL Editor → run this:
create table letters (
id uuid default gen_random_uuid() primary key,
recipient text not null,
sender text not null,
body text not null,
stamp text default '💌',
letter_date text,
created_at timestamptz default now()
);
-- Enable Row Level Security
alter table letters enable row level security;
-- Anyone can send (insert) a letter
create policy "Anyone can send a letter"
on letters for insert
with check (true);
-- Anyone can read a letter if they know the ID
create policy "Anyone can read a letter by ID"
on letters for select
using (true);Open index.html and find these three lines near the top of the <script> block:
const SUPABASE_URL = '';
const SUPABASE_KEY = '';
const SITE_URL = '';Replace YOUR_GITHUB_USERNAME and YOUR_REPO_NAME with your actual values.
Example: https://sarah.github.io/cici
Place your heart.mp3 file in the root of the repo (same folder as index.html).
git add index.html heart.mp3 README.md
git commit -m "🚀 Launch CiCi"
git push origin main- Go to your repo on GitHub
- Click Settings → Pages (left sidebar)
- Under Source, select
mainbranch, folder/(root) - Click Save
- Wait ~60 seconds — your site is live at:
https://abbel-dawit.github.io/Cici
- Supabase Row Level Security (RLS) is enabled — letters are write-once, read-by-UUID
- The
SUPABASE_KEYis a publishable anon key — safe to include in frontend code - Letters are only accessible if you know the exact UUID — not browseable
- No user accounts or personal data beyond what's typed in the letter
Since this is a single HTML file you can just open it directly in a browser — but note:
- Music requires a server (browsers block local file audio). Run:
Then open
npx serve . # or python3 -m http.server 8080
http://localhost:8080 - Supabase works fine locally as long as your credentials are correct
| What | Where in index.html |
|---|---|
| App name / logo | Search CiCi |
| Colour scheme | :root CSS variables at the top |
| Stamp options | const stamps = [...] array |
| Footer social links | <footer> HTML section |
| Background music | Replace heart.mp3 in root folder |
MIT — do whatever you like with it. Made with 💕