Template
Stillpage
A private journaling app with a calm writing surface, multiple colour-coded notebooks, rotating reflection prompts and gentle insights like streaks and word counts. It is for people building a daily writing habit or keeping separate gratitude, work and travel journals.
Private daily writing journal · App · Small tools and apps · full-stack app (auth + DB)
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Start from this templateRead the build prompt
Typefaces
Inclusive Sans is quiet and very legible, with a soft personal tone, so the writing stays the focus of the evening journal.
- Inclusive SansHeadings: title 40px 600, tight tracking
- Inclusive SansBody: entry text 16px, relaxed line height
- NewsreaderAccent: optional serif for entry text in the editor
Who it is for
- People building a daily journaling habit
- Gratitude and reflection writers
- Travellers keeping memory logs
- Therapy clients doing structured journaling
Layout
- Transparent top bar: wordmark left, 'View demo' text and black pill 'Get started' right
- Centered hero on a soft warm-grey to lavender gradient: product name, one-line tagline, white pill + black pill buttons
- Horizontally drifting row of floating cards: notebook cards (icon, name, entry count, last date), a purple insights card, and entry preview cards (title, excerpt, date with notebook icon)
- Hairline divider and minimal footer on the lavender base
- App: sidebar with journals, entry list grouped by month with search, full-width editor with date header and prompt, insights page (streaks, stats chart), media calendar
Palette
Quiet, soft, personal, dreamy, calm. The gradient dusk backdrop and floating cards feel like a peaceful evening ritual.
- background top (warm grey)
#e8e4df - background bottom (lavender)
#9088cc - card
#ffffff - text (ink)
#1e1d28 - insights purple
#a77ce8 - notebook blue icon
#3b82f6
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 16.65:1 | 4.5:1 |
| Aa | muted text on background | 6.76:1 | 4.5:1 |
| Aa | ink text on warm-grey gradient start | 13.15:1 | 4.5:1 |
| Aa | ink text on lavender gradient end / footer | 5.22:1 | 4.5:1 |
| Aa | ink text on purple insights card | 5.30:1 | 4.5:1 |
| notebook blue icon on card | 3.68:1 | 3:1 | |
| Aa | white text on ink pill button | 16.65:1 | 4.5:1 |
| input border on card | 3.29:1 | 3:1 |
As vibld’s tokens
The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary *
- secondary
- accent
- destructive *
Type scale
- Display
- Inclusive Sans Display 600, 40px, -2.4px tracking
- Body
- Inclusive Sans 400 16px, relaxed line height for entry text
Neutral Inclusive Sans throughout so the writing itself is the focus; very tight tracking on the title adds polish. Accessibility: body copy 16px or larger at 1.5+ line height with a ~70ch max measure; no text below 12px; weights under 400 only at 32px+; uppercase reserved for short labels with 0.05em+ tracking.
Spacing and imagery
Minimal and airy; hero centered with lots of space; cards 16px radius with soft shadows, 20px gaps; full pill buttons.
No photography; UI cards act as illustration. In-app users can attach photos and videos shown in a media calendar.
Components
- Gradient hero
- Floating card marquee
- Notebook card (icon, name, count, last entry)
- Entry preview card
- Insights summary card
- Sidebar notebook switcher
- Month-grouped entry list with search
- Rich-text editor (bold, checklists, quotes, images)
- Reflection prompt banner with shuffle
- Streak counters
- Monthly/yearly stats bar chart
- Media calendar grid
- Journal create/edit dialog (name, colour, icon)
- OAuth sign-in
Interactions
- Cards drift horizontally on landing
- Autosave while typing with saved indicator
- Shuffle prompt
- Drag to reorder notebooks
- Toggle this month / this year in insights
- Click calendar day to reveal media
- Search entries by title
- Inline image upload
Data
Journal{id, user_id, name, color, icon, position}Entry{id, journal_id, user_id, entry_date, title, content (rich text / Yjs doc), word_count, updated_at}Media{id, entry_id, user_id, path, kind: image|video, taken_on}Prompt{id, text}
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack templates) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal Build **Stillpage**, a private journaling app for people who want a calm place to write every day. Users keep several notebooks (personal, work, gratitude, travel), start each entry with today's date and an optional reflection prompt, write in a clean rich-text editor that saves automatically, and see gentle insights: streaks, words written, days journaled, and a calendar of attached photos. ### Stack React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react. Tiptap for the editor (with Yjs for conflict-free autosave across tabs/devices), dnd-kit to reorder notebooks, Recharts for insights, Framer Motion for the landing card drift and page transitions, date-fns for streak maths. Supabase: Auth (email + Google + Apple), Postgres for journals and entries, Storage for media. ### Pages & layout 1. **Landing**: transparent nav; centered title and tagline over a vertical gradient from warm grey to soft lavender; white and black pill buttons; a slowly drifting row of floating cards (notebooks, an insights card, entry excerpts with dates); thin divider; minimal footer. 2. **Home**: left sidebar listing notebooks with colour dots and counts, "New journal", Insights and Calendar links; main pane shows entries grouped by month with a search field. 3. **Editor**: large date header, optional prompt banner with shuffle and dismiss, title field, distraction-free editor with a floating formatting toolbar, "Saved" indicator. 4. **Insights**: current and longest streak, this month / this year toggle, entries, words and days journaled, bar chart by day or month. 5. **Media calendar**: month grid with thumbnails on days that have media; selecting a day lists its photos and videos. 6. **Settings**: profile, export all entries (Markdown/JSON), delete account. 7. `/demo` with seeded fictional entries. ### Design system Light, soft. Tokens: `--background: #ffffff`, `--hero-from: #e8e4df`, `--hero-to: #9088cc`, `--card: #ffffff`, `--foreground: #1e1d28`, `--muted-foreground: #5b5a68`, `--accent: #a77ce8`, `--border: #e6e4ee`; notebook colours from a set of eight muted hues. Fonts: Inclusive Sans Display 600 for headings (tight -0.06em), Inclusive Sans 400 body with 1.7 line height in the editor; optionally Newsreader for entry text. Scale 14/16/18/24/40. Radius 16px cards, pills for buttons. Shadow `0 10px 30px rgb(30 29 40 / .08)`. Motion: card drift 40s linear loop, UI 200ms ease-out. The insights card uses the accent as a fill with ink `#1e1d28` text, never white. Add `--input-border: #8e8c9c` for editor fields and search. ### Components & interactions Editor states: empty with placeholder prompt, typing, saving, saved, offline (queued). Notebook cards: hover lift, active outline. Image insertion shows upload progress and failure retry. Search shows "no entries match" state. Deleting a notebook requires typing its name. ### Data & state Journal(name, color, icon, position), Entry(entry_date, title, content, word_count), Media(path, kind, taken_on), Prompt. Streaks are derived from distinct entry dates in the user's timezone. Editor content syncs through Yjs updates persisted to Postgres. Seed a demo with three notebooks and a dozen invented entries. ### Accessibility Editor toolbar buttons have labels and `aria-pressed`. Landing marquee pauses on hover/focus and stops under reduced motion; cards are decorative duplicates hidden from screen readers. Dark ink text on the lavender footer area is verified at 4.5:1 or better. Calendar days announce media counts. All media require alt text prompts. Type: body 16px+, line height 1.5+, max ~70ch, nothing under 12px. Verified contrast: body text #1e1d28 on #ffffff = 16.65:1; muted text #5b5a68 on #ffffff = 6.76:1; ink text #1e1d28 on #e8e4df = 13.15:1; ink text #1e1d28 on #9088cc = 5.22:1. ### Security Journals are highly personal: RLS on every table restricted to `user_id = auth.uid()`; the storage bucket is private with signed URLs. Sanitize rendered rich text (DOMPurify) when showing excerpts. Media uploads limited to images/video under 20 MB with type checks. No analytics on entry content; never send entries to third parties. Offer full export and hard delete. ### Performance & SEO Lazy-load the editor and charts; paginate entries by month. Compress thumbnails server-side or generate smaller renditions. Landing meta/OG; app `noindex`. ### Guardrails - Original prompts and sample entries; no real people. - Don't collect more than an email and display name. - Typed components, no `any`, visible errors. - Done when: a user can create two notebooks and write entries that autosave; prompts shuffle; streaks compute correctly across timezone boundaries; media appear on the calendar; another account cannot read any entry.