/write, type their message, and submit — the wish is stored in Supabase and appears on the home page wall. Every message is assigned a random accent color so the wall looks lively and varied.
Writing a wish
Open/write in any browser. You will see a full-screen form with a textarea and a character counter.
1
Type your message
Write anything up to 500 characters. The counter at the bottom of the textarea updates as you type.
2
Submit
Click 送上祝福. The app posts your message to
/api/messages. All submissions are anonymous — no name or login is required.3
Confirmation
On success, the form is replaced by a confirmation screen. After three seconds you are automatically redirected to the home page to see your wish on the wall.
Validation and error messages
Client-side validation runs before the request is sent. The API also validates server-side.Rate limiting
The API limits each IP address to 3 messages per 5-minute window. The IP is hashed with SHA-256 before being stored, so no raw IP addresses are persisted in your database.Message colors
Each submitted message is randomly assigned one of six Tailwind color names:rose, sky, amber, emerald, violet, or pink. The color is stored in the color column and used by the home page to style each card.
API reference
GET /api/messages
Returns up to 100 messages, ordered newest first. ResponseArray of message objects, newest first. Maximum 100 items.
POST /api/messages
Submit a new wish. Request bodyThe birthday message. Must be between 1 and 500 characters after trimming whitespace.
Success response (201)
Admin panel
A password-protected admin panel lets you view and delete messages. Access it from the navbar when you are authenticated. The panel shows all messages with their timestamps, colors, and the option to remove any entry.The admin panel requires the
ADMIN_PASSWORD environment variable to be set. See the deployment guide for details.