ViteReactCorporate Website

crowdup — Vite Business Template

By design-sparx

CrowdUp is an open-source crowdfunding platform template built on React Router, Supabase and Stripe Connect, supporting campaign creation, donations and an admin dashboard.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

2 previews
Desktop homepage1 / 2
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 2

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-17View source

What stands out

A quick read of the recorded project description.

01

Campaign management: create, edit and publish crowdfunding campaigns with rich-text stories, cover images, funding goals, deadlines and categories, with browsing and filtering, updates and campaign closing

02

Direct Stripe Connect payments: organizers connect their own Stripe accounts, donations are charged directly to those accounts, the platform does not hold funds, and an optional platform fee is available

03

Supabase auth and data: email/password sign-in, password reset, optional Google sign-in, Postgres row-level security, Auth and Storage

04

Admin dashboard: report handling, campaign and user suspension (with reasons and audit records), an approval queue, and automatic or manual approval publishing modes

05

Server-side rendering: React Router framework-mode SSR, with real 404 statuses and per-route meta tags

06

Abuse reporting and legal templates: anyone can report a live campaign, subject to rate limiting, with adjustable terms of service, privacy and security page templates

Template Details

CrowdUp is a self-hostable crowdfunding platform aimed at personal projects, charities and NGOs. Organizers can create, edit and publish campaigns with rich-text stories, cover images, funding goals, deadlines and categories, and the public site supports browsing and filtering; campaign owners can post plain-text updates and close a campaign. Donations go through Stripe Connect (Standard) directly into the organizer's own Stripe account, so the platform does not hold funds and can optionally charge a platform fee. Authentication is based on Supabase Auth, with email/password, password reset and optional Google sign-in. The admin dashboard provides report handling, campaign and user suspension (with reasons and audit records) and an approval queue; PUBLISHING_MODE switches between automatic publishing and manual approval. Anyone can report a live campaign, subject to rate limiting. The app is server-rendered and provides real 404 statuses and per-route meta tags. The README also lists several limitations: Stripe Connect is not available in all countries; database tests, Playwright tests and the Stripe and Supabase flows have not been run against real services; v1 does not send application emails such as donation receipts or organizer notifications; each campaign supports only one currency; the report rate limit is kept in memory; in approval mode the database itself is not aware of the publishing mode; the search drawer fields are not wired to data, and the homepage testimonials and footer links come from static JSON; the legal pages are templates only and need review by a lawyer. The README also states that there is currently no public demo site, and that screenshots and a demo GIF have not yet been provided.

ViteReactCorporate website

Is it right for your project?

Use Cases

  • Building a self-hosted crowdfunding site for personal projects, charities or NGOs
  • Fundraising where donations go directly to the organizer's Stripe account and the platform does not hold funds
  • Operating a crowdfunding platform that needs campaign review, report handling and user management
  • Prototyping or internally testing a server-rendered crowdfunding app deployed on Supabase and Netlify

Suitable For

  • Development teams or operators who want to deploy their own crowdfunding platform and connect Stripe Connect
  • Users of open-source projects who need a reference for the full campaign publishing, donation and admin dashboard flow
  • Technical teams using Supabase for database and authentication and Netlify for hosting

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Local development requires Node.js current LTS, pnpm 9, Docker and the Supabase CLI; run pnpm install, supabase start, supabase db reset, configure .env, then run pnpm dev

  2. 2

    Seed data includes sample campaigns and users but does not set passwords; register your own account and set the profile role to admin via SQL to gain admin access

  3. 3

    Donations require Stripe test keys; see docs/stripe.md for configuration and docs/self-hosting.md for full deployment steps

  4. 4

    The Netlify deploy button clones the repository and prompts for environment variables, but the README notes that deploying a fresh fork with this button has not been verified, and it does not create a Supabase project or Stripe webhook

  5. 5

    The README states that database tests, Playwright tests and the Stripe and Supabase flows have not been run against real services; treat a first deployment as a test

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This listing covers the free version under the MIT license in the public repository; the free scope is that version's code and does not mean external services or third-party assets are free.

Must comply with when using

  • You may use, modify, use commercially and distribute this version's code free of charge.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and liability limitations are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons and other third-party assets must be checked against their own licenses; the code's MIT license alone does not determine this.
  • External services such as domains, hosting, databases, payments or AI may incur separate charges.
  • Stripe Connect is not available in all countries; organizer and platform accounts must be in countries Stripe supports, so check Stripe's current list before choosing this stack.
  • Database tests, Playwright tests and the Stripe and Supabase flows have not been run against real services; treat a first deployment as a test.
  • v1 does not send application emails such as donation receipts or organizer notifications, only Supabase Auth emails; production requires custom SMTP configuration.
  • Each campaign supports only one currency, taken from the organizer's Stripe account and fixed once the campaign goes live; multi-currency and currency conversion are not supported.
  • The report rate limit is kept in memory, counted per server instance and reset on restart, so it has limited effect in serverless environments.
  • The database itself is not aware of the publishing mode; in approval mode, server-side code using the service role could still publish drafts directly if it errs.
  • Some UI is not wired to data: the search drawer fields do not work, and the homepage testimonials and footer links come from static JSON in src/data/.
  • The legal pages are templates only and must be reviewed by a lawyer before use.
  • Sample users in the seed data have no passwords set; register your own account and set the profile role to admin via SQL to gain admin access.
  • Donations require Stripe test keys; see docs/stripe.md for configuration.
  • The Netlify deploy button has not been verified to successfully deploy a fresh fork, and it does not create a Supabase project or Stripe webhook, which must be done manually first.
  • There is currently no public demo site; the demo link in the README is still a to-do placeholder.
  • Screenshots and a demo GIF have not yet been provided and are marked as coming soon in the README.
  • Local development requires Node.js current LTS, pnpm 9, Docker and the Supabase CLI to run the local database.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

- **Stripe Connect is not available in every country.** Organisers and the platform account must be in a [Stripe-supported country](https://stripe.com/global); Kenya is not a general Connect country at the time of writing. Check Stripe's current list before choosing this stack.

Original README

- **Nothing has been run against real services.** The database tests (`pnpm test:db`), the Playwright specs and the Stripe and Supabase flows were written without being executed against a database or Stripe; they first run when the CI workflows do. Treat your first deployment as a test.

Original README

- **No application emails in v1.** Only Supabase Auth emails (confirmation, password reset) are sent. There are no donation receipts or organiser notifications. Production needs custom SMTP ([guide](docs/self-hosting.md#1-supabase-project)).

Original README

- **One currency per campaign**, taken from the organiser's Stripe account when the campaign goes live and fixed afterwards. No multi-currency campaigns or conversion.

Original README

- **Report rate limit is in memory:** per server instance and reset on restart; on serverless it is a speed bump ([docs/reports.md](docs/reports.md)).

Original README

- **The database is not publishing-mode aware:** in `approval` mode, server code running with the service role could still publish a draft directly if app code were wrong ([docs/moderation.md](docs/moderation.md)).

Original README

- **Some UI is not wired to data:** the search drawer fields do nothing, and home-page testimonials and footer links come from static JSON in `src/data/`.

Original README

- **Legal pages are templates** and must be reviewed by a lawyer ([docs/operators-legal.md](docs/operators-legal.md)).

Original README

The seed creates sample campaigns and users (`admin@`, `amara@`, `liam@`, `sam@`, `dana@` at `crowdup.example`) but sets no passwords, so sign up with your own account. To make it an admin, run `update public.profile set role = 'admin' where id = '<your user id>';` in Studio or `psql`. Donations need Stripe test keys: see [docs/stripe.md](docs/stripe.md). Every environment variable is listed in [docs/self-hosting.md](docs/self-hosting.md#environment-variables).

Original README

The seed creates sample campaigns and users (`admin@`, `amara@`, `liam@`, `sam@`, `dana@` at `crowdup.example`) but sets no passwords, so sign up with your own account. To make it an admin, run `update public.profile set role = 'admin' where id = '<your user id>';` in Studio or `psql`. Donations need Stripe test keys: see [docs/stripe.md](docs/stripe.md). Every environment variable is listed in [docs/self-hosting.md](docs/self-hosting.md#environment-variables).

Original README

The button clones the repository into your Netlify account and, through the `[template.environment]` section of `netlify.toml`, prompts for the required variable names. **Deploying a fresh fork through this button has not been verified.** It does not create the Supabase project or the Stripe webhook; do those first as described in the guide.

Original README

**Live demo:** TODO(ticket 24): add the demo URL once the operator has deployed it (see [docs/demo.md](docs/demo.md)). There is no public demo yet.

Original README

**Screenshots coming soon.** A demo GIF will be added here once a running instance exists.

Original README

Requirements: Node.js (current LTS), pnpm 9 (`corepack enable`), Docker and the [Supabase CLI](https://supabase.com/docs/guides/local-development) for the local database.

Original README
https://github.com/design-sparx/crowdup/blob/main/LICENSEhttps://github.com/design-sparx/crowdup/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-17. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 92 / 100
Technologies
Vite · React
Website type
Corporate Website
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-10-17
Screenshot last checked
2026-10-17

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Vite as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: codex-user-requested-batch-review-20261018 · 2026-10-18

Inspect the recorded source material

SHA-256: d4560188644adafbfd8d6d11ab5b1ca4313fe58d06d16b7f62027d845c1ad82b

2026-10-17T09:58:30.462Z

Source file / repository
# CrowdUp

[![CI](https://github.com/design-sparx/crowdup/actions/workflows/ci.yml/badge.svg)](https://github.com/design-sparx/crowdup/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

An open-source, self-hostable crowdfunding platform for personal projects, charities and NGOs. Organisers publish campaigns and receive donations straight into their own Stripe account; you run the platform on Supabase and Netlify.

**Live demo:** TODO(ticket 24): add the demo URL once the operator has deployed it (see [docs/demo.md](docs/demo.md)). There is no public demo yet.

<!-- PLACEHOLDER: screenshots and a demo GIF could not be produced in the repository tooling. A maintainer should add them under docs/images/ and link them here. -->
**Screenshots coming soon.** A demo GIF will be added here once a running instance exists.

## Features

What is built today (see [Known limitations](#known-limitations) for what is not):

- **Campaigns:** create, edit and publish campaigns with a rich-text story, cover image, goal, end date and category. Browse and filter on the public site. Owners can post plain-text updates and close campaigns.
- **Donations only:** no rewards, perks or equity. Donors can give as guests or signed in, anonymously if they wish. Signed-in donors get a donation history.
- **Stripe Connect (Standard), direct charges:** each organiser connects their own Stripe account and donations are charged on it. The platform never holds funds. An optional platform fee (`PLATFORM_FEE_PERCENT`, default 0) can be taken. See [docs/stripe.md](docs/stripe.md).
- **Auth:** email and password with password reset, optional Google sign-in, via Supabase Auth.
- **Admin area:** `/admin` for reports, campaign and user suspension (with reasons and an audit trail) and the approval queue. See [docs/moderation.md](docs/moderation.md) and [docs/reports.md](docs/reports.md).
- **Approval mode:** `PUBLISHING_MODE=approval` holds new campaigns for an administrator to approve or reject. The default `auto` publishes once the organiser has finished Stripe onboarding.
- **Abuse reporting:** anyone can report a live campaign, with rate limiting.
- **Legal templates:** Terms, Privacy and Security pages to adapt ([docs/operators-legal.md](docs/operators-legal.md)). Not legal advice.
- **Demo mode:** an optional banner, demo accounts and a guarded scheduled reset for a public demo ([docs/demo.md](docs/demo.md)).
- **Server-rendered**, with real 404 status and per-route meta tags.

## Tech stack

- [React Router 8](https://reactrouter.com/) framework mode (SSR), React 19, TypeScript 6, Vite 8
- [Mantine 9](https://mantine.dev/), Tiptap editor, ApexCharts
- [Supabase](https://supabase.com/): Postgres with row-level security, Auth, Storage
- [Stripe](https://stripe.com/) Connect
- Netlify (SSR via `@netlify/vite-plugin-react-router`)
- Vitest, Playwright, pgTAP; pnpm

## Architecture

```mermaid
flowchart LR
    Browser -->|HTML and form posts| App["React Router SSR app (Netlify)"]
    App -->|user session, RLS| DB[(Supabase: Postgres, Auth, Storage)]
    App -->|service role: publish drafts, record donations| DB
    App -->|Connect onboarding, Checkout Sessions| Stripe
    Stripe -->|webhook /api/stripe/webhook| App
    Browser -->|hosted Checkout| Stripe
```

Loaders and actions run on the server and read configuration from `process.env`; nothing is exposed to the browser. A map of the code is in [AGENTS.md](AGENTS.md).

## Quick start (local development)

Requirements: Node.js (current LTS), pnpm 9 (`corepack enable`), Docker and the [Supabase CLI](https://supabase.com/docs/guides/local-development) for the local database.

```sh
git clone https://github.com/design-sparx/crowdup.git
cd crowdup
pnpm install
supabase start        # local Postgres, Auth and Storage; applies migrations
supabase db reset     # re-applies migrations and loads supabase/seed.sql sample data
cp .env.example .env  # fill SUPABASE_ANON_KEY and SUPABASE_SERVICE_ROLE_KEY from `supabase status`
pnpm dev              # http://localhost:5173
```

The seed creates sample campaigns and users (`admin@`, `amara@`, `liam@`, `sam@`, `dana@` at `crowdup.example`) but sets no passwords, so sign up with your own account. To make it an admin, run `update public.profile set role = 'admin' where id = '<your user id>';` in Studio or `psql`. Donations need Stripe test keys: see [docs/stripe.md](docs/stripe.md). Every environment variable is listed in [docs/self-hosting.md](docs/self-hosting.md#environment-variables).

## Scripts

| Script | What it does |
| --- | --- |
| `pnpm dev` | React Router dev server |
| `pnpm build` | typegen, `tsc`, production build |
| `pnpm lint` | ESLint, zero warnings allowed |
| `pnpm test` | Vitest unit tests |
| `pnpm test:db` | `supabase db reset` then pgTAP tests (needs local Supabase) |
| `pnpm test:e2e` | Playwright against the production build (build first; needs local Supabase) |
| `pnpm preview` | Serve `build/client` with Vite |

## Deploy and self-host

Follow [docs/self-hosting.md](docs/self-hosting.md): Supabase project, Stripe, Netlify and every environment variable.

[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/design-sparx/crowdup)

The button clones the repository into your Netlify account and, through the `[template.environment]` section of `netlify.toml`, prompts for the required variable names. **Deploying a fresh fork through this button has not been verified.** It does not create the Supabase project or the Stripe webhook; do those first as described in the guide.

## Documentation

See the [docs index](docs/README.md).

## Known limitations

- **Stripe Connect is not available in every country.** Organisers and the platform account must be in a [Stripe-supported country](https://stripe.com/global); Kenya is not a general Connect country at the time of writing. Check Stripe's current list before choosing this stack.
- **Nothing has been run against real services.** The database tests (`pnpm test:db`), the Playwright specs and the Stripe and Supabase flows were written without being executed against a database or Stripe; they first run when the CI workflows do. Treat your first deployment as a test.
- **No application emails in v1.** Only Supabase Auth emails (confirmation, password reset) are sent. There are no donation receipts or organiser notifications. Production needs custom SMTP ([guide](docs/self-hosting.md#1-supabase-project)).
- **One currency per campaign**, taken from the organiser's Stripe account when the campaign goes live and fixed afterwards. No multi-currency campaigns or conversion.
- **Report rate limit is in memory:** per server instance and reset on restart; on serverless it is a speed bump ([docs/reports.md](docs/reports.md)).
- **The database is not publishing-mode aware:** in `approval` mode, server code running with the service role could still publish a draft directly if app code were wrong ([docs/moderation.md](docs/moderation.md)).
- **Some UI is not wired to data:** the search drawer fields do nothing, and home-page testimonials and footer links come from static JSON in `src/data/`.
- **Legal pages are templates** and must be reviewed by a lawyer ([docs/operators-legal.md](docs/operators-legal.md)).

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md), including [good first issue ideas](docs/good-first-issues.md). Report security issues privately as described in [SECURITY.md](SECURITY.md).

## License

MIT. See [LICENSE](LICENSE).
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.