Skip to content

Repository files navigation

Solbrief

Solana-focused crypto news dashboard with AI-generated digests.

Prerequisites

  • Node.js 18+
  • pnpm
  • Cloudflare account
  • Neon database account
  • Clerk account
  • xAI (Grok) API key

Setup from Zero

1. Clone and Install

git clone <repo-url>
cd solbrief
pnpm install

2. Create Neon Database

  1. Go to neon.tech and create a project
  2. Copy the connection string (it includes ?sslmode=require)
  3. Save it for later

3. Create Clerk Application

  1. Go to clerk.com and create an application
  2. Get your Publishable Key (pk_test_...) and Secret Key (sk_test_...)
  3. In Clerk dashboard, add allowed origins:
    • http://localhost:5173 (local dev)
    • Your production URL later

4. Get xAI (Grok) API Key

  1. Go to x.ai console
  2. Create an API key with restricted permissions
  3. Set rate limits (recommended: 100k TPM, 60 RPM)

5. Setup Cloudflare Resources

Login to Cloudflare:

npx wrangler login

Create KV namespace:

npx wrangler kv:namespace create SOLBRIEF_KV

Copy the returned id and update apps/api/wrangler.toml:

[[kv_namespaces]]
binding = "SOLBRIEF_KV"
id = "your-kv-id-here"

Create Hyperdrive:

npx wrangler hyperdrive create solbrief-db --connection-string="your-neon-connection-string"

Copy the returned id and update apps/api/wrangler.toml:

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "your-hyperdrive-id-here"

6. Configure Environment Variables

apps/api/.dev.vars (local development):

CLERK_SECRET_KEY=sk_test_...
GROK_API_KEY=xai-...
DATABASE_URL=postgresql://...
CRON_SECRET=any-random-secret

apps/web/.env:

VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
VITE_API_URL=http://localhost:8787

7. Push Database Schema

pnpm --filter api run db:push

8. Run Locally

In two terminals:

# Terminal 1 - API
pnpm --filter api dev

# Terminal 2 - Web
pnpm --filter web dev

Visit http://localhost:5173

9. Generate Initial Digests

Trigger digest generation manually:

curl -X POST http://localhost:8787/cron/generate-digests \
  -H "Authorization: Bearer cronsecret"

Deployment

Deploy API (Cloudflare Workers)

Set secrets:

npx wrangler secret put CLERK_SECRET_KEY --name solbrief-api
npx wrangler secret put GROK_API_KEY --name solbrief-api
npx wrangler secret put CRON_SECRET --name solbrief-api  # Optional: only if using manual trigger

Deploy:

pnpm --filter api run deploy

Note your worker URL (e.g., https://solbrief-api.your-account.workers.dev)

Deploy Web (Cloudflare Pages)

Update apps/web/.env with production API URL:

VITE_API_URL=https://solbrief-api.your-account.workers.dev

Build and deploy:

pnpm --filter web run build
pnpm --filter web run deploy

Set environment variables in Cloudflare Pages dashboard:

  • VITE_CLERK_PUBLISHABLE_KEY
  • VITE_API_URL

Update Clerk Allowed Origins

Add your production URLs to Clerk dashboard allowed origins.

Tech Stack

  • Frontend: Vite + React + TypeScript + Tailwind CSS + Zustand + React Query
  • Backend: Cloudflare Workers + Hono
  • Auth: Clerk
  • Database: PostgreSQL on Neon + Drizzle ORM + Cloudflare Hyperdrive
  • Cache: Cloudflare KV
  • AI: Grok API (xAI)

Project Structure

solbrief/
├── apps/
│   ├── web/          # Vite + React SPA (Cloudflare Pages)
│   └── api/          # Hono API (Cloudflare Workers)
└── packages/
    └── shared/       # Shared types

Commands Reference

# Install
pnpm install

# Development
pnpm --filter web dev         # Frontend dev server (port 5173)
pnpm --filter api dev         # API dev server (port 8787)

# Database
pnpm --filter api run db:generate   # Generate migrations
pnpm --filter api run db:push       # Push schema to DB
pnpm --filter api run db:studio     # Open Drizzle Studio

# Deploy
pnpm --filter api run deploy        # Deploy API to Workers
pnpm --filter web run build         # Build frontend
pnpm --filter web run deploy        # Deploy to Pages

# Type checking
pnpm --filter api run typecheck
pnpm --filter web run typecheck

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages