HiCyou is a free, open-source directory platform designed to help you discover, organize, and submit useful tools and resources. Built on top of services like Vercel, Supabase, and Cloudflare R2, you can deploy your own link directory / resource hub at essentially zero cost — perfect for aggregating quality links, driving traffic to your main site, or showcasing curated resources.
HiCyou is ideal for indie developers, site owners, and teams who want to quickly spin up a “tool library / resource library” style site. You can use it to display and collect links yourself, or open it up for user submissions to build a continuously updated, high-quality directory.
Example use cases:
- Build a niche industry directory
- e.g. AI tools directory, indie-hacker resources, designer tool collections, etc.
- Organize by industry, function, tags, etc., to make browsing fast and intuitive for you and your users.
- Boost your domain’s DR / DA and other SEO metrics
- Use the directory as a “resource hub” for your main site or other projects.
- Thoughtful internal/external linking can help improve domain authority — useful for domain resale or managing a portfolio of sites.
- Create a personal / team resource center
- Centralize commonly used tools, internal systems, and documentation links.
- New teammates or partners can get all important links in one place.
- Publicly showcase curated tools and sites
- Use it as a “recommended resources” sub-site for your blog, personal homepage, or brand website.
- A curated resource list can improve perceived expertise and trust.
Prerequisites
Before you start, make sure you have the following:
- Code repository – If you forked this project, ensure the repo exists under your GitHub account.
- Vercel account – For hosting the frontend and API.
- Supabase account – For the PostgreSQL database and Auth.
- Cloudflare account – For R2 object storage (to store images).
Step 1: Configure Supabase (Database & Auth)
For a more detailed walkthrough with screenshots, see:
Supabase Guide: Set Up a Database, Configure Auth, and Integrate Resend from Scratch
- Log in to the Supabase Dashboard and create a new project.
- Get your database connection string:
- Go to Project Settings -> Database.
- Under Connection string, copy the URI-style connection string. This will be your
DATABASE_URL. - Note: For production, it’s recommended to use the Connection Pooler (port
6543) for better connection management.
- Get your API keys:
- Go to Project Settings -> API Keys -> Legacy anon, service_role API keys.
- Copy the
anonpublic key →NEXT_PUBLIC_SUPABASE_ANON_KEY. - Copy the
service_rolesecret key →SUPABASE_SERVICE_ROLE_KEY. - Copy the Project URL →
NEXT_PUBLIC_SUPABASE_URL.
Step 2: Configure Cloudflare R2 (Image Storage)
For a more detailed step-by-step guide, see:
Cloudflare R2 Guide: Free 10GB Storage, Free Egress, and S3-Compatible API Keys
- Log in to the Cloudflare Dashboard.
- In the left sidebar, go to R2.
- Create a bucket:
- Click “Create bucket”, choose a name (e.g.
hicyou-assets), and select “Automatic” or a region close to your target users. - Save this as
R2_BUCKET_NAME.
- Click “Create bucket”, choose a name (e.g.
- Configure public access:
- Open the bucket you just created, go to “Settings” -> “Public Access”.
- You can either bind a custom domain (recommended) or use an
r2.devsubdomain. - Save the public base URL — this will be your
R2_PUBLIC_URL.
- Create an API token:
- Go back to the main R2 page and click “Manage R2 API Tokens” on the right.
- Click “Create API token”.
- For permissions, choose Object Read & Write.
- After creating, note the following values:
Access Key ID→R2_ACCESS_KEY_IDSecret Access Key→R2_SECRET_ACCESS_KEYEndpoint– e.g.https://<ACCOUNT_ID>.r2.cloudflarestorage.com- You only need the
<ACCOUNT_ID>part forR2_ACCOUNT_ID.
- You only need the
Step 3: Local Configuration & Database Sync
Before deploying to Vercel, we’ll configure environment variables locally and sync the database schema and seed data to Supabase.
1. Set up local environment variables
- In the project root, copy the example env file:
cp .env.example .env - Open
.envand fill in your Supabase and Cloudflare R2 values, plus your AI-related keys if needed:# Supabase NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJh... SUPABASE_SERVICE_ROLE_KEY=eyJh... # Database (recommended: Connection Pooler on port 6543 with ?pgbouncer=true) DATABASE_URL="postgresql://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres?pgbouncer=true" # Cloudflare R2 R2_ACCOUNT_ID=... R2_ACCESS_KEY_ID=... R2_SECRET_ACCESS_KEY=... R2_BUCKET_NAME=... R2_PUBLIC_URL=...
Environment variable reference:
| Variable | Description |
|---|---|
| Database config | |
NEXT_PUBLIC_SUPABASE_URL | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase anon key |
SUPABASE_SERVICE_ROLE_KEY | Supabase service role key |
DATABASE_URL | Postgres connection string |
| Storage (R2) | |
R2_ACCOUNT_ID | Cloudflare account ID |
R2_ACCESS_KEY_ID | R2 access key |
R2_SECRET_ACCESS_KEY | R2 secret key |
R2_BUCKET_NAME | R2 bucket name |
R2_PUBLIC_URL | Public base URL for R2 assets |
R2_UPLOAD_DIR | Upload directory prefix (can keep default) |
R2_LOGO_DIR | Logo directory name (optional, default is fine) |
R2_COVER_DIR | Cover image directory name (optional, default is fine) |
| Site basics | |
NEXT_PUBLIC_SITE_URL | Production domain for your site |
NEXT_PUBLIC_SITE_NAME | Site name |
NEXT_PUBLIC_MAIL | Contact email |
NEXT_PUBLIC_Blog | Blog URL |
| Security & admin | |
ADMIN_EMAILS | Admin email addresses (comma-separated) |
CRON_SECRET | Secret for cron jobs (any long string; openssl rand -hex 32 works great) |
| Sponsor config (optional) | |
NEXT_PUBLIC_SPONSOR_IMAGE_URL | Sponsor image URL |
NEXT_PUBLIC_SPONSOR_LINK | Sponsor link URL |
NEXT_PUBLIC_SPONSOR_TEXT | Sponsor text |
| Other (optional) | |
EXASEARCH_API_KEY | Exa search API key |
NEXT_PUBLIC_TURNSTILE_SITE_KEY | Cloudflare Turnstile site key (default can be CF’s test key) |
TURNSTILE_SECRET_KEY | Cloudflare Turnstile secret key |
| AI config (optional) | Chinese providers like Qwen, DeepSeek, Kimi are supported |
AI_API_KEY | API key for your AI provider |
AI_BASE_URL | Base URL for the AI API |
AI_MODEL | Model name |
2. Run database migrations (Schema Migration)
This will create all required tables and database structures in Supabase.
# Push migrations to the remote database
pnpm db:migrate
3. Seed initial data
This step inserts default categories and sample data so you have something to look at right away.
# Run the seed script
pnpm db:seed
Step 4: Vercel Setup & Deployment


- Log in to the Vercel Dashboard.
- Click “Add New…” -> “Project”.
- Select your GitHub repository and click “Import”.
- Framework Preset: Vercel should auto-detect this as Next.js — no need to change it.
- Environment Variables (critical step): Expand the Environment Variables section and copy over everything from your local
.envinto Vercel’s env vars. - Click “Deploy”.
Step 5: Post-Deployment Checks
- Wait for the build to finish: Vercel will run
next buildautomatically. - Check the homepage: Open the assigned domain and make sure the homepage loads correctly.
- Validate database reads: Browse categories and detail pages to confirm data is loading from the database (since you ran the seed step, you should already see data).
- Check Auth: Click Login and verify that Supabase Auth works. Make sure you’ve added your production domain as a redirect URL in Supabase Auth settings.
- Test image uploads: Log in with an admin account, submit a new tool, and confirm that image uploads to R2 are working.
- Cron Jobs: In your Vercel project, go to Project Settings -> Cron Jobs and verify that scheduled tasks are configured as expected.
FAQ
- Supabase Auth redirects to the wrong URL after login Make sure you’ve added your Vercel domain under Authentication -> URL Configuration -> Site URL / Redirect URLs in the Supabase dashboard.
- Image upload fails
- Check that your R2 API token has Write permissions.
- Confirm that
R2_PUBLIC_URLis correct and publicly accessible.
- Database connection errors
- If you’re using the Connection Pooler (port
6543), ensure yourDATABASE_URLincludes?pgbouncer=true.
- If you’re using the Connection Pooler (port
- Local development
- Before starting local dev, make sure
DATABASE_URLin.envcan connect successfully. - Then run:
pnpm dev
- Before starting local dev, make sure
Good luck with your deployment — and enjoy running your own open-source directory powered by HiCyou!
0