Create a music artist's Jovie profile from a Spotify URL and read public artist data.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y @jovie/cli
MCP client config
{
"mcpServers": {
"jovie": {
"command": "npx",
"args": [
"-y",
"@jovie/cli"
]
}
}
}A modern artist profile and link-in-bio platform built with Next.js, Clerk authentication, Neon PostgreSQL, and Drizzle ORM.
Jovie tracks OpenSSF security posture in-repository and is working toward an OpenSSF Best Practices badge.
docs/security/OPENSSF_BEST_PRACTICES.mddocs/security/CII_BADGE_SUBMISSION_CHECKLIST.mdSECURITY.mdMaintainers: once bestpractices.dev enrollment is complete, add the issued badge URL and project ID here.
Jovie uses a modern, secure stack designed for scalability, type safety, and exceptional developer experience:
turbo docs CLI@statsig/statsig-node-core - Server SDK used by apps/web/lib/flags/statsig.tsflags - App flag registry and bootstrap payloads for client consumersrg) for local agent and search toolingClone the repository
git clone https://github.com/JovieInc/Jovie.git
cd Jovie
Bootstrap the workspace
./scripts/setup.sh
This verifies the required Node/pnpm/ripgrep tooling, installs dependencies when package manifests changed, and checks Doppler access.
On supported macOS and Debian/Ubuntu systems it will attempt to install ripgrep automatically. If auto-install is unavailable, use:
brew install ripgrep # macOS
sudo apt-get install -y ripgrep # Ubuntu/Debian
From the repo root, use the root wrappers for the canonical internal workflow:
pnpm run db:web:migrate
pnpm run dev:web:fast
pnpm run benchmark:dev
pnpm run test:web
pnpm run dev:web:browse
pnpm run dev:web:fast is the daily coding loop. It pins Doppler to jovie-web/dev, enables the local test-auth bypass, disables local Sentry initialization unless JOVIE_ENABLE_LOCAL_SENTRY=1, uses PORT=3100 by default, and prewarms /, /app, and /api/health/build-info after the server is ready.
Useful local speed toggles:
JOVIE_DEV_RESET_NEXT_CACHE=1 ./scripts/setup.sh
JOVIE_DEV_SYNC_CLERK_IDS=1 ./scripts/setup.sh
JOVIE_ENABLE_LOCAL_SENTRY=1 pnpm run dev:web:fast
JOVIE_DEV_RESET_NEXT_CACHE=1 pnpm run benchmark:dev
For authenticated local browser QA, open the dashboard-ready persona:
/api/dev/test-auth/enter?persona=creator-ready&redirect=/app/dashboard/earnings
Set up Doppler (Recommended)
Follow the Doppler setup guide:
# Install Doppler CLI
brew install dopplerhq/cli/doppler # macOS
# Authenticate
doppler login
# Configure project
doppler setup --project jovie-web --config dev
Manual Environment Setup (Non-Canonical Fallback)
Internal team and agent workflows should use Doppler plus the root wrapper commands above. Only use a manual .env.local flow if you explicitly need to run outside the standard internal setup:
cp .env.example .env.local
# Edit .env.local with your credentials
Run database migrations
pnpm run db:web:migrate
Start the development server
pnpm run dev:web:fast
Open http://localhost:3100 in your browser.
Jovie/
├── apps/
│ ├── web/ # Main Next.js application
│ └── should-i-make/ # Side project
├── packages/
│ └── ui/ # Shared UI components
├── drizzle/
│ ├── migrations/ # Database migrations (append-only)
│ └── migrations/_journal.json
└── docs/ # Documentation
# Check schema matches database
pnpm --filter=@jovie/web run drizzle:check
# Generate migrations from schema changes
pnpm --filter=@jovie/web run drizzle:generate
# Run migrations on main branch
pnpm run db:web:migrate
# Open Drizzle Studio (database GUI)
pnpm run db:web:studio
# Note: Migrations are APPEND-ONLY - never modify existing migrations
# Web app test suite with pinned Doppler scope
pnpm run test:web
# Changed web tests for quick local iteration
pnpm run test:web:changed
# Web smoke suite
pnpm run test:web:smoke
# Web E2E suite
pnpm run test:web:e2e
# Workspace-wide fast unit tests
pnpm test:fast
# Fast web typecheck for local iteration
pnpm run typecheck:web:fast
# Type checking
pnpm typecheck
# Linting (Biome)
pnpm lint
pnpm lint:fix
# Code formatting (Biome)
pnpm format
pnpm format:check
# Tailwind CSS check
pnpm tailwind:check
# Dev server ready, first-route compile, and warm-route timing
pnpm run benchmark:dev
# Search Turborepo docs from terminal (2.8+)
turbo docs "task configuration"
# Run only affected packages with local-read/remote-read Turbo cache policy
pnpm run build -- --affected
pnpm run test -- --affected
# Verify local remote-cache reads
pnpm run turbo:verify-cache
# Preview task execution plan without running
pnpm run build -- --dry
# Reduce memory pressure for tests (OOM fix)
pnpm run test -- --concurrency=1
Git worktrees enable parallel agent work with shared Turbo cache (2.8+):
# Create a worktree for parallel work
git worktree add ../Jovie-agent-1 -b agent/task-name
cd ../Jovie-agent-1 && ./scripts/setup.sh
# Work normally with the local remote-cache read policy
pnpm run build
# Clean up
git worktree remove ../Jovie-agent-1
The project uses trunk-based development:
jov.ie)See .github/workflows/README.md for workflow details.
All secrets are managed in Doppler with automatic sync to Vercel and GitHub Actions.
Environments:
dev - Local developmentstg - Staging/previewprd - ProductionCreate .env.local with the following:
# App
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Clerk Authentication
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# Neon Database
DATABASE_URL=postgresql://...
# Stripe Payments
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
# Statsig (server-side feature flags and experiments)
STATSIG_SERVER_SECRET=secret-...
# Sentry (Error Tracking)
SENTRY_AUTH_TOKEN=...
NEXT_PUBLIC_SENTRY_DSN=https://...
# Optional: Cloudinary (Media)
CLOUDINARY_CLOUD_NAME=...
CLOUDINARY_API_KEY=...
CLOUDINARY_API_SECRET=...
See .env.example for complete list.
mainEnvironments:
jov.ie (main branch)In CI/CD:
# Migrations run automatically in CI after merge to main
# See .github/workflows/ci.yml
Manual (Production):
export ALLOW_PROD_MIGRATIONS=true
doppler run --project jovie-web --config prd -- pnpm --filter @jovie/web run drizzle:migrate
users - User accounts (synced with Clerk)creator_profiles - Artist/creator profile datasocial_links - Social media and platform linksclick_events - Link click tracking and analyticstips - Payment records and transaction historynotification_subscriptions - Push notification preferencesAll tables use PostgreSQL RLS with Clerk JWT integration:
This project has evolved through several migrations:
Supabase → Neon + Clerk (2025)
Secrets Management (Dec 2025)
.env files → Doppler centralized secretsTrunk-Based Development (Dec 2025)
Internal team only. JovieInc/Jovie is a proprietary codebase made public solely to use GitHub Actions CI minutes on the free tier. External contributions are not accepted.
feat/your-feature or fix/your-bugfeat: - New featuresfix: - Bug fixeschore: - Maintenance tasksdocs: - Documentation updatespnpm run test:web && pnpm typecheckUse the hardened PR conflict handler in dry-run mode before touching stale PRs:
node scripts/pr-conflict-handler.mjs --dry-run --max-concurrent 2
It classifies open PRs as DIRTY, BEHIND, BLOCKED, UNSTABLE, or MERGEABLE, orders safe work by base-branch dependency and diff size, respects in-flight CI, and caps CI-heavy re-triggers for the Neon pool. See docs/pr-conflict-handler.md for apply-mode guardrails.
This project is proprietary and confidential. All rights reserved by Jovie Technology Inc.
See LICENSE for full terms. Unauthorized copying, distribution, or use of this software is strictly prohibited.
Note: This repository is public only to use GitHub Actions CI minutes on the free tier. It is not an open-source project. See docs/REPO-POLICY.md for the full public/private repo policy.
Jovie uses Calendar Versioning (YY.M.PATCH) tracked in version.json and mirrored to all workspace package.json files.
# Validate versioning integrity (calendar, workspace sync, changelog consistency)
pnpm version:check
Version bumps are stamped on the main/release path (pnpm version:stamp). Implementation PRs must not add or edit CHANGELOG.md; a user-visible change earns exactly one What's New bullet after land/runtime proof. Linear remains the source of record.
See source parity and the generated source map. Shared policy is pinned; local manifest, build, test and release instructions remain owned by this repository.