Prompt Intelligence System
Your prompts, forever better.
EverPrompt transforms every prompt you write into a versioned, scored, improvable, and semantically searchable asset. It's not a notes app with AI bolted on -- it's a purpose-built Prompt Intelligence System with three souls:
- Intelligent Archive -- Store, organize, and version every prompt across projects, categories, and tags
- AI Critic -- Automatically score prompts on 10 quality dimensions, provide detailed judgment, and generate improved versions
- Semantic Retrieval Engine -- Find prompts by meaning (not just keywords) using hybrid search: structured filters + full-text + vector similarity
- Claude CLI Plugin -- include Claude CLI Plugin for automatic send prompt to everprompt with session contest e filters group.
The entire stack runs on Cloudflare's edge infrastructure: Workers, D1, Vectorize, Queues, R2, KV. The AI pipeline supports 4 LLM providers (Anthropic, OpenAI, OpenRouter, Workers AI) configurable at runtime.
- Features
- Screenshots
- Tech Stack
- Prerequisites
- Quick Start (Local Development)
- LLM Provider Configuration
- Project Structure
- Development Guide
- Deployment to Cloudflare
- Claude CLI Plugin Setup
- Environment Variables
- API Reference
- Architecture
- Troubleshooting
- License
Every prompt you save triggers an asynchronous AI analysis pipeline:
- Auto-title -- Generates a concise 5-10 word title
- Auto-abstract -- 1-2 sentence summary of the prompt's purpose
- Auto-categorization -- Suggests a category based on content
- Auto-tagging -- Generates tags with confidence scores across 8 kinds: topic, model, tone, task, quality, domain, language, technique
- Intent detection -- Classifies as code_generation, analysis, writing, brainstorming, debugging, planning, or other
- Complexity assessment -- Rates as simple, moderate, complex, or expert
Each prompt is scored on 10 dimensions (0-100):
| Dimension | Weight | What it measures |
|---|---|---|
| Clarity | 15% | Readable, linear, unambiguous |
| Context | 12% | Enough context, constraints, domain, objective |
| Specificity | 13% | Says exactly what it wants |
| Structure | 10% | Sections, bullets, input/output, examples |
| Reusability | 8% | Reusable or single-use |
| Actionability | 15% | Enables model to produce actionable output |
| Evaluation | 10% | Defines success/verification criteria |
| Safety | 5% | Avoids problematic or uncontrollable requests |
| Compression | 5% | Dense vs unnecessarily verbose |
| Toolability | 7% | Ready for tools, data, structured inputs |
Results in an overall score (weighted average) and quality band:
- A (85-100): Excellent, ready for direct use
- B (70-84): Good, improvable in specific areas
- C (50-69): Sufficient, needs revision
- D (0-49): Weak, rewrite recommended
Each review includes: verdict (1 sentence), strengths, weaknesses, recommended actions (checklist), and a complete improved version of the prompt.
Switch between AI providers from the Settings page or via API:
| Provider | Classify Model | Score Model | Auth | Cost |
|---|---|---|---|---|
| Anthropic (default) | claude-haiku-4-5 | claude-sonnet-4 | CLAUDE_API_KEY |
~$0.003/prompt |
| OpenAI | gpt-4o-mini | gpt-4o | OPENAI_API_KEY |
~$0.01/prompt |
| OpenRouter | claude-3.5-haiku | claude-sonnet-4 | OPENROUTER_API_KEY |
Varies |
| Workers AI | llama-3.1-8b | llama-3.1-70b | Free (CF AI binding) | Free |
Three layers combined with weighted scoring:
- Structured filters (D1 SQL) -- project, category, tags (AND/OR), status, quality band, score range, dates, flags
- Full-text keyword (D1 LIKE) -- search across title, abstract, body, tag names
- Semantic search (Vectorize) -- find prompts by meaning using 768-dim embeddings
Query DSL operators in the search box:
project:backend tag:architecture score>75 created:last30d microservices scalabili
| Operator | Example | Meaning |
|---|---|---|
project: |
project:backend |
Filter by project |
tag: |
tag:architecture |
Filter by tag |
cat: |
cat:engineering |
Filter by category |
score> score< |
score>80 |
Score range |
band: |
band:A |
Quality band |
lang: |
lang:it |
Language |
source: |
source:plugin |
Source |
is: |
is:favorite |
Flag filter |
has: |
has:improved |
Has improved version |
created: |
created:last30d |
Date range |
- 6 KPI cards: Total prompts, AI analyzed %, average score, created this month, duplicates, needs review
- 4 charts (Recharts): Creation per week (area), score distribution (bar), top projects (horizontal bar), quality trend (line)
- Widgets: Recent prompts, needs review (inbox + failed + low-score)
- Prompt body in code editor (Monaco) with line numbers, edit toggle, copy button
- AI Quality Review: overall bar + band badge, 10 dimension animated bars, verdict, strengths/weaknesses, recommended actions checklist
- Improved Version: diff viewer (unified/split), copy, apply as new version, re-generate
- Version history with kind labels (original, edited, improved_ai)
- Similar prompts via Vectorize (top 10 with similarity %)
- Notes (add, edit, delete)
- Projects -- group prompts by project with color and icon
- Categories -- hierarchical tree with parent/child relationships
- Tags -- 8 kinds (topic, model, tone, task, quality, domain, language, technique), AI-generated or manual, with usage counts
- Saved Searches -- save query + filters + sort as named views, pinnable in sidebar
Select multiple prompts and apply actions:
- Tag (add/remove)
- Move (change project/category)
- Favorite / Archive
- Re-analyze (re-run AI pipeline)
- Delete (with type-to-confirm safety dialog)
- Dark-first design inspired by Linear + Notion + Raycast
- 3-panel layout: resizable sidebars (left: navigation, right: browse/facets) with center content
- Grid/List view toggle for prompt cards
- Command palette (Cmd+K / Ctrl+K) for quick navigation and actions
- Keyboard shortcuts: J/K navigation, S=star, P=pin, E=edit, G+D=dashboard, and more
- Framer Motion animations: hover lift on cards, spring modals, staggered score bars, slide-up bulk bar
- Dark/Light theme with toggle
- Compact/Comfortable density toggle
- Sonner toast notifications
- Status bar: prompt count, pipeline status, D1 health
- Prompts captured from Claude CLI are automatically grouped by session
- Session names auto-generated by AI from the first prompt's content
- Sessions page in sidebar to browse and filter by session
- Session link shown in prompt detail view
- Automatic PII/credential detection on every prompt
- 60+ built-in regex patterns covering:
- AI/LLM keys (Anthropic, OpenAI, OpenRouter, Cohere)
- Cloud providers (AWS, Google Cloud, Azure)
- Git platforms (GitHub, GitLab tokens)
- Payment (Stripe, Square, credit cards)
- Communication (Slack, Discord webhooks)
- Database connection strings (MongoDB, PostgreSQL, MySQL, Redis)
- Cryptographic material (private keys, certificates, JWTs)
- SaaS platforms (SendGrid, Twilio, Vercel, Netlify, DigitalOcean, Heroku, npm, PyPI)
- Infrastructure (Docker, Kubernetes credentials)
- PII (SSN, IBAN, Italian Codice Fiscale)
- Passwords and secrets in config/env files
- Custom regex patterns configurable via Settings
- Privacy-first architecture: security scan runs before any AI analysis. Detected secrets are redacted with
***in the stored body, so sensitive data is never sent to external AI providers (Anthropic, OpenAI, etc.). The original prompt is preserved but the AI only ever sees the redacted version. - Security issues highlighted in prompt detail with severity badges
- Red shield icon on cards/rows for flagged prompts
- Dedicated "Security Issues" filter in sidebar with count badge
- Matched secrets are partially redacted in the UI (e.g.,
sk-an***..***f4aTw) for safe viewing
- Configurable auto-deletion of prompts older than N days (default: 6 months)
- Tag-based exclusions: prompts with specified tags are never auto-deleted
- Favorited and pinned prompts are always protected
- Daily scheduled run via Cloudflare Cron Triggers
- Preview before pruning: see exactly what would be deleted
- Manual prune trigger available
Automatically capture prompts from Claude CLI to your EverPrompt inbox:
user-prompt-submithook fires on every prompt- Fire-and-forget: never blocks your prompt
- Configurable min length, exclude patterns, default project
- API key authentication
Dashboard with KPI cards, creation charts, score distribution, and widgets
Dashboard reflecting real prompt data: 2 prompts, creation trend, needs review
Prompt grid with search bar (DSL operators), filter dropdowns, and card view
Full detail view: Monaco editor, metadata badges, AI Quality Review, versions, notes
Create prompt with body, word/char count, language detection, project/category/tags
Cmd+K command palette: actions, quick filters, keyboard shortcuts
Settings: theme, density, view mode, and AI provider selection
| Layer | Technology | Role |
|---|---|---|
| Frontend | React 19 + TypeScript + Vite 6 | SPA |
| Routing | React Router v7 | Client-side routing |
| State | Zustand 5 (UI) + TanStack Query v5 (server) | State management |
| UI Kit | shadcn/ui + Radix + Tailwind CSS v4 | Component system |
| Animations | Framer Motion | Micro-interactions, transitions |
| Charts | Recharts | Dashboard metrics |
| Editor | Monaco Editor | Prompt body editing |
| Command | cmdk | Command palette |
| Notifications | Sonner | Toast system |
| Icons | Lucide React | Consistent iconography |
| Backend | Hono + Zod | API framework + validation |
| ORM | Drizzle ORM | Type-safe SQL |
| Runtime (prod) | Cloudflare Workers | Edge compute |
| Runtime (dev) | Bun | Dev server + tooling |
| Build | Turborepo | Monorepo orchestration |
| DB | Cloudflare D1 (SQLite) | Source of truth |
| Search | Cloudflare Vectorize | Semantic search (768-dim vectors) |
| Embeddings | Workers AI (bge-base-en-v1.5) |
Vector generation |
| AI Analysis | Multi-provider (Anthropic/OpenAI/OpenRouter/Workers AI) | Scoring, judgment, improvement |
| Object Store | Cloudflare R2 | Attachments, exports |
| Cache | Cloudflare KV | Cache facets, dashboard stats |
| Queue | Cloudflare Queues | Async AI pipeline |
| Auth | Cloudflare Zero Trust | Access protection |
| Plugin | Claude CLI Plugin (hook) | Prompt capture |
| Tool | Minimum Version | Install |
|---|---|---|
| Bun | >= 1.1 | curl -fsSL https://bun.sh/install | bash |
| Node.js | >= 20 | nodejs.org (needed for wrangler) |
| Git | any | git-scm.com |
| Cloudflare account | free plan works | dash.cloudflare.com/sign-up |
At least one LLM API key (choose one):
| Provider | Get API key at |
|---|---|
| Anthropic (recommended) | console.anthropic.com -- $5 free credits |
| OpenAI | platform.openai.com/api-keys |
| OpenRouter | openrouter.ai/keys |
| Workers AI | No key needed -- free with CF account |
Verify:
bun --version # 1.1+
node --version # v20+git clone <your-repo-url>
cd everprompt
bun installbun run db:migrateExpected output:
Migrations to be applied:
+------+-------------------------+--------+
| 0000_daily_hairball.sql | Applied |
+------+-------------------------+--------+
cp .dev.vars.example .dev.varsEdit .dev.vars with your API key(s):
# Required: at least one LLM key (or use Workers AI for free)
CLAUDE_API_KEY=sk-ant-api03-your-key-here
OPENAI_API_KEY=
OPENROUTER_API_KEY=
ENVIRONMENT=developmentbun run devThis starts both services in parallel via Turborepo:
- API (Cloudflare Worker)
10000
:
http://localhost:8787 - Frontend (Vite):
http://localhost:5173
Open http://localhost:5173 in your browser.
bun run db:seedCreates 3 projects, 5 categories, 10 tags, and 20 sample prompts.
Go to Settings in the app and select your preferred AI provider. The classify and score models are automatically set to the best defaults for each provider.
# Switch to OpenAI
curl -X PATCH http://localhost:8787/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"ai_provider":"openai","ai_classify_model":"gpt-4o-mini","ai_score_model":"gpt-4o"}'
# Switch to Workers AI (free)
curl -X PATCH http://localhost:8787/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"ai_provider":"workers-ai"}'
# Switch back to Anthropic
curl -X PATCH http://localhost:8787/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"ai_provider":"anthropic"}'
# Use a custom model
curl -X PATCH http://localhost:8787/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"ai_provider":"openrouter","ai_classify_model":"anthropic/claude-3.5-haiku","ai_score_model":"anthropic/claude-sonnet-4"}'| Provider | Classify (fast, cheap) | Score (powerful) |
|---|---|---|
anthropic |
claude-haiku-4-5-20251001 |
claude-sonnet-4-20250514 |
openai |
gpt-4o-mini |
gpt-4o |
openrouter |
anthropic/claude-3.5-haiku |
anthropic/claude-sonnet-4 |
workers-ai |
@cf/meta/llama-3.1-8b-instruct |
@cf/meta/llama-3.1-70b-instruct |
Set API keys in .dev.vars (local) or via wrangler secret put (production):
# .dev.vars (local development)
CLAUDE_API_KEY=sk-ant-api03-xxxxx # For Anthropic
OPENAI_API_KEY=sk-xxxxx # For OpenAI
OPENROUTER_API_KEY=sk-or-xxxxx # For OpenRouter
# Workers AI needs no key -- uses CF AI binding
# Production
npx wrangler secret put CLAUDE_API_KEY
npx wrangler secret put OPENAI_API_KEY
npx wrangler secret put OPENROUTER_API_KEYYou only need the key for the provider you're using. Empty keys are fine for providers you don't use.
everprompt/
package.json Workspace root (Bun + Turborepo)
turbo.json Turborepo task config
tsconfig.base.json Shared TypeScript config
wrangler.jsonc Cloudflare Workers bindings
.dev.vars Local secrets (gitignored)
.dev.vars.example Template for .dev.vars
packages/
shared/ Shared types, constants, validation, utils
src/types/ TypeScript interfaces (prompt, search, taxonomy, dashboard, api)
src/constants/ Scoring weights, search operators, limits
src/validation/ Zod schemas (prompt, search, taxonomy)
src/utils/ ULID, slug, hash, diff, query-parser
db/ Drizzle ORM schema + migrations
src/schema/ All table definitions (11 tables)
src/migrations/ SQL migration files
drizzle.config.ts Drizzle Kit config
apps/
api/ Hono API (Cloudflare Worker)
src/index.ts Entry: routes, middleware, queue consumer
src/env.ts Env type definitions
src/middleware/ Auth (Zero Trust + API key) and error handler
src/routes/ 11 route files (prompts, search, ai, taxonomy, etc.)
src/services/ 5 service files (business logic)
src/ai/ AI pipeline: normalize, classify, score, embed, postprocess, pipeline orchestrator
src/queue/ Queue consumer for async pipeline
src/lib/ Helpers: db, kv, r2, vectorize, llm (multi-provider), claude, pagination
web/ React SPA
src/main.tsx React entry
src/app.tsx Router + providers
src/routes/ 7 page components
src/components/ui/ 14 shadcn/ui base components
src/components/layout/ Shell, top-bar, sidebars, status-bar
src/components/prompt/ 11 prompt components (card, detail, score, diff, etc.)
src/components/search/ 5 search components (bar, filters, autocomplete, facets)
src/components/taxonomy/ 4 taxonomy components (trees, tag cloud)
src/components/bulk/ 2 bulk action components
src/components/shared/ 5 shared components (command palette, shortcuts, empty states)
src/hooks/ 7 React Query hooks
src/stores/ 3 Zustand stores (ui, selection, search)
src/lib/ API client, query client, utils
plugins/
everprompt-capture/ Claude CLI plugin
plugin.json Plugin manifest
hooks/capture-prompt.sh Hook script
commands/ep-config.md Slash command
settings.local.md User configuration
tools/
seed.ts Seed DB with demo data
import.ts Batch import (JSON/CSV/Markdown)
export.ts Full export
| Command | Description |
|---|---|
bun run dev |
Start API + frontend in parallel |
bun run build |
Build all packages and apps |
bun run typecheck |
TypeScript check all packages |
bun run db:generate |
Generate Drizzle migration from schema changes |
bun run db:migrate |
Apply migrations locally |
bun run db:migrate:prod |
Apply migrations to production |
bun run db:seed |
Seed local DB with demo data |
bun run deploy |
Build + deploy to Cloudflare |
bun run tools:import |
Batch import prompts |
bun run tools:export |
Export all prompts |
# 1. Edit schema in packages/db/src/schema/
# 2. Generate migration
bun run db:generate
# 3. Apply locally
bun run db:migrate
# 4. After deploy, apply to production
bun run db:migrate:prodwrangler d1 execute everprompt-db --local --command "SELECT COUNT(*) FROM prompts"npx wrangler login
npx wrangler whoami # Verify# D1 Database
npx wrangler d1 create everprompt-db
# Copy the database_id
# Vectorize Index (768-dim for bge-base-en-v1.5)
npx wrangler vectorize create everprompt-prompts --dimensions=768 --metric=cosine
# R2 Bucket
npx wrangler r2 bucket create everprompt-assets
# KV Namespace
npx wrangler kv namespace create everprompt-kv
# Copy the id
# Queue
npx wrangler queues create everprompt-ai-pipelineReplace placeholder IDs with real ones from Step 2:
d1_databases[0].database_id-- fromwrangler d1 createkv_namespaces[0].id-- fromwrangler kv namespace create
npx wrangler secret put CLAUDE_API_KEY # Paste your Anthropic key
npx wrangler secret put OPENAI_API_KEY # (optional)
npx wrangler secret put OPENROUTER_API_KEY # (optional)bun run db:migrate:prodbun run deployOutput:
Published everprompt-api (x.xx sec)
https://everprompt-api.<your-subdomain>.workers.dev
curl https://everprompt-api.<your-subdomain>.workers.dev/api/v1/dashboard/stats
# {"ok":true,"data":{"total_prompts":0,...}}Workers & Pages > everprompt-api > Settings > Triggers > Add Custom Domain
Restrict access: Zero Trust dashboard > Access > Applications > Add Self-hosted > Set policy to allow your email(s).
cp -r plugins/everprompt-capture ~/.claude/plugins/everprompt-captureIn EverPrompt web UI: navigate to API Keys page, generate a key named "Claude CLI" with ingest permission.
Edit ~/.claude/plugins/everprompt-capture/settings.local.md:
---
enabled: true
api_url: https://everprompt-api.your-subdomain.workers.dev
api_key: ep_your_generated_key_here
default_project: my-project
min_length: 50
exclude_patterns: /help /clear /config
---Run /ep-config in Claude CLI. Then write any prompt -- it appears in your EverPrompt Inbox within seconds.
Flow: You type prompt -> hook fires -> capture-prompt.sh sends to API (fire-and-forget) -> EverPrompt saves as inbox -> AI pipeline runs -> prompt appears with title, tags, score.
Session Tracking:
The plugin automatically captures CLAUDE_SESSION_ID from the environment and includes it in the ingest payload. Sessions are auto-created on first prompt and named by AI.
| Variable | Required | Description |
|---|---|---|
CLAUDE_API_KEY |
If using Anthropic | Anthropic API key (sk-ant-...) |
OPENAI_API_KEY |
If using OpenAI | OpenAI API key (sk-...) |
OPENROUTER_API_KEY |
If using OpenRouter | OpenRouter API key (sk-or-...) |
ENVIRONMENT |
No | development (default) |
npx wrangler secret put CLAUDE_API_KEY
npx wrangler secret put OPENAI_API_KEY
npx wrangler secret put OPENROUTER_API_KEY| Binding | Type | Description |
|---|---|---|
DB |
D1 | SQLite database -- source of truth |
VECTORIZE |
Vectorize | 768-dim vector index for semantic search |
R2 |
R2 Bucket | Object storage for attachments/exports |
KV |
KV Namespace | Cache for dashboard stats and facets |
AI_QUEUE |
Queue | Async AI pipeline message queue |
AI |
Workers AI | Embedding model (bge-base-en-v1.5) |
ASSETS |
Assets | Static frontend (Vite build output) |
Base URL: /api/v1
POST /prompts Create (triggers AI pipeline)
GET /prompts List (paginated, filterable)
GET /prompts/:id Detail (with review, tags, versions)
PATCH /prompts/:id Update
DELETE /prompts/:id Soft delete
POST /prompts/ingest Ingest from plugin (API key auth)
POST /search Hybrid search (structured + keyword + semantic)
GET /search/suggest Autocomplete
GET /search/facets Counts per project/category/tag/band
POST /prompts/:id/analyze Trigger AI analysis
POST /prompts/:id/improve Generate improved version
GET /prompts/:id/review Latest AI review
GET /prompts/:id/reviews Review history
GET /prompts/:id/similar Similar prompts (Vectorize)
GET/POST/PATCH/DELETE /projects Projects CRUD
GET /categories/tree Category tree
GET/POST/PATCH/DELETE /categories Categories CRUD
GET/POST/PATCH/DELETE /tags Tags CRUD
POST /tags/merge Merge two tags
POST /prompts/bulk/tag Add/remove tags
POST /prompts/bulk/move Change project/category
POST /prompts/bulk/delete Soft delete (requires confirm: true)
POST /prompts/bulk/reanalyze Re-run AI pipeline
POST /prompts/bulk/archive Archive
POST /prompts/bulk/favorite Toggle favorite
GET /dashboard/stats KPIs
GET /dashboard/charts/creation Prompts per week
GET /dashboard/charts/quality Score distribution
GET /dashboard/charts/tags Top tags
GET /dashboard/charts/projects Top projects
GET /dashboard/recent Last 10 prompts
GET /dashboard/needs-review Inbox/failed/low-score
GET/POST /prompts/:id/versions Version management
POST /prompts/:id/versions/:vid/apply Apply version
GET/POST/PATCH/DEL /prompts/:id/notes Notes
GET/POST/PATCH/DEL /saved-searches Saved searches
GET/POST/PATCH/DEL /api-keys API key management
GET/PATCH /settings User preferences + AI config
GET/POST/DELETE /security/patterns Custom security scan patterns
Cloudflare Zero Trust (Auth)
|
Cloudflare Edge
+-- Static Assets (Vite build)
+-- Worker: everprompt-api (Hono)
|-- /api/* -> Hono routes
|-- /* -> React SPA
|
+-- D1 (SQLite -- source of truth)
+-- KV (cache)
+-- R2 (object storage)
+-- AI (Workers AI -- embeddings)
+-
82CD
- Vectorize (semantic search)
+-- Queue (AI pipeline -- async)
|
External: Anthropic / OpenAI / OpenRouter API
POST /prompts -> Save D1 (status: inbox) -> Enqueue -> Return 201
Queue consumer:
Step A: Normalize (in-worker) -- trim, language detect, hash, dedup
Step A.5: Security Scan (in-worker, no AI) -- regex-based PII/credential detection
Step B: Classify (Haiku/fast LLM) -- title, abstract, tags, category
Step C: Score (Sonnet/power LLM) -- 10 scores, verdict, improved version
Step D: Embed (Workers AI) -- 768-dim vector -> Vectorize
Step E: Post-proc (in-worker) -- save tags, versions, update counters
Result: ai_status: complete, quality_band: B, overall_score: 81.7
- Check your API key in
.dev.vars-- must match selected provider - Check server logs for specific error:
"model: xxx"means the model name is wrong - Switch to Workers AI (free, no key needed):
PATCH /settings {"ai_provider":"workers-ai"}
- Queue consumer may not be running -- restart with
bun run dev - Check wrangler.jsonc has both
producersandconsumersfor the queue
- Normal in local dev: Vectorize is not simulated locally
- In production: verify index exists with
npx wrangler vectorize get everprompt-prompts - Must be 768 dimensions with cosine metric
# Check applied migrations
wrangler d1 migrations list everprompt-db --local
# Re-apply
bun run db:migrate- Both servers must be running:
bun run devstarts API (8787) + Frontend (5173) - Vite proxies
/apirequests to the worker
bun run typecheck # Find TypeScript errors firstMIT