Skip to content

peteroyce/kuration

Repository files navigation

kuration

Semantic bookmark manager that understands what you saved, not just what you titled it. Retrieves links by meaning using embeddings — so you never lose a link again.

The Problem

You save 500 bookmarks. Six months later you search "that article about React performance" and find nothing — because you titled it "interesting read" and tagged it "web".

kuration embeds every bookmark at save time. Search by meaning, not by keywords.

Features

  • Semantic search — find bookmarks by what they mean, not what they're called
  • Cosine similarity ranking — results ordered by relevance, not recency
  • Tag filtering — combine semantic search with tag-based filtering
  • GitHub OAuth — zero-friction sign-in
  • SQLite — zero infrastructure, just a file

Quick Start

git clone https://github.com/peteroyce/kuration
cd kuration
cp .env.example .env.local
# fill in ANTHROPIC_API_KEY, GITHUB_ID, GITHUB_SECRET, NEXTAUTH_SECRET

npm install
npm run db:push
npm run dev

API

Save a bookmark

curl -X POST /api/bookmarks \
  -H "Content-Type: application/json" \
  -d '{"url": "https://...", "title": "React Fiber architecture deep-dive", "tags": ["react", "perf"]}'

Semantic search

curl "/api/search?q=how does React schedule rendering"

Returns bookmarks ranked by semantic similarity to your query — even if the exact words don't match.

Tech Stack

Next.js 14 · Prisma · SQLite · NextAuth · Voyage AI embeddings · TypeScript

Notes

  • Rate limiting is in-memory (per-process). On serverless platforms like Vercel, each function invocation is stateless — replace with a Redis-backed limiter (e.g. @upstash/ratelimit) for true per-user enforcement across instances.

About

Semantic bookmark manager that understands what you saved, not just what you titled it. Retrieves links by meaning using embeddings — so you never lose a link again.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors