Template
RoundUp
A directory of recently funded startups with faceted filtering by category, funding stage and amount, plus a startup news section and a 'today's funding' feed. Admins manage companies, rounds and articles through a role-protected panel. It serves investors, job seekers and founders scanning the funding landscape.
Startup funding directory and newsroom · App · Small tools and apps · full-stack app (auth + DB)
Who it is for
- Angel investors and VCs scouting deals
- Job seekers targeting freshly funded companies
- Founders researching competitors
- Startup journalists and newsletter writers
Layout
- Header: yellow-dot logo + name left, wide rounded search field center, outlined 'Startup News', black 'Today's Funding' and yellow 'Sign In' pills right
- Page title 'Discover Funded Startups' with subtitle
- Two-column: pale blue-grey rounded filter sidebar (Categories radios, Funding Stage radios, Max Funding log slider, Clear) and results area with count + sort dropdown
- Results list of startup cards (empty state with funnel icon and Reset Filters shown)
- Startup detail with funding rounds and investors
- News list and article pages
- Admin panel with resizable panels for CRUD and publishing workflow
Palette
Clean, utilitarian, energetic, data-forward, approachable. A bright, no-nonsense research tool.
- background
#ffffff - text / primary
#121417 - accent yellow
#ffd129 - sidebar surface
#f1f5fb - border / muted
#d2d8e4 - secondary text
#5f6773 - input border
#7c8db0
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 18.45:1 | 4.5:1 |
| Aa | body text on sidebar surface | 16.86:1 | 4.5:1 |
| Aa | secondary text on background | 5.72:1 | 4.5:1 |
| Aa | secondary text on sidebar surface | 5.22:1 | 4.5:1 |
| Aa | white on black pill | 18.45:1 | 4.5:1 |
| Aa | near-black text on yellow accent | 12.66:1 | 4.5:1 |
| input/radio border on background | 3.34:1 | 3:1 | |
| input/radio border on sidebar surface | 3.05:1 | 3:1 | |
| focus ring on background | 18.45:1 | 3:1 | |
| Aa | dark theme: text on base | 15.69:1 | 4.5:1 |
| Aa | dark theme: muted text on base | 7.41:1 | 4.5:1 |
| dark theme: yellow accent on base | 12.96: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
- Display
- System SF Pro Display 600, 40px page title (the system face is not on Google Fonts; a vibld project loads Inter)
- Body
- SF Pro/system 16px, 15px in dense lists (SF Pro is not on Google Fonts; a vibld project loads Inter)
System font stack for a native, utilitarian data-app feel; yellow accent gives brand energy
Spacing and imagery
Full-width with 32px gutters, 240px sidebar, compact 24px-row filter lists; 8px radius, pill buttons; minimal shadows
Company logos in cards; empty-state line icons; charts for funding totals; no photography.
Components
- Global search input
- Pill nav buttons
- Collapsible filter sections
- Radio filter lists
- Logarithmic range slider
- Sort dropdown (6 options)
- Startup card (logo, name, category, stage, amount, date)
- Empty state with reset
- Skeleton loaders
- Funding round table with investors
- News article card
- Admin CRUD tables with status workflow
- Resizable admin panels
- Toasts
Interactions
- Live search across names and descriptions
- Filters combine instantly with result count
- Log-scale slider snapping to meaningful amounts
- Sort switching
- Skeleton shimmer while loading
- Collapse/expand filter groups
- Admin draft→published status changes with toast
- Dark mode toggle
Data
Startup{id, name, slug, logo_url, description, category, website, hq, founded_year, total_funding}FundingRound{id, startup_id, stage, amount_usd, announced_on, lead_investor, investors[]}Article{id, title, slug, body, cover_url, status(draft|published), published_at, author_id}Profile{id, role(admin|editor|user)}
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 **RoundUp**, a searchable directory of recently funded startups with a small newsroom. Visitors filter companies by sector, stage and size of raise, sort results, and open profiles listing every round and investor; a "Today" feed shows the latest announcements. Editors publish news and maintain records through an admin panel. The job: answer "who just raised, how much, from whom" in seconds.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react. TanStack Query for queries and caching; react-hook-form + zod for admin forms; Recharts for sector/stage totals; react-resizable-panels for the admin workspace; Sonner for toasts; date-fns for dates; Embla for a featured-rounds carousel. Supabase: Postgres (startups, rounds, articles), Auth with roles, optional Edge Function to import rounds from an external feed.
### Pages & layout
1. **Discover** – header (logo dot + name, wide rounded search, pill links: News, Today, Sign in). Title and subtitle. Left rounded sidebar: category list, stage list, max-funding slider on a log scale ($0–$100M+), Clear. Right: "N startups" + sort select (newest/oldest, amount high/low, A–Z/Z–A), card list or grid, pagination.
2. **Startup profile** – logo, description, sector/stage tags, totals, rounds table with investors, related news.
3. **Today's Funding** – chronological feed grouped by hour/day.
4. **News** – article list and article page.
5. **Admin** – resizable panes: list ↔ editor; startups, rounds, articles with draft/published status; users & roles.
### Design system
`--background: #ffffff`, `--foreground: #121417`, `--primary: #121417`, `--accent: #ffd129`, `--surface: #f1f5fb`, `--border: #d2d8e4`, `--muted-foreground: #5f6773`, `--input-border: #7c8db0` (`--border` stays for decorative card outlines). Font: Inter or system stack; 40px/600 page title, 16px/600 section, 16px body, 15px dense list rows, 12px minimum for meta; line-height 1.5. Spacing 4-pt, 24px card padding. Radius 8px, pills for nav buttons and search. Shadows none except menus. Motion 150ms; skeleton shimmer 1.2s. Provide dark theme (#0f1115 base, #e8eaee text, #9aa3b0 muted, yellow accent unchanged).
### Components & interactions
SearchInput (debounced 250ms, clear), FilterGroup (collapsible, count badges), LogSlider (formatted "$2.5M", keyboard steps), SortSelect, StartupCard (hover border darken), Skeletons, EmptyState ("No startups match" + Reset), RoundsTable, ArticleCard, AdminTable (sortable, bulk status), StatusBadge (draft/published), Toasts for save success/error.
### Data & state
`startups`, `funding_rounds` (FK), `articles`, `profiles(role)`. Filters, sort and search mirrored in URL params. Server-side filtering via Postgres queries with indexes on category, stage, amount, announced_on. Seed ~60 fictional startups and ~100 rounds with invented investor names.
### Accessibility
Filters are fieldsets with legends; radio/checkbox groups labeled. Slider has `aria-valuetext` in currency. Result count announced via `aria-live` after filtering. Yellow #ffd129 buttons use near-black text (≥ 12:1); never yellow text on white. Visible focus rings; skip-link to results. Tables have header scopes. Verified contrast: body text #121417 on #ffffff = 18.4:1; secondary text #5f6773 on #ffffff = 5.7:1; white #ffffff on #121417 = 18.4:1; near-black text #121417 on #ffd129 = 12.6:1; dark theme: text #e8eaee on #0f1115 = 15.6:1.
### Security
RLS: public read for published startups/rounds/articles; write restricted to `role in ('admin','editor')`; role changes admin-only. Validate admin input with zod client-side and DB constraints (amount ≥ 0, valid URL). Sanitize article HTML/markdown with DOMPurify; external links `rel="noopener noreferrer"`. Import Edge Function keeps third-party API keys server-side and is admin-invoked only.
### Performance & SEO
Paginate or infinite-scroll 24 at a time; lazy-load logos. Server queries use indexes. Startup and article pages get meta/OG tags and semantic headings; generate sitemap. Lighthouse 90+.
### Guardrails
- Fictional companies, investors and amounts only; no real logos.
- No invented quotes attributed to real people.
- Store no personal data beyond admin accounts.
- Typed small components, no `any`, visible errors and empty states.
- Done when: combining category + stage + amount + search returns correct results with URL persistence, all six sorts work, profiles show rounds, an editor can publish an article, and a regular user cannot write.