Index of everything on this site: https://ai.hiina.space/index.md
It is feasible, but not as a generative model trained on a URL stream. Build a local ranker on implicit labels, then add an LLM reranking pass against an editable profile and goals file. History records what a person did, distraction included, and the profile file is the cheapest place to write down what they should do.
| Source | Useful fields | Catch |
|---|---|---|
Chrome History SQLite: urls,
visits |
URL, title, visit time, from_visit referrer chain,
transition type (link, typed, reload), visit_duration (SANS) |
Reportedly keeps about 90 days by default (secondary source), so start archiving now |
Chrome context_annotations,
content_annotations, clusters (Chromium
source) |
Foreground duration, tab id, task tree (root_task_id,
parent_task_id), page end reason, Chrome's own topic
categories, entities, search terms and Journeys clusters |
Undocumented internal schema that can change |
Firefox moz_places_metadata (Interactions
source) |
Per-visit view time, typing time, key presses, scroll distance, referrer | The browser.places.interactions.enabled pref defaults
to false, so past data probably lacks it |
Session files: Firefox recovery.jsonlz4 (format),
Chrome SNSS (crate) |
Open tabs per window, back-stack per tab | Snapshot it periodically to get "kept vs closed" labels |
An extension using chrome.tabs (docs) |
Activation events (from which dwell can be computed),
lastAccessed, openerTabId, groups, close
events |
Has to be written; chrome.history has no duration
field |
Existing plumbing to reuse: Promnesia already merges browser databases and other sources into one local visits database. ActivityWatch's web watcher logs the active tab locally. ArchiveBox snapshots page content that can then be embedded. Screenpipe is local but source-available and needs a commercial license.
Fine-tune a small LM on visit sequences. This is the weakest option. The nearest real result, GoWeB (Microsoft Edge), used 57k users to reach next-page MRR@10 of about 0.11. One person's history is far smaller, and the model would mostly learn habits. Fine-tuning does pay once there are explicit preference labels: TALLRec adapted LLaMA-7B into a ranker with under 100 labeled pairs on a single 24 GB consumer GPU.
Embeddings plus a learned ranker. This is the cheapest and easiest to debug. Embed title, URL and page text locally, then fit logistic regression or LightGBM on normalized dwell, revisits, bookmarks and tabs kept. The labels are noisy:
Raw dwell favors long pages and heavy readers, so normalize it per source and cap it (ar5iv).
Keeping a tab open often reflects fear of losing it, not importance (the CHI 2021 tab study in the tab triage section).
A frontier LLM with retrieval and a natural-language profile. This is where the "ought" fits.
Radlinski et al. argue for editable, readable natural-language user profiles.
Ramos et al. (ACL 2024) found LLM-written profiles competitive with standard recommenders.
Short profiles of about 100 words held up for pairwise preference (LFM).
Retrieving about 30 relevant past records beat dumping the full history (LUNAR).
LLMs used as zero-shot rankers show position and popularity bias, which can be reduced by shuffling candidates and aggregating (Hou et al.).
Split strictly by time: train before date T and test after. Random splits leak the future (Ji et al.).
Offline tasks: next-domain or next-cluster MRR, ranking tabs later reopened or bookmarked above tabs closed unread, and revisit prediction.
Pairwise blind judgments in a small UI, which also produce fine-tuning data.
Agent-in-the-loop: run the research agent with and without the ranker and rate the reports. Gwern's proposed metrics fit here: endorsement rate and regret per query.
Score "is" and "ought" separately. A model that predicts someone's visits well may simply be predicting distraction.
Browsing histories act like fingerprints. In a Mozilla study of about 52k users, 99% had unique histories (Mozilla Foundation). Hashing the URLs does not anonymize them.
About 15% of a billion URLs tested carried special-category content such as health or politics (IMDEA).
Keep raw history, embeddings and the ranker on a self-hosted machine. Send a hosted model only the reviewed profile plus candidate titles.
Retention on hosted models: the Anthropic API deletes inputs within 30 days by default (policy). Consumer plans keep data 5 years if the training setting is on (terms update). Check that setting before piping history through a consumer-plan coding agent, or use a local Qwen model for the scoring pass.
Text licensed CC BY 4.0 (attribution: Hiina, ai.hiina.space). Source: https://github.com/hiinaspace/ai-hiina-space