All projects

Daily Vibe

A small site to drop by each day — read a line meant for today, or draw a tarot card when you're unsure about something. It sells a feeling, not features.

Date08/2026Tech
  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind CSS 4
  • Zod
  • Zustand
  • React Hook Form
  • Gemini API
Daily Vibe

Highlights

  • A line for you: open the page and it's already there, unchanged for the whole day.
  • Two tarot modes — draw 1 card for a quick question, spread 3 cards for something you're stuck on.
  • AI readings (Gemini) grounded in the user's own question; still works without an API key via a copy-prompt fallback.
  • Results are deterministic from a day seed (UTC+7) — refreshing never changes them, because that would break trust.
  • Full 78-card tarot deck, with source data kept server-only and never bundled to the client.
  • Private questions are sent via POST, not query strings, so they stay out of logs and Referer headers.
  • All copy written in natural Vietnamese — no machine translation, no sloganeering.

About the project

Daily Vibe is a personal project I started in August 2026, now live at daily.liqwy.com.

The idea is simple: a small page people drop by each day, feel a little better, and leave. Two surfaces are open — “A line for you” and “Tarot” (draw one card, or spread three).

What decides whether this product lives isn't features but two things: results must be stable per day — if a refresh changes the line, users realize “oh, it's just random” and stop trusting it; and the copy must sound like a person, because one hollow sentence does more damage than any bug. So every result is derived from a day seed (day boundary at UTC+7) rather than randomness.

The tarot reading calls Gemini to interpret the drawn cards against what the user actually asked; the route re-draws the cards from the seed instead of accepting them from the client, so nobody can tamper with the request to get a reading for arbitrary cards. Without an API key the app still works — it falls back to a copy-prompt screen users can take to ChatGPT/Gemini themselves.

The stack is Next.js 16 (App Router, Turbopack) + React 19 + Tailwind CSS 4, with Zod as the source of both types and validation, Zustand for session state, and React Hook Form for forms. Source data (the quote set and the 78-card deck) is read server-side only — shipping it to the client would bloat the page and give everything away, and being able to look up the whole deck ruins the fun.

Got questions?

I'm always excited to collaborate on innovative and exciting projects!