DigesterDigester

Turn everything you save on X, Reddit and LinkedIn into a private, searchable archive — categorized, translated, summarized and queryable by your own local models. Nothing leaves your machine.

What Digester Does

You save hundreds of posts and never read them again. Digester collects them, normalizes them into a local database, and turns that pile into something you can actually work with: full-text and semantic search, persistent categories, long-form briefings per topic and time window, and a read-only MCP server so your IDE assistant can read the archive too.

It is deliberately local-first. The service binds to 127.0.0.1 only, the database is a single SQLite file, media is downloaded to disk, and every AI feature runs against your own LM Studio instance. There are no developer API keys, no cloud accounts and no telemetry.

  • Collects X Likes and Bookmarks, Reddit Saved and Upvoted, LinkedIn Saved posts — through a dedicated logged-in browser profile, not a platform API.
  • Normalizes text, original URLs, metadata and downloaded media into SQLite, with full-resolution Reddit gallery images instead of preview thumbnails.
  • Understands your library through LM Studio: categorization, category discovery, embeddings, grounded question answering and long-form digests.
  • Compares your saved posts against your own local code projects, surfacing the security fixes, new techniques and tools that actually affect what you are building — each backed by evidence from your own files.
  • Exposes everything read-only over MCP to Codex, Cursor, Claude Desktop and DeepSeek Harness.

The part that changes how you read. A saved post is only worth anything if it changes what you build. Point Digester at one of your local projects and it first profiles what that codebase actually does, then checks your recent posts against it and keeps only what is genuinely relevant to it: a security fix in a library you depend on, a technique that would replace something you hand-rolled, a model or tool that fits your stack, a limitation somebody else already ran into.

Every finding has to be supported by both a saved post and evidence in your own files, and the report cites the project-relative paths it is talking about. So instead of another undifferentiated feed, you get “this one matters for this project, and here is the file it touches” — along with the pros, the cons and unknowns, and a prioritized list of what to do about it.

View the Repository →

The repository is private and invite-only. Ask for access if you want to look inside.

Features
🔒Local-First by Design
Express service bound to 127.0.0.1, a single SQLite file, media on your own disk. LM Studio URLs are restricted to localhost or private-network addresses.
🕸️No Developer API Keys
Collection runs through a dedicated logged-in Playwright browser profile using your installed Chrome. Your password is never received or stored.
⚡Instant Keyword Search
SQLite FTS5 gives you full-text search over the whole archive even when no model is loaded. Embeddings are an upgrade, not a requirement.
📰Category Digests
Condense today, three days, a week, a month, six months or a year into a source-grounded briefing with section citations, original URLs and saved media.
🧠Project Intelligence
Profile a local code project, then compare new saved-post developments against its evidenced implementation, pros, cons, unknowns and next steps.
🎛️GPU-Aware Automation
A GPU load analyser watches the cards LM Studio actually runs on and starts your selected digests only while those cards are genuinely idle.

App Screenshots

Digester runs as a local dashboard in your browser at http://127.0.0.1:4317. A dark, dependency-free interface with a collection sidebar on the left and one view per workflow. Click any screenshot to see it full size.

These are captures of a real library of 729 saved posts, not mock-ups. Post text, author names and media thumbnails are deliberately blurred — the archive belongs to one person and the posts in it belong to their authors.

Screenshot of the Digester Library view: the left sidebar showing All posts with a post count, the X / Twitter section with Likes and Bookmarks, the Reddit section with Saved and Upvoted, the LinkedIn section with Saved posts, and the Categories list below with the Manage and Discover buttons; the main area shows the post list with the search field, filter toolbar and a selected post's detail panel on the right.
Everything starts here. The left rail carries the collections — X Likes, X Bookmarks, Reddit Saved, LinkedIn — with live counts, and your categories below them. The middle column is the result list; the right panel is the selected post in full, with its star, read state, category chips and research notes. The two strips above the list are background workers reporting in: automatic English translation, and linked-page capture with its counts of captured, partial, blocked and failed links.
Screenshot of the Digester Ask library view: the "What did you save?" prompt with three example questions, the question input box with the "Use current Library filters" toggle and the scope line reading "Searching the entire library", the Ask Local Lore button, the Build semantic index action, and the empty Grounding sources panel where an answer's cited posts appear.
Ask a question in plain language and LM Studio answers from your own saved posts. The Grounding sources panel on the right fills with the posts the answer was actually built from, each linking back to the original. The line under the input shows the scope — the whole library by default, or just your current Library filters if you tick the box.
Screenshot of the Digester Digests view showing the category by time-window matrix: rows for each category, columns for Today, Last 3 days, Last week, Last month, Last 6 months and Last year, with colored cells marking saved digests, empty cells selectable with checkboxes, and the Generate selected button.
Every category crossed with every time window. A coloured cell is a briefing that already exists — click it to read, or tick it to regenerate — and an empty cell can be queued. Select up to 20 combinations and they run one after another, with only a single LM Studio request active at a time, so a batch never competes with itself.
Screenshot of a generated Digester category digest opened for reading: the briefing headline, the sections of long-form text with citation links after each section, the list of original post URLs, and the saved images and videos shown with their source cards.
A finished briefing: long-form text broken into sections, each citing the posts it was built from, followed by the original URLs and any images or video saved with those posts. Completed digests are stored in SQLite and stay readable after a restart.
Screenshot of the Digester Projects view: a selected Codex project with its name and primary folder, the LM Studio inferred focus notes, the colored topic tags, the expandable implementation cards citing project-relative file paths, and the On this page index with Expand all and Collapse all controls.
Point Digester at one of your local Codex projects and it profiles the codebase — technology stack, current implementation, security, data handling — citing the project-relative files behind each finding. The coloured topic tags jump to sections of the report, and any one of them can be deep-analysed against your saved posts to see what the last week of reading means for that specific code.
Screenshot of the Digester Automation view: the scheduled crawling panel showing the selected collections, the interval field set to 30 minutes, the per-run post limit and the next run time; below it the GPU idle analyser panel showing the detected LM Studio GPUs, the utilization threshold, the window length, the required idle share and the current sample count.
Two independent schedulers. On the left, collections are re-read on a fixed interval — every 30 minutes for X Bookmarks here — using the saved browser session, with the last and next run times shown. On the right, the GPU watcher reads nvidia-smi and reports which cards LM Studio is actually running on, so digests only begin once those cards have been genuinely idle: below 15% utilisation for 98% of the last 10 minutes.
Screenshot of the Digester Sources view: the X handle and Reddit username fields, the collection checkboxes, the Open Google Chrome buttons per platform, the Verify session button, the Import cookie JSON option, the Include X replies toggle with its maximum replies per post field, and the Start crawl and Run unattended workflow buttons.
One card per platform. Sign in through a dedicated browser window or paste exported cookies, choose which collections to read, then verify the session before crawling. The status line under each card confirms how many cookies loaded and whether the authentication ones are present. The heading states the limit plainly: Digester can read these collections, but cannot post, like, vote or message.
Screenshot of the Digester IDE access dialog showing the ready-to-copy MCP configuration for this machine: the resolved node.exe path, the src\\mcp.js argument, the working directory, the Codex config.toml snippet, the Cursor and Claude Desktop JSON snippet, and the DeepSeek Harness tab with its Cordis patch YAML and the Install into DeepSeek Harness button.
The MCP server configuration, generated with the real Node and project paths for your machine. Tabs switch between the Codex custom-MCP form, the Cursor and Claude Desktop JSON, and the DeepSeek Harness patch file, and every field has its own copy button. The dashboard does not have to be running for this — the MCP process opens the same SQLite database directly.

Sources & Collection

Digester uses your installed stable Chrome build with a dedicated local profile stored under data/browser-profiles/. It never receives or stores your password, and the crawler contains no code for posting, liking, voting, following or messaging.

PlatformCollectionsNotes
X / TwitterLikes, BookmarksLikes can additionally capture a bounded number of replies per post.
RedditSaved, UpvotedGalleries keep every detected image using the original i.redd.it file, not a resized preview.
LinkedInSaved postsSame dedicated-profile session model as the other platforms.

Sessions

  • Choose Open Google Chrome per platform and sign in normally — the session stays in a local profile folder.
  • If a Google-based login blocks the browser, export the relevant x.com, reddit.com or linkedin.com cookies and choose Import cookie JSON. Cookie-Editor arrays, Playwright storage-state JSON and simple { "cookie_name": "value" } objects are all accepted.
  • Imported cookies are kept locally in data/session-cookies/ so they survive restarts. Treat the export like a password.
  • Verify session confirms a platform is signed in before a crawl starts.

Crawling

  • Re-running a crawl is safe: posts are deduplicated by their platform ID and can belong to several collections at once.
  • Include X replies collects replies for liked posts, up to a configurable maximum per post. Replies stay attached to their parent post and become part of its searchable RAG context. This makes Likes crawls slower, because each conversation is opened separately.
  • Run unattended workflow chains the whole pipeline: crawl the selected collections, categorize a stable snapshot of up to 3,000 uncategorized posts, then create Today and Last 3 Days digests for every category with matching posts. Empty windows are skipped; every child job stays visible in Activity.

The Research Workspace

The library is not just a list. Refine library filters by author, inclusive post-date range, media type, reading status, stars, notes and captured-link status. Those restrictions carry through keyword and hybrid retrieval, Ask library, exports — and the read-only MCP tools expose them too.

  • Keyword search paginates every matching post with accurate totals, at 25, 50 or 100 posts per page.
  • Hybrid search returns a ranked shortlist from up to 50 retrieved passages, deduplicated into posts. It is a shortlist, not an exhaustive count — exporting that view exports what is displayed.
  • Stars, read state and research notes live in SQLite, survive re-crawls, and become separately attributed RAG chunks. Your annotations never replace the original source text.
  • Bulk actions work over up to 500 selected posts, including across pages: mark read/unread, star/unstar, add or remove categories without touching unrelated assignments. Edits are transactional — a validation failure changes none of the selected posts.
  • Save view stores a named filter set in the database. Filter state, page size and compact density restore in the same browser.
  • Library health reports categorization, reading, annotation and embedding coverage, link statuses, and media records without a download path.
  • Unsaved note drafts are kept in the browser — Save notes persists and indexes them, Discard draft restores the saved version.
Screenshot of the Digester Refine library filter panel expanded: the author field, the inclusive from and to post-date pickers, the media type selector, the reading status and starred toggles, the has-notes filter, the captured-link status filter, and the Save view button with the list of already saved named views.
Refine library: filters that carry through search, Ask and exports
Screenshot of a Digester post detail panel: the post text with its author and date, the star and read-state controls, the assigned category chips, the Research notes text area with the Save notes and Discard draft buttons, the downloaded media thumbnails, and the expandable Linked content section.
Post detail: categories, stars, research notes and linked content

Keyboard Shortcuts

KeyAction
J / KSelect next / previous post.
SToggle a star on the selected post.
RToggle read state.
XSelect the post for bulk actions.
/Focus the search field.
?Show shortcut help.
Arrow keysNavigate the image gallery when a downloaded image is open.

Shortcuts do not fire while you are typing or while another dialog is open.

Categories

A post can belong to several categories at once. Categories are persistent, stored in the local SQLite library with their descriptions, and survive app or folder reloads.

  • Categorize uncategorized classifies up to 100 posts from the current platform/collection with LM Studio. Automatic categorization preserves manual tags.
  • Open any post to adjust its categories, create a custom category, or ask LM Studio to classify just that one.
  • The category menu accepts multiple selections: Any selected is an OR filter, All selected is an AND filter. The same selection scopes keyword and semantic search, Ask Library and exports.
  • Discover scans every uncategorized post for recurring themes and proposes names and descriptions for review. Names are limited to one or two words and stay editable before you add them. Discard permanently removes an unwanted idea from the current scan. Discovery proposes, it does not assign — categorize manually or in batch afterwards.
  • Manage edits short names, colors and descriptions while preserving stable category IDs and slugs. It also merges duplicates into a chosen survivor: overlapping assignments collapse to one, manual labels win over AI labels, retrieval context is rebuilt for affected posts, and saved views are rewritten automatically.
  • Existing digests keep their original category label as historical snapshots — a merge never rewrites a briefing you already read.
Screenshot of the Digester category Discover dialog: the list of proposed categories from the uncategorized scan, each row showing an editable one or two word name, its generated description, a checkbox to create it and a Discard button, with the Create selected action at the bottom.
Discover: reviewable category proposals from uncategorized posts
Screenshot of the Digester Manage categories dialog: the table of existing categories with editable short names, color swatches and descriptions, and the merge section where several source categories are selected and a destination category is chosen as the survivor.
Manage: edit, recolor and merge duplicate categories

Category Digests

The Digests view is a category × time-window matrix. A colored cell is the newest saved result — click it to read the briefing, or check it to regenerate. Select missing cells, pick up to 20 combinations, and choose Generate selected.

Time windowTypical use
TodayWhat landed in the library since this morning.
Last 3 daysThe short catch-up after a busy couple of days.
Last weekA weekly briefing per topic.
Last monthTrend-level view of where a topic moved.
Last 6 monthsMedium-term retrospective.
Last yearThe long arc of a category.

How a digest is built

  • LM Studio first condenses the matching posts in bounded batches, then writes one source-grounded briefing from those summaries.
  • Each section links back to its supporting posts; relevant saved images and videos appear with the original source cards.
  • The queue is created immediately and processed sequentially, keeping exactly one LM Studio request active at a time.
  • Empty combinations are reported and skipped. A failure in one digest does not stop the rest of the queue.
  • Completed digests are stored in SQLite and stay available across restarts.
  • A chat model must be loaded in LM Studio. Semantic embeddings are not required for this feature.

Digests stay deliberately category-specific so each saved briefing has one stable category identity. The single-category generator remains available for quick one-off briefings, and the All posts toolbar has a Digest matrix shortcut.

Project Intelligence

This is the feature that makes a saved-post archive actionable: pick one of your local Codex projects and ask what the last week of saved posts actually means for that codebase.

Profiling a project

  • Digester reads the project name and primary folder from Codex's local project registry — there are no manual metadata fields to fill in.
  • LM Studio infers concise focus notes from the project's current evidence.
  • A scan inventories readable code, documentation and recent Git work. It skips secrets, dependencies, caches, generated output, model weights and large or binary files.
  • The resulting implementation profile cites the project-relative files that support each capability or limitation.
  • Malformed local-model JSON is repaired when possible, retried once in a compact form, and then safely recovered from validated LM-generated component notes.

Impact digests

  • Generate an impact digest for today, three days, a week, a month, six months or a year — optionally narrowed to one post category.
  • The report only keeps developments supported by both saved posts and project evidence.
  • It contains the current implementation, a capability comparison, pros, cons and unknowns, recommendations, source URLs and media, project file evidence, and prioritized next steps.
  • Colored topic tags, expandable implementation cards and report sections, and an On this page index keep large profiles navigable. Open/closed sections stay stable while background progress arrives, and Expand all / Collapse all sit at the top.

Deep analysis

Click a topic tag, choose Deep analyze on an implementation or finding, or type a topic into Explore a topic. This rereads the project folder — not just the stored profile — searches within files for topic-specific source excerpts, and retrieves matching saved posts and comments through the existing RAG search. Compatible embeddings enable hybrid retrieval; keyword search works without an embedding model. This searches the whole saved library, independent of the impact digest's date and category filters.

A topic report includes implementation comparisons, pros and cons, concrete evaluation steps, original posts and media, and expandable source excerpts. Reports are saved in the project's digest history and are reachable through the read-only MCP tools.

Deep-analysis boundLimit
Directory entries walked20,000
Candidate text searched24 MB
Matching files reviewed28
Excerpt characters reviewed120,000, in batches

Coverage and retrieval-fallback warnings appear in the saved report. Deep analysis does not run project code, execute benchmarks, or verify social-media claims.

Ask Your Library

LM Studio's local OpenAI-compatible server provides embeddings and grounded question answering. Build semantic index in the Ask view creates the embeddings; keyword search works without that step and embeddings simply improve conceptual retrieval.

  • Ask searches the entire archive by default. Enable Use current Library filters only when the answer should be constrained to the active source, category, date, media or workspace filters.
  • Retrieval prioritizes exact keyword matches while the semantic index is still incomplete.
  • Results return distinct posts rather than many chunks from the same page.
  • The retrieval mode and semantic coverage are shown below every answer, so you always know how much of the library the answer could actually see.
  • Embeddings are stored alongside chunks as JSON vectors — the archive stays self-contained and needs no separate vector service.

Technical Notes: How Digester Uses Models

Digester has three independent model slots in Settings, because the three jobs have very different demands. Pointing all of them at one flagship model works, but it wastes VRAM on tasks that do not need it.

SlotUsed forOutput budgetTemperature
lmstudio_chat_model
Chat — most demanding
Digest batch summaries and the final briefing, translation, Ask Library, project profiling and impact reports.1,400 – 6,500 tokens depending on the step0.1 – 0.2
lmstudio_category_model
Category — moderate
Classifying one post into 0–3 categories, and category discovery over batches of posts.300 tokens per post, 1,800 for discovery0 – 0.1
lmstudio_embedding_model
Embedding — lightweight
Vectors for hybrid semantic retrieval. Entirely optional — keyword search works without it.n/an/a

Fallbacks

  • If no category model is set, categorization falls back to the chat model.
  • Translation uses the chat model, or the category model when no chat model is selected.
  • Without a chat model, digests and project reports are reported as skipped rather than failing repeatedly.
  • Without an embedding model, retrieval silently stays keyword-only and the Ask view reports the reduced semantic coverage.

Why temperature is low everywhere

Nearly every call asks for strict JSON against a fixed schema — category assignments, digest sections with citations, project findings with file evidence. Consistency matters far more than creativity, so temperatures sit between 0 and 0.2. A model that is unreliable at structured output will cause more visible failures here than a model that is merely a little less eloquent.

Vision models are supported — and used

During categorization, Digester attaches up to two images per post as base64 data URLs. A vision-language model uses them; a text-only model rejects them and Digester silently retries text-only, so nothing breaks either way.

It matters more than it sounds. A post reading "check out this render I made" with an attached image categorizes as Art from text alone, but as 3D Rendering, Digital Art, Design when the model can actually see the picture. Screenshots of code, technical diagrams, artwork and memes all classify noticeably better with a VL model in the category slot.

Recommended Local Models

The sweet spot is a mid-size chat model plus a small vision model for categories. The setups below are the ones actually benchmarked against this app; VRAM figures assume Q4 quantization.

🎯 Recommended — vision & speed

Chat modelQwen3.5-9B — ~5 GB
Category modelQwen2.5-VL-7B-Instruct — ~4 GB, image support
Total VRAM~9 GB with both loaded
Trade-off3–4× faster than a 35B, image-aware categorization, quality still excellent for this workload.

🏆 Highest quality

Chat modelQwen3.8-27B — ~14 GB
Category modelGemma-4-12B — ~6 GB, strong classifier
Total VRAM~20 GB
Trade-offBetter digests on dense technical content, but no image support in categorization.

💰 Budget — smallest workable

Chat modelQwen3-8B — ~4 GB
Category modelQwen2.5-VL-7B-Instruct — ~4 GB
Total VRAM~7 GB
Trade-offKeeps image support under 8 GB. Digest quality drops noticeably on long or technical windows.

Model comparison

ModelVRAM (Q4)Best slotImagesNotes
Qwen3.8-27B~14 GBChatNoBest digest quality.
Qwen3.5-9B~5 GBChatNoThe balanced default.
Qwen3-8B~4 GBChatNoBudget chat slot.
Gemma-4-12B~6 GBCategoryNoExcellent pure classifier.
Qwen2.5-VL-7B~4 GBCategoryYesBest value in the category slot.
Qwen3-VL-32B~16 GBCategoryYesOnly worth it with VRAM to spare.
Devstral-Small-24B~12 GBChatNoCode-focused; pairs well with Project Intelligence.

Widely available alternatives

If you are starting from a clean LM Studio install rather than an existing model library, these are easy to obtain and behave well against this app's strict-JSON prompts:

  • Chat slot: Qwen2.5-14B-Instruct (Q4_K_M, ~7 GB) is the best single all-rounder — it can run every slot on its own if you only want one model. Llama 3.1-70B beats it if you have ~35 GB free; Mistral-Large-2 and DeepSeek-V3 are comparable at the top end.
  • Category slot: Qwen2.5-7B-Instruct is roughly 95% as good as a 35B at classification for a fraction of the VRAM. Llama 3.2-8B and Phi-3.5-mini are solid baselines.
  • Embedding slot: use a dedicated embedding model, never a chat model — nomic-embed-text-v1.5 (~4 GB) is the recommendation, BAAI/bge-small-en-v1.5 (~2 GB) if VRAM is tight. Both index the library roughly an order of magnitude faster than a general chat model.

Rough performance expectations

Operation9B class35B class
Categorize one post2–3 s5–8 s
Generate one digest30–60 s60–120 s
Translation batch10–20 s20–40 s

Two practical notes. Digests hold one LM Studio request active at a time by design, so a smaller, faster chat model shortens the whole queue roughly linearly — this is where model choice is felt most. And because the GPU idle analyser only starts automatic digests on genuinely idle cards, a setup that leaves headroom (say 9 GB rather than 20 GB) gets far more automatic runs in a normal working day.

Automatic English Translation

Japanese, Korean and Chinese (simplified and traditional) post titles, post text and captured replies are queued for English translation automatically. Existing library content is backfilled on startup; new crawls and imports join the same persistent queue. No recrawl is needed.

  • English is shown by default with an expandable Show original section. Original records are never overwritten.
  • URLs, Markdown destinations, mentions and code are protected before translation and checked afterwards. A changed or missing protected token makes the result fail validation rather than replace a link.
  • Image and video pixels, and text inside code, are not translated.
  • The library's Auto-English indicator shows queue progress and offers Retry now for delayed translations.
  • Missing model configuration leaves work pending; offline or model errors retry with backoff. Translation only starts new requests while other background work is idle.
  • Successful translations are cached across restarts and recrawls. Changing a post or reply invalidates only its own translation, and stale in-flight results are discarded.
  • Stored translations are included in full-text and RAG search, future categorization and digest inputs, JSONL/Markdown exports, and MCP post results. Previously written digests are not rewritten.

LM Studio uses your configured chat model, or the categorization model if no chat model is selected. Rebuild the semantic index after a backfill to embed the updated English-containing chunks — keyword retrieval works immediately.

Automatic Linked-Page Capture

A post that is just a link is worthless in an archive. Digester follows outbound links from newly crawled and imported posts and stores the readable page text alongside the post, so the actual content becomes searchable.

By default it reads public pages on GitHub (including raw README text), Hugging Face, Civitai, X/Twitter, Twitch and arXiv. Open Settings → Linked-page capture to pause new requests or edit the exact hostname allowlist.

  • Each post gets an expandable Linked content section with the original URL, resolved destination, capture time, readable text and a captured / partial / blocked / failed status.
  • Failed requests retry after five minutes, up to three attempts. Retry failed links handles them on demand.
  • Pages are cached in SQLite across restarts and recrawls, and shared when several posts cite the same URL.
  • Scan existing posts for links runs a safe catch-up over every collection: it queues only missing links, reuses captured or partial pages, and leaves active requests, failed retries, originals, categories and translations intact. It never bypasses the allowlist or retries blocked redirects.
  • Linked text is added to keyword search immediately, and to categorization, category discovery, digests and project comparisons. Run Index library after capture to embed the new RAG chunks.
  • Previously saved truncated display URLs cannot be reconstructed — recrawl those posts to capture their real hyperlink destinations.
Provenance tagging — how captured text is handed to the model

Markdown exports and RAG context use escaped, provenance-tagged source text, so the model always knows the passage came from an untrusted external page:

provenance tag
<linked_content original_url="https://t.co/example"
                source_url="https://github.com/org/repo"
                fetched_at="..." status="complete" trust="untrusted_source">
Page title and readable source text
</linked_content>
Safety & coverage limits — hosts, redirects, depth, rate, size
RuleLimit
HostsExact allowed hostnames only, HTTPS on port 443, public DNS addresses only, pinned to the validated address per request.
RedirectsEvery redirect checked independently, at most five. t.co may resolve links but is never accepted as page content.
DepthOne hop from the post, at most 12 links per post.
RateOne request job every three seconds, and only while no foreground crawl or model job is running.
Page size3 MB, 30 seconds, 24,000 readable characters. Longer captures are marked partial.
Request modeAnonymous: no browser cookies, credentials, JavaScript execution, recursive crawling, media downloads, or authentication / age-check / CAPTCHA bypass.
JS-heavy sitesX, Twitch and similar may expose only metadata or no public text. Those captures are marked partial or failed, never advertised as full transcripts.
arXivAbstract pages work; PDF downloads are intentionally excluded.

Allowlisting is a network policy, not a guarantee of safe or accurate content. Fetched text is displayed escaped and treated as untrusted reference data by the LLM. Dates describe the capture, not the date of every claim. Removing an allowed host removes its cached text from retrieval. Imports preserve link associations and refetch pages rather than trusting imported capture text.

Automation: Scheduled Crawling

The selected collections are re-read on a fixed interval — the default is X Bookmarks every 30 minutes — using the same saved browser session as a manual crawl. No developer API keys are involved, and nothing is posted, liked or followed.

  • A cycle is skipped, with the reason recorded on the Automation page, when the platform is not signed in or another crawl, indexing, categorization or digest job is already running. A skipped cycle never leaves a failed entry in Activity.
  • Runs appear in Activity as a parent automatic row plus one row per collection, so a scheduled crawl is never mistaken for a manual one.
  • The interval, the collections and an optional per-run post limit are configurable. A blank limit uses the crawl limit from Settings.
  • The next run time is shown on the page and the schedule survives restarts: a restart does not repeat a crawl that already ran inside the interval.

Automation: The GPU Idle Analyser

Digest generation competes with your own models for the same card, so Digester waits for a genuinely idle GPU instead of a fixed time of day. It reads nvidia-smi directly — it never loads a model or runs a benchmark to probe the cards.

SettingDefaultDescription
Utilization threshold15%A card counts as idle below this utilization.
Window10 minutesThe rolling period that is evaluated.
Required idle share98%How much of the window must be idle before a digest starts.
Device indices(auto)Pin the cards explicitly, e.g. 0,2. Always takes precedence.
Cooldown180 minutesMinimum gap between automatic digest runs.
Crawl interval30 minutesSchedule for automatic collection crawling.

Why it watches the right cards

  • LM Studio runs inference in a separate llama-server backend process, and one model can be split across several cards. The analyser follows those inference processes to the cards they hold and watches that whole set.
  • The LM Studio.exe desktop process is deliberately ignored: it is Electron and holds a graphics context on whichever card the window is drawn on — usually not an inference card at all. On the machine this was verified on, that distinction is the difference between watching the RTX 5090 and watching the RTX 4080 + RTX 5080 that actually run LM Studio.
  • Nothing is guessed. If the LM Studio cards cannot be identified, the page says so and no digest is generated.
  • A failed nvidia-smi reading is never counted as idle time, so a driver problem pauses digest generation instead of triggering a burst of it.
  • While the window is still filling, the page reports how many samples have been collected out of the expected number, and no digest starts.

Selecting what an idle run may produce

Digests to create while idle takes either every category — including categories you add later — or a named subset, plus the time windows. Each selected category/window pair becomes one digest, created sequentially in the order shown, with at most one LM Studio request active at a time. Empty windows are skipped silently rather than reported as failures.

Both behaviours are independent and either can be paused without affecting the other. Both can also be triggered on demand with Crawl now and Generate now, which ignore the schedule and the GPU rule so a configuration can be verified immediately. Without a chat model configured, an automatic run is reported as skipped instead of failing repeatedly.

AI / IDE Access Through MCP

A bundled read-only MCP server makes the library available to Codex, Cursor, Claude Desktop and DeepSeek Harness. The dashboard does not have to be running: the MCP process opens the same SQLite database directly.

Open IDE access in the dashboard to copy configuration containing the exact Node and project paths for your machine.

The eleven read-only tools

ToolReturns
search_social_libraryRetrieval over the archive, with the optional library filters.
get_social_postOne post including linked_pages.
list_recent_social_postsThe newest posts in the library.
list_social_categoriesEvery category with its description.
social_library_statsCounts and coverage for the archive.
list_category_digestsSaved briefings per category and window.
get_category_digestOne full briefing with its citations.
list_project_profilesProfiled local projects.
get_project_profileOne implementation profile with file evidence.
list_project_impact_digestsImpact and topic reports for a project.
get_project_impact_digestOne full impact or topic report.
Codex — custom-MCP form and config.toml

Fill the custom-MCP form exactly like this:

FieldValue
Namelocal_lore
TypeSTDIO
Command to startthe displayed node.exe path
Argumentsthe displayed src\mcp.js path, as one argument
Environment variablesleave empty
Working directorythe displayed project folder

One trap: mcp_servers.local_lore is the TOML section name, not the executable command for that form.

config.toml
[mcp_servers.local_lore]
command = "C:\\Program Files\\nodejs\\node.exe"
args = ["<project>\\src\\mcp.js"]
cwd = "<project>"
Cursor & Claude Desktop — mcpServers JSON
mcp.json
{
  "mcpServers": {
    "local-lore": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": ["<project>\\src\\mcp.js"],
      "cwd": "<project>"
    }
  }
}

Restart the AI client after adding the server.

DeepSeek Harness — Cordis patch layer (and its two traps)

DeepSeek Harness does not read an mcpServers JSON or a config.toml. It loads MCP servers from a Cordis patch layer, so the entry is YAML. The DeepSeek Harness tab under IDE access shows the exact path and snippet for your machine, and Install into DeepSeek Harness creates the patch file when it does not exist.

cordis.patch.yml
- insert:
    - id: mcp-local-lore
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: local_lore
        transport: stdio
        command: 'C:\Program Files\nodejs\node.exe'
        args: ['<project>\src\mcp.js']
        env: {}
        cwd: '<project>'

The entry goes into %DSH_HOME%\cordis.patch.yml for every profile, or %DSH_HOME%\profiles\<profile>\cordis.patch.yml for one. %DSH_HOME% defaults to %USERPROFILE%\.dsh.

Two details are easy to get wrong:

  • Keep the insert: wrapper. A bare id/name/config row is treated as an override for an existing row rather than an insertion, and is dropped silently.
  • Quote the Windows paths with single quotes so YAML does not read \P in C:\Program Files as an escape sequence.

If the patch file already contains other entries, Digester leaves it untouched and shows the snippet to paste by hand, because that file is shared configuration. DeepSeek Harness reloads patch layers live, so only a new session is needed — not a restart — and the tools appear as mcp__local_lore__<tool>. Note that DeepSeek Harness does not apply its file or command sandbox to MCP child processes: the server runs with the same privileges as the harness host. Digester's MCP server is read-only and requires no elevated access.

Storage & Exports

All mutable data is ignored by Git and stored below data/:

data directory
data/
  ├── local-lore.db
  ├── browser-profiles/
  │   ├── x/
  │   └── reddit/
  ├── session-cookies/
  │   ├── x.json
  │   └── reddit.json
  └── media/
      ├── x/
      └── reddit/

The database uses normalized items, item_collections, categories, item_categories, category_suggestion_jobs, digests, projects, project_digests, comments, media, chunks, item_workspace and saved_views tables. Embeddings live alongside chunks as JSON vectors, so the archive stays self-contained.

  • Export current view writes one JSON object per line with stable fields for RAG pipelines.
  • /api/export?format=markdown provides a human-readable alternative.
  • The JSONL importer understands both Digester exports and compatible normalized records. Re-import restores notes, stars and read state.
  • Selected posts can be exported as Markdown or JSONL from the bulk-action toolbar.
  • JSONL is a record export, not a complete backup. It contains media references, not media files, settings, saved views or account cookies — keep a separate backup of the data directory if you need one.

Activity & Job Handling

  • The Activity view keeps a local history of every operation, with status and text filters over the latest 30 entries.
  • Clear failures removes all failed entries at once; × removes an individual completed or failed row.
  • Active and queued operations cannot be removed. Queued collections start sequentially.
  • If the service restarts during a job, that abandoned job is marked failed on the next startup instead of sitting under In progress forever.
Screenshot of the Digester Activity view: the list of operations with their status badges for in progress, queued, completed and failed, the parent automatic crawl row with its child rows per collection, the status and text filter controls, and the Clear failures button.
Activity: every crawl, index, categorization and digest job
Screenshot of the Digester Settings dialog: the LM Studio base URL field defaulting to http://127.0.0.1:1234/v1, the optional API key field, the chat model and embedding model selectors, the crawl limit field, and the Linked-page capture section with the pause toggle, the hostname allowlist editor and the Existing library scan button.
Settings: LM Studio, crawl limits and linked-page capture

Getting Started

Node.js 20 or newer is required. For a fresh checkout:

powershell
npm install
  npx playwright install chromium
  npm start

On a machine that already has its dependencies installed, double-click start-local-lore.bat or run npm start. The launcher starts the local service in the background, waits until port 4317 is ready, and only then opens http://127.0.0.1:4317 — so you never land on a temporary ERR_CONNECTION_REFUSED page. If it finds an instance inherited from a network-restricted terminal or an older build, it replaces that process automatically.

First-time setup

  1. Open Sources, enter your X handle and Reddit username, and select the collections you want.
  2. Choose Open Google Chrome per platform and sign in, or import cookie JSON. Then Verify session.
  3. Choose Start crawl, or Run unattended workflow to crawl, categorize and generate the first digests in one go.
  4. Open Settings and point Digester at LM Studio — the default URL is http://127.0.0.1:1234/v1. Load a chat model and, optionally, an embedding model.
  5. Choose Build semantic index in the Ask view. Keyword search already works without it.
  6. In Library, select Categorize uncategorized, then use Discover to find the themes you did not think of.
  7. Open Digests and generate your first briefings from the matrix.
  8. Open Projects, pick a local project, and generate an impact digest.

Safety & Practical Limits

  • The crawler contains no code for posting, liking, voting, following or messaging. It reads, nothing else.
  • The server binds to 127.0.0.1 only. LM Studio URLs are restricted to localhost or private-network addresses.
  • Media downloads are restricted to known X, Reddit and LinkedIn media hosts and capped at 25 MB per file.
  • Social websites change their HTML periodically. If a crawl suddenly returns zero posts, the selectors may need a small update.
  • Some streaming video URLs are browser-only blobs or segmented streams. Digester keeps the post URL and downloads media only when a durable source URL is available.
  • Use conservative crawl limits and follow the platforms' terms and rate limits.
  • Your login session lives in a local browser profile. Treat exported cookies like a password: never share or commit them.

Under the Hood

A small Express service with a dependency-free browser UI — no build step, no frontend framework, no bundler.

FileResponsibility
src/server.jsThe Express service and the whole HTTP API.
src/crawler.jsPlaywright collection for X, Reddit and LinkedIn.
src/db.jsSQLite schema, FTS5 and every query.
src/llm.jsLM Studio calls: categorization, embeddings, digests, project reports.
src/mcp.jsThe read-only MCP server.
src/automation-worker.jsScheduling for automatic crawls and idle digests.
src/gpu-monitor.jsnvidia-smi sampling and the idle rule.
src/digest-targets.jsThe category/time-window identity shared by dashboard and worker.
src/link-policy.js / link-fetcher.js / link-worker.jsAllowlist enforcement, page capture and the background queue.
src/translation-worker.jsThe persistent English translation queue.
src/project-scanner.js / codex-projects.jsLocal project inventory and the Codex project registry.
public/app.jsThe dashboard UI.

Built on Express 5, better-sqlite3, Playwright, cheerio, ipaddr.js, zod and the official MCP SDK. Checks and tests run with npm run check and npm test.

Source Code

Digester lives in a self-hosted GitLab repository. It is private and invite-only — the link will not open without an account that has been granted access.

https://gitlab.aikanova.com/nerdpraxis/Twitter_Reddit_verarbeiter

Open the Repository →