Your private prompt library, with curated public prompts and agent collections.
Create your prompt library on bearprompt.com.
- Private library: Store your own prompts locally in the browser with no signup required.
- Folders, search, and tags: Organize prompts by folder, search quickly, and filter by tags.
- Public prompt library: Browse curated public prompts, featured categories, and highlighted authors.
- Agent library: Explore public agent collections and author pages.
- Share prompts: Share prompts with end-to-end encrypted links (just like Excalidraw).
Bearprompt has two main parts:
- Your private library lives in the browser and is stored locally using IndexedDB.
- Public discovery features such as prompts, agents, authors, and categories are served from Supabase.
This means the app is privacy-first for personal usage, while still supporting a public library experience.
- Node.js 22+ and npm
# Clone the repository git clone https://github.com/julianyaman/bearprompt.git cd bearprompt # Install dependencies npm install
# Start development server npm run dev # Open http://localhost:5173 in your browser
# Start the dev server npm run dev # Build for production npm run build # Preview the production build npm run preview # Type-check the project npm run check # Type-check in watch mode npm run check:watch
Create a .env file based on .env.example:
cp .env.example .env
Current environment variables:
SUPABASE_URL: Supabase project URLSUPABASE_ANON_KEY: client-side key for public reads and app usageSUPABASE_SERVICE_ROLE_KEY: server-side key for privileged operationsTURNSTILE_SECRET_KEY: optional Cloudflare Turnstile secret for risk-based verificationPUBLIC_TURNSTILE_SITE_KEY: optional public Turnstile site keyADDRESS_HEADER/XFF_DEPTH: adapter-node client IP headers for share and OG rate limits. Behind Cloudflare setADDRESS_HEADER=CF-Connecting-IP. Behind a reverse proxy that appendsX-Forwarded-For, setADDRESS_HEADER=X-Forwarded-ForandXFF_DEPTH=1. If unset, SvelteKit uses the TCP peer address (the proxy), which is safer than trusting spoofable forwarded headers.
For purely local UI work, you can often develop without the optional Turnstile keys. Public library and publishing-related features depend on Supabase.
# Build for production
npm run buildBuild and run with Docker:
# Build the image docker build -t bearprompt . # Run the container docker run -p 3000:3000 bearprompt
The container runs the SvelteKit Node build with node build and will be available at http://localhost:3000.
- SvelteKit 2 with Svelte 5
- Tailwind CSS 4
- Supabase for public content and server-backed features
- IndexedDB for the local private library
- @vercel/og for Open Graph image generation
- Private library data is stored locally in the browser.
- Public library content is fetched from Supabase with an explicit public column list.
- Shared links are end-to-end encrypted and use Cloudflare Turnstile for abuse prevention.
If you self-host, review your Supabase and verification configuration carefully before exposing public flows.
Public page loads use SUPABASE_ANON_KEY. Confirm these policies in the Supabase dashboard before going live:
prompts,authors,tags,categories, and related join tables: anonSELECTonly for rows that should be public. Anon must not insert, update, or delete.shared_prompts: no anon access. Create/get/revoke go through/api/shareswithSUPABASE_SERVICE_ROLE_KEY.- Do not add secret columns to those public tables; application queries select a fixed public column list rather than
*.
Contributions are welcome! Please feel free to submit issues and pull requests.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes using Conventional Commits, for example
feat(public): add category card hover state - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Commit messages in this repo follow:
<type>(<scope>): <description>
Examples:
feat(public): add featured category cardsfix(library): sort prompts alphabeticallydocs(landing): update hero copy
This project is licensed under the MIT License - see the LICENSE file for details.