<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: BurlacuAndrei</title>
    <description>The latest articles on DEV Community by BurlacuAndrei (@burlacuandrei).</description>
    <link>https://dev.to/burlacuandrei</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F423603%2Fe2fc4c94-7fb6-41bd-b8d7-9edfc5251acb.jpeg</url>
      <title>DEV Community: BurlacuAndrei</title>
      <link>https://dev.to/burlacuandrei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/burlacuandrei"/>
    <language>en</language>
    <item>
      <title>Bookmark Managers Are Graveyards: Why I Built a Single-Binary Go + SQLite Action Engine</title>
      <dc:creator>BurlacuAndrei</dc:creator>
      <pubDate>Wed, 11 Nov 2026 11:17:43 +0000</pubDate>
      <link>https://dev.to/burlacuandrei/bookmark-managers-are-graveyards-why-i-built-a-single-binary-go-sqlite-action-engine-3229</link>
      <guid>https://dev.to/burlacuandrei/bookmark-managers-are-graveyards-why-i-built-a-single-binary-go-sqlite-action-engine-3229</guid>
      <description>&lt;p&gt;You save 200 interesting links. You open maybe four. The rest rot in a folder called &lt;strong&gt;"Later"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Like most developers, I have self-hosted or used almost every read-it-later and bookmark tool out there. They are all great at &lt;em&gt;saving&lt;/em&gt; links—and terrible at helping you &lt;em&gt;do&lt;/em&gt; anything with them.&lt;/p&gt;

&lt;p&gt;The missing piece wasn't another bookmark folder. It was an &lt;strong&gt;action engine&lt;/strong&gt; that sits between messy daily capture and your clean knowledge base or task board.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Sparkkeep&lt;/strong&gt; (&lt;code&gt;v0.1.0&lt;/code&gt;, AGPL-3.0): a single-binary, self-hosted capture, AI triage, and deterministic deep-research engine.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/BurlacuAndrei" rel="noopener noreferrer"&gt;
        BurlacuAndrei
      &lt;/a&gt; / &lt;a href="https://github.com/BurlacuAndrei/sparkkeep" rel="noopener noreferrer"&gt;
        sparkkeep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Self-hosted capture &amp;amp; AI action engine. Turn links, notes, and chat messages into triaged execution boards, cited research dossiers, and Obsidian/Notion notes.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sparkkeep&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Capture anything. Triage it with AI. Ship what matters.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sparkkeep is a self-hosted action engine for the ideas you keep collecting and never execute. Share a link, a note, a voice memo, or a screenshot — it scrapes it, filters the noise, synthesizes an actionable brief, and puts it on a board you actually work from.&lt;/p&gt;
&lt;p&gt;One binary. One SQLite file. No Postgres, no Redis, no cloud account.&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/ci.yml/badge.svg" alt="CI Status"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/docker.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/docker.yml/badge.svg" alt="Docker Build"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/scorecard.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/BurlacuAndrei/sparkkeep/actions/workflows/scorecard.yml/badge.svg" alt="OpenSSF Scorecard"&gt;&lt;/a&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5b003be51c3b3283fc1aae2515044f5f129181f5f7518596b4d0be0ad0fcaf13/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f4275726c616375416e647265692f737061726b6b6565703f696e636c7564655f70726572656c656173657326636f6c6f723d373932384341" alt="Release"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/pkgs/container/sparkkeep" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb23acb26d729730dba119e2cee0a542785c427cada609aa9159d7dc4f2de62c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e7461696e65722d676863722e696f2d73756363657373" alt="Container"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/go.mod" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fcc9bcd2811e20c7efbc68bff136c0b652330796191107b67c446999ec218c32/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f676f2d6d6f642f676f2d76657273696f6e2f4275726c616375416e647265692f737061726b6b656570" alt="Go Version"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c77148b2545a6460d987db4f36a4e1c7e4641c3d9f8ab7b25b0afbdfaddb2061/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4147504c2d2d332e302d626c75652e737667" alt="License: AGPL-3.0"&gt;&lt;/a&gt;
  &lt;br&gt;
  
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d51c946110354adf1105959e8d3229c8f5072e2d91e2b1df65e895352ca8e3ce/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f4275726c616375416e647265692f737061726b6b6565703f7374796c653d666c6174266c6f676f3d67697468756226636f6c6f723d656162333038" alt="GitHub Stars"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/BurlacuAndrei/sparkkeep/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/10b2bc3c5fe42a741a0efd173de77daec18c74ba53386442bbf316d31ba8325a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6d6d756e6974792d4973737565732d626c756576696f6c65743f6c6f676f3d676974687562" alt="Issues"&gt;&lt;/a&gt;
  &lt;a href="https://ko-fi.com/andreiburlacu" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d8676e8af5802aff913a32b0d5305edcfa980066eff02d8fd4e13f103b81b940/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4b6f2d2d66692d4275792532306d6525323061253230636f666665652d6666356535623f6c6f676f3d6b6f2d6669266c6f676f436f6c6f723d7768697465" alt="Ko-fi"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/sponsors/BurlacuAndrei" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/54d3d0c99a5e56e8cb141e1967cbb34d5e2015ee7570ab32bf113e0a0b27976b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53706f6e736f722d2545322539442541342d6561346161613f6c6f676f3d6769746875622d73706f6e736f7273266c6f676f436f6c6f723d7768697465" alt="GitHub Sponsor"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/BurlacuAndrei/sparkkeep/docs/assets/dashboard-hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FBurlacuAndrei%2Fsparkkeep%2FHEAD%2Fdocs%2Fassets%2Fdashboard-hero.png" alt="Sparkkeep Execution Board with Focus Spotlight and Execution Pulse" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Bookmark managers are graveyards&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;You save 200 interesting links. You open maybe four. The rest rot in a folder called "later".&lt;/p&gt;

&lt;p&gt;Sparkkeep is not a bookmark manager. It is an action engine:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Capture ──► Noise Gate ──► AI Triage ──► Horizon Routing ──► Execution Board ──► Research ──► Digest ──► Shipped
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; from Telegram, Discord, Slack, the browser extension, a webhook, or a plain note with no URL at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter&lt;/strong&gt; engagement bait and spam before it reaches your inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthesize&lt;/strong&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/BurlacuAndrei/sparkkeep" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;






&lt;h2&gt;
  
  
  The Pipeline: From Messy Capture to Shipped Work
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Capture ──► Noise Gate ──► AI Triage ──► Horizon Routing ──► Execution Board ──► Research ──► Digest ──► Shipped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture from anywhere:&lt;/strong&gt; Send a URL, voice memo, screenshot, or raw URL-less note via a two-way &lt;strong&gt;Telegram&lt;/strong&gt; bot, &lt;strong&gt;Discord&lt;/strong&gt; embeds/buttons, &lt;strong&gt;Slack&lt;/strong&gt; Block Kit, the &lt;strong&gt;Chrome/Firefox Web Clipper&lt;/strong&gt;, or a universal webhook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter the noise:&lt;/strong&gt; A fast noise gate scores and filters engagement bait before it clutters your inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthesize an actionable brief (100% BYOK / Local LLM friendly):&lt;/strong&gt; Using &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;LM Studio&lt;/strong&gt;, &lt;strong&gt;vLLM&lt;/strong&gt;, &lt;strong&gt;OpenAI&lt;/strong&gt;, or &lt;strong&gt;DeepSeek&lt;/strong&gt;, Sparkkeep extracts a TL;DR, &lt;em&gt;why it matters&lt;/em&gt;, and a concrete checklist of next steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swipeable Triage Deck &amp;amp; Execution Board:&lt;/strong&gt; Burn through your unreviewed inbox with &lt;code&gt;1&lt;/code&gt; / &lt;code&gt;2&lt;/code&gt; / &lt;code&gt;3&lt;/code&gt; / &lt;code&gt;Esc&lt;/code&gt;, route cards into &lt;strong&gt;Now / Next / Later&lt;/strong&gt;, and execute from a widescreen board with a &lt;strong&gt;Focus Spotlight&lt;/strong&gt; and &lt;strong&gt;7-day Execution Pulse&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9zpscvxhx240e7a2vtdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9zpscvxhx240e7a2vtdd.png" alt="Swipeable Triage Deck" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Deterministic Research Playbooks Beat Unbounded Agent Loops
&lt;/h2&gt;

&lt;p&gt;When I tried wiring autonomous ReAct agents to research saved technical topics, two things happened:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Small local models (7B–14B) got stuck in repetitive search loops.&lt;/li&gt;
&lt;li&gt;Cloud API models burned unpredictable token budgets and still hallucinated citations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of open-ended loops, Sparkkeep ships with &lt;strong&gt;Playbook Studio&lt;/strong&gt;—a bounded, visual step sequencer with a &lt;strong&gt;5-Pillar Research Health Linter&lt;/strong&gt;, token cost estimator, zero-cost dry runs, and &lt;strong&gt;SearXNG&lt;/strong&gt; web search integration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13wawyn9mv3coy0n9feu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13wawyn9mv3coy0n9feu.png" alt="Playbook Studio" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every research run produces a cited &lt;strong&gt;Research Dossier&lt;/strong&gt; with a clear &lt;strong&gt;Pursue / Watch / Skip&lt;/strong&gt; verdict:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4u0qjntp6cdmun43bri8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4u0qjntp6cdmun43bri8.png" alt="Deep Research Dossier" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Knowledge Sinks, Not a Walled Garden
&lt;/h2&gt;

&lt;p&gt;Sparkkeep is the staging and research desk in front of your permanent notes. When a card moves into active work (&lt;code&gt;To-Do&lt;/code&gt;, &lt;code&gt;In Progress&lt;/code&gt;, &lt;code&gt;Done&lt;/code&gt;) or completes deep research, Sparkkeep automatically exports it idempotently to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt; (clean Markdown + YAML frontmatter mirrored directly to your vault)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt; (auto-provisioned database properties + rich Notion blocks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joplin&lt;/strong&gt; (Self-Hosted Joplin Server or Desktop Web Clipper API)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticated Outbox RSS&lt;/strong&gt; &amp;amp; 1-click intents for &lt;strong&gt;Logseq, Things 3, Todoist, and GitHub Issues&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at the end of the week, the &lt;strong&gt;Intelligence Digest&lt;/strong&gt; synthesizes your shipped wins, flags stale bottlenecks, and prepares your next focus items:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwavrcjo52msosgx5u50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwavrcjo52msosgx5u50.png" alt="Intelligence Digest" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Under the Hood: One Binary, One SQLite File (&amp;lt;30 MB RAM)
&lt;/h2&gt;

&lt;p&gt;I wanted Sparkkeep to run effortlessly on a Raspberry Pi, home NAS, or €5 VPS without maintaining Postgres, Redis, or Meilisearch containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go 1.26 Standard Library HTTP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure-Go SQLite (&lt;code&gt;modernc.org/sqlite&lt;/code&gt;, zero CGO)&lt;/strong&gt; in WAL mode with &lt;strong&gt;FTS5&lt;/strong&gt; full-text search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 19 + TypeScript + Vite&lt;/strong&gt; compiled into &lt;code&gt;internal/web/dist&lt;/code&gt; and embedded into the Go binary via &lt;code&gt;//go:embed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 UI Languages out of the box:&lt;/strong&gt; English, Romanian, Spanish, Portuguese (Brasil), French, and German&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It in 10 Seconds (Includes a 1-Click Demo Library)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run -d \
  --name sparkkeep \
  -p 8080:8080 \
  -v sparkkeep_data:/data \
  ghcr.io/burlacuandrei/sparkkeep:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:8080&lt;/code&gt;. The first-run setup wizard includes a &lt;strong&gt;1-click Demo Library&lt;/strong&gt; so you can explore the Execution Board, Triage Deck, Playbook Studio, and Research Dossiers before connecting an AI provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Support &amp;amp; Feedback
&lt;/h3&gt;

&lt;p&gt;If Sparkkeep looks useful for your workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;a href="https://github.com/BurlacuAndrei/sparkkeep" rel="noopener noreferrer"&gt;&lt;strong&gt;Star Sparkkeep on GitHub&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;☕ &lt;a href="https://ko-fi.com/andreiburlacu" rel="noopener noreferrer"&gt;&lt;strong&gt;Buy me a coffee on Ko-fi&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💖 &lt;a href="https://github.com/sponsors/BurlacuAndrei" rel="noopener noreferrer"&gt;&lt;strong&gt;Sponsor on GitHub&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear what capture channels, local models, or knowledge sinks you're using in your stack—drop a comment below!&lt;/p&gt;

</description>
      <category>go</category>
      <category>selfhosted</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
