Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Clicky

A browser-first Chrome extension (Manifest V3) that acts as a lightweight thinking partner and memory layer for what you read on the web. Capture text or a snapshot of a page, save it into simple clusters, import files, and ask Gemini questions that are answered from your own saved memory.

Clicky suggests; you decide. Nothing is saved without your confirmation, and answers are grounded in what you saved (with citations) rather than guessed.


What works now

Capture & memory (local-first)

  • Capture highlighted text via right-click Send selection to Clicky.
  • Capture an image region of the visible tab: click Capture Region, drag a rectangle on the page (Esc to cancel). The crop becomes the current capture.
  • Side panel shows the current capture (text or image) with page title + URL.
  • Explicit save into a cluster using a real picker (choose an existing cluster or create a new one); the source link is saved and shown.
  • Attach a private note to any source when saving (your subjective take on why it matters). Notes are editable later in Memory and are never sent to the AI during retrieval or Q&A - they only exist to help you.
  • Memory browser groups saved items into clusters, with source badges (WEB / PDF / FILE) and delete.

Floating quick layer (Cmd/Ctrl+Shift+0)

  • Press the shortcut on any normal page to open a small floating hexagon + composer ("Ask about selection…").
  • Capture directly from the composer without dismissing it:
    • ✏ Highlight — enters a mode where you can select text on the page; the highlight attaches to the composer (used for your next question). Esc cancels.
    • ▢ Region — hides the composer, lets you drag a box over any part of the page, then screenshots + crops it (dpr-aware) and attaches the image thumbnail. Esc cancels.
    • Any attachment shows a chip/thumbnail with a ✕ to clear it (regions show a filename-style label + pixel dimensions).
    • Every highlight/region is mirrored into the side panel's Current capture automatically, so opening Memory shows it there too. Save capture brings the side panel forward on its explicit save flow (pick or create a cluster, then Save) — nothing is auto-saved.
  • Choose the project (cluster) it should use, ask, and get a compact, truncated answer preview with Expand, Open in side panel, and Save as note.
  • A subtle node-lighting animation plays on the hexagon while thinking (static state under prefers-reduced-motion). Open Memory opens the side panel; + New opens the side panel to create a project. Esc or an outside click dismisses it.
  • Use the button to minimize the composer into a compact pill bar; click the pill to expand it again.
  • The AI call is handled by the extension worker, so it reuses the exact same ask/model-routing/memory logic as the side panel.

Graph of discoveries (verified connections)

  • The Graph tab shows your clusters as nodests (sized by note count). Click a node to see the source name, summary, and the other sources within and across clusters that it is connected to. Note: the initial connections on the graph are made based on centroid similarity, but are verified by an LLM each time a new source is added, ensuring that connections truly reflect parallels in content.
  • Compute connections (toolbar): embeds any notes that don't have a vector yet (e.g. image or never-queried notes) so they can participate.
  • Verify (per note): cosine similarity is easily fooled by shared vocabulary, so an LLM judge decides whether each candidate is a genuine link (shared mechanism/method/cause or a meaningful contrast), merely surface-related (same words/field, no real link), or unrelated.
    • Only genuine links keep their edge. Rejected ones are pulled out of the graph and listed under "Looks related, but…" with a one-line reason — so a misconception is shown to you instead of silently forming a node.
  • "How do these connect?" on any connection asks Gemini for a short, concrete explanation (cached per pair).

Ask a project (Gemini)

  • Pick a project (cluster) and ask questions in a per-project chat.
  • Clicky retrieves the most relevant saved items for your question (semantic embeddings, with a keyword fallback) instead of dumping the whole cluster into the prompt.
  • Answers cite the sources used and show which model answered.
  • If your saved notes don't contain enough to answer, Clicky says so and asks for more context instead of guessing.

Smart model router

  • Discovers the models your key can use and ranks them (Pro > Flash > Flash-Lite, newer wins).
  • Reserves the strongest model for real questions; uses a cheaper model for light work (summaries) to protect your scarce free-tier Pro quota.
  • On a rate limit (429) or overload (503) it cools that model down and automatically falls back to the next best one, then tries the stronger model again later.
  • Auto by default; you can force a specific model in Settings.

Import files

  • Import .pdf, .txt, or .md into a cluster (PDF text extracted locally with PDF.js).
  • For any file you choose to save Summary only, Chunks only, or Both. Summaries use Gemini; chunks don't.

Intentionally deferred

Auth / Google sign-in, cloud sync, macOS-native features, OCR, and voice are not built. Nothing is faked.


One-time setup: add a free Gemini API key

  1. Go to Google AI Studio: https://aistudio.google.com/apikey and create a free API key.
  2. In Clicky, click Settings (top-right of the panel).
  3. Paste the key, click Save key, then Test & load models to confirm it works and populate the model list.

Notes:

  • The key is stored only in chrome.storage.local on your machine and is sent directly to Google. This is the tradeoff for a backend-free, personal tool.
  • Free-tier limits are real: Pro models have low requests/day, Flash more, Flash-Lite most. The router is designed around this, but heavy use can still hit limits (you'll see graceful fallback).

Project structure

Clicky/
  manifest.json
  src/
    background/service-worker.js   # capture trigger, opens panel
    content/content-script.js      # reads selection + page metadata
    sidepanel/                     # the UI (html / css / js)
    core/
      settings.js                  # API key, model preference, retrieval toggle
      memory.js                    # saved items + clusters (now with source types)
      capture.js                   # transient current capture
      chat.js                      # per-cluster chat threads
      importer.js                  # txt/md/pdf -> text, chunk, summarize
      ai/
        gemini.js                  # REST client (generate / embed / list models)
        router.js                  # model discovery, ranking, cooldowns, fallback
        retrieval.js               # embeddings + cosine top-K, keyword fallback
        ask.js                     # orchestrates a project question
    lib/pdf/                       # bundled PDF.js (pdf.min.mjs + worker)
  assets/icons/

Load / reload in Chrome

  1. Open chrome://extensions, enable Developer mode.
  2. Load unpacked and select this project folder (contains manifest.json).
  3. After any code change, click the reload icon on the Clicky card.

Requires Chrome/Chromium 114+ (not Safari).


Manual testing

  1. Settings: paste your key, Save, Test. A bad key shows a clear error; a good key lists models.
  2. Capture + save: highlight text on a page, press Cmd/Ctrl+Shift+0, click Save, pick or create a cluster, confirm. The source link shows and persists after reload. 2b. Region capture: click Capture Region in the panel, drag a rectangle over the visible page, release. The cropped image appears as the current capture with the page title/URL; save it into a cluster like any other capture. Press Esc mid-drag to cancel. (Works on normal http(s)/file pages only.)
  3. Ask: in "Ask a project", pick the cluster, ask a question about what you saved. Confirm the answer cites sources and names the model. Ask something unrelated to your notes to see it request more context instead of inventing an answer.
  4. Router fallback: in Settings, force a low-quota model; ask repeatedly to see it cool down and fall back.
  5. Import: import a .md (Chunks only) and a .pdf (Both). Confirm items land in the chosen cluster with the filename as source, and that the PDF summary reads faithfully.
  6. Retrieval toggle: turn embeddings off in Settings and ask again; it falls back to keyword retrieval (status line shows the mode used).

Troubleshooting

  • "No Gemini key yet" banner: add a key in Settings.
  • Asking/summarizing errors mentioning rate limits: you hit free-tier quota; wait, or force a Flash model.
  • PDF import does nothing: some scanned PDFs have no selectable text (image-only); Clicky reports "no extractable text".

About

A bookmarks bar for the modern age - Manifest V3 chrome extension that saves captured text and images into clusters, with RAG LLM for context-grounded responses, and graph view of how sources connect within and across clusters. Saved locally on chrome profile, and can be imported/exported to share context between Clickys on different browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages