<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>K@workflow on Martin Sukany</title><link>https://sukany.cz/tags/k@workflow/</link><description>Recent content in K@workflow on Martin Sukany</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 12 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://sukany.cz/tags/k@workflow/index.xml" rel="self" type="application/rss+xml"/><item><title>Bridging reMarkable and Emacs Org-mode</title><link>https://sukany.cz/blog/2026-03-12-remarkable-org-mode/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://sukany.cz/blog/2026-03-12-remarkable-org-mode/</guid><description>&lt;h2 id="why-i-still-write-on-paper"&gt;Why I still write on paper&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s something that happens when I pick up a pen that doesn&amp;rsquo;t happen when I open a new buffer. The thinking is different — less filtered, less structured, more honest. Ideas that would never survive the friction of forming a heading and choosing a tag actually get written down. First drafts of decisions, rough task lists, things I&amp;rsquo;m trying to work out, all of it lands on paper before it&amp;rsquo;s ready to be digital.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried replacing this with digital tools. Org-capture is excellent for structured input, but for capturing a fleeting thought mid-meeting or sketching out a problem while commuting, I still reach for paper. The reMarkable is my compromise: it&amp;rsquo;s close enough to writing on paper that it doesn&amp;rsquo;t disrupt the thinking, and close enough to a computer that the notes don&amp;rsquo;t stay trapped on dead wood.&lt;/p&gt;
&lt;p&gt;The problem is that notes on a reMarkable and notes in Org-mode don&amp;rsquo;t naturally talk to each other. This post is about the pipeline I built to close that gap.&lt;/p&gt;
&lt;h2 id="the-two-tools-and-why-they-complement-each-other"&gt;The two tools and why they complement each other&lt;/h2&gt;
&lt;p&gt;The reMarkable is good at one thing: letting you write without getting in the way. The e-ink display doesn&amp;rsquo;t glow, doesn&amp;rsquo;t notify you, doesn&amp;rsquo;t tempt you to check anything. The battery lasts days. The pen latency is low enough to feel like paper. Cloud sync happens automatically in the background — you don&amp;rsquo;t think about it. For first-pass capture of any kind of thinking, it&amp;rsquo;s hard to beat.&lt;/p&gt;
&lt;p&gt;Org-mode is good at different things. It&amp;rsquo;s plain text, version-controllable, programmable. It integrates with agenda, GTD-style workflows, time tracking, archiving. When information is in an &lt;code&gt;.org&lt;/code&gt; file, the full Emacs ecosystem is available — you can schedule it, tag it, refile it, clock time on it, link it to other notes. For organizing and acting on information, it&amp;rsquo;s where I want everything to end up.&lt;/p&gt;
&lt;p&gt;The gap is obvious. reMarkable is where I write things down. Org-mode is where things become actionable. Without a bridge, I was manually transcribing notes — which defeats most of the point of capturing on the device in the first place.&lt;/p&gt;
&lt;h2 id="how-the-sync-pipeline-works"&gt;How the sync pipeline works&lt;/h2&gt;
&lt;p&gt;The pipeline has three stages: download, recognize, and structure.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Download&lt;/em&gt; is handled by &lt;code&gt;rmapi&lt;/code&gt;, a command-line client for the reMarkable cloud API. It downloads notebooks as &lt;code&gt;.rmdoc&lt;/code&gt; files — the native reMarkable format, which is essentially a zip archive containing per-page binary stroke data and metadata. I run this for each notebook I want to sync.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Recognition&lt;/em&gt; is where handwriting becomes text. I use the MyScript Cloud API, which accepts raw reMarkable page data and returns recognized text. The API is HMAC-authenticated, accepts batched requests, and handles Latin-script handwriting well enough for practical use. The free tier covers 2000 pages per month, which is more than I need.&lt;/p&gt;
&lt;p&gt;One piece of engineering worth calling out: hash-based deduplication. Before sending a page to the API, the script computes a hash of the page content and compares it against a local cache. If the page hasn&amp;rsquo;t changed since the last run, it&amp;rsquo;s skipped. This matters in practice — a 20-page notebook where you&amp;rsquo;ve written 2 new pages today sends 2 pages to the API, not 20. Quota is preserved, and the run takes seconds.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Structuring&lt;/em&gt; is handled by a Python script that takes the raw recognized text from MyScript and organizes it into Org format. Each notebook becomes an &lt;code&gt;.org&lt;/code&gt; file; pages become headings or entries under headings, depending on how the notebook is organized. The results land in &lt;code&gt;emacs-org/remarkable/&lt;/code&gt;, organized by notebook name. A notebook called &amp;ldquo;Projects&amp;rdquo; on the device becomes &lt;code&gt;emacs-org/remarkable/Projects.org&lt;/code&gt; on disk.&lt;/p&gt;
&lt;p&gt;The whole thing runs nightly via cron at 02:00. By the time I open Emacs in the morning, yesterday&amp;rsquo;s handwritten notes are already there.&lt;/p&gt;
&lt;h2 id="notebook-structure-on-the-device"&gt;Notebook structure on the device&lt;/h2&gt;
&lt;p&gt;I keep three notebooks on the reMarkable that feed into this pipeline: &lt;code&gt;Projects&lt;/code&gt;, &lt;code&gt;Areas&lt;/code&gt;, and &lt;code&gt;Quick Sheets&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Projects&lt;/code&gt; holds working notes tied to specific projects — meeting notes, rough plans, things I&amp;rsquo;m working through. &lt;code&gt;Areas&lt;/code&gt; holds reference material and ongoing concerns that don&amp;rsquo;t have a deadline. &lt;code&gt;Quick Sheets&lt;/code&gt; is the capture inbox: whatever I write when I don&amp;rsquo;t want to think about where it belongs yet. Random ideas, to-do items, things to look up, fragments of thought.&lt;/p&gt;
&lt;p&gt;After nightly sync, Quick Sheets becomes the Org file I triage first. Something like &amp;ldquo;Call Jan re: contract renewal — deadline Friday&amp;rdquo; appears as a plain text entry. Turning it into a scheduled TODO in Emacs takes ten seconds. The capture happened on paper; the action lives in the agenda.&lt;/p&gt;
&lt;h2 id="what-works-well"&gt;What works well&lt;/h2&gt;
&lt;p&gt;HWR accuracy for clean, reasonably paced handwriting is high enough to be useful without heavy editing. Not perfect — there are occasional word-level errors — but close enough that the recognized text is readable and the context is always restorable even when individual words are off.&lt;/p&gt;
&lt;p&gt;The automation itself is reliable. Once the cron job is set up, I don&amp;rsquo;t think about it. Notes appear. The hash deduplication means I can re-run the script manually without worrying about duplicates accumulating.&lt;/p&gt;
&lt;p&gt;The Org integration is the payoff. Once notes are in &lt;code&gt;.org&lt;/code&gt; files, everything Emacs offers is available. Tags, scheduling, refiling into project files, linking to related notes — none of that required any special work on the reMarkable side. The device just needed to get the text into a file.&lt;/p&gt;
&lt;h2 id="limitations-and-honest-trade-offs"&gt;Limitations and honest trade-offs&lt;/h2&gt;
&lt;p&gt;The Czech diacritics problem is real. Fast or slightly sloppy handwriting, especially with Czech-specific characters like &lt;code&gt;ě&lt;/code&gt;, &lt;code&gt;š&lt;/code&gt;, &lt;code&gt;č&lt;/code&gt;, &lt;code&gt;ř&lt;/code&gt;, produces more recognition errors than clean Latin script. &amp;ldquo;Přečíst knihu o Kafkovi&amp;rdquo; might come out as &amp;ldquo;Precist knihu o Kafkovi&amp;rdquo;. Readable and context-restorable, but not clean. For notes that matter, a proofread pass is necessary.&lt;/p&gt;
&lt;p&gt;Symbols don&amp;rsquo;t transfer. Diagrams, arrows, flowcharts, mathematical notation — anything that isn&amp;rsquo;t text is either garbled or empty in the output. A page with a hand-drawn architecture diagram produces only the text labels, if anything. This is a known constraint of the HWR approach, not a bug in the implementation.&lt;/p&gt;
&lt;p&gt;The pipeline is one-directional and always will be. reMarkable is a capture device. You write on it; the notes flow to Org. Nothing flows back. This is fine for my workflow, but worth stating clearly.&lt;/p&gt;
&lt;p&gt;There are two external dependencies worth noting. rmapi requires reMarkable cloud credentials — if you don&amp;rsquo;t want to use the cloud, this pipeline doesn&amp;rsquo;t work as described. MyScript is a third-party API that requires registration and could change pricing or availability. The free tier has been stable, but it&amp;rsquo;s not self-hosted.&lt;/p&gt;
&lt;p&gt;Sync is nightly, not real-time. If I write something at 10pm and need it in Emacs immediately, I run the script by hand. But the default cadence is once a night, and for most of what I write, that&amp;rsquo;s enough.&lt;/p&gt;
&lt;h2 id="how-to-replicate-this"&gt;How to replicate this&lt;/h2&gt;
&lt;p&gt;The setup requires some comfort with Python, command-line tools, and cron. It&amp;rsquo;s not complex, but it&amp;rsquo;s also not a one-click install.&lt;/p&gt;
&lt;p&gt;Tools you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;rmapi&lt;/em&gt; — CLI for reMarkable cloud. Handles authentication and &lt;code&gt;.rmdoc&lt;/code&gt; download. (&lt;a href="https://github.com/juruen/rmapi"&gt;GitHub: juruen/rmapi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;MyScript Cloud API&lt;/em&gt; — Handwriting recognition. Register at &lt;a href="https://developer.myscript.com/"&gt;developer.myscript.com&lt;/a&gt; for a free API key. The batch endpoint accepts reMarkable page data directly.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Python 3&lt;/em&gt; — For the post-processing script that structures recognized text into Org format. Standard library is sufficient; no exotic dependencies.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;cron&lt;/em&gt; — For nightly scheduling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rough flow: configure rmapi with your reMarkable credentials, register for a MyScript API key, wire up the Python script to call both, point it at your Org directory, and schedule it. The deduplication cache is a simple JSON file mapping page hashes to recognized text — straightforward to implement.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not publishing the script as a ready-made package because it&amp;rsquo;s too tied to my specific notebook structure and Org conventions. But the components are all documented, the API is straightforward, and the overall architecture is simple enough to re-implement in an afternoon.&lt;/p&gt;
&lt;p&gt;The result: I write on paper and my agenda knows about it by morning. Not magic — just a cron job and a working API key.&lt;/p&gt;</description></item><item><title>Why I Use Two AI Assistants Instead of One</title><link>https://sukany.cz/blog/2026-03-12-two-ai-assistants/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://sukany.cz/blog/2026-03-12-two-ai-assistants/</guid><description>&lt;p&gt;I stopped asking my personal AI assistant to write code. That decision — more than any prompt engineering trick or model upgrade — improved the quality of what I get back. This post is about why, and what the setup actually looks like in practice.&lt;/p&gt;
&lt;h2 id="the-problem-with-asking-your-personal-assistant-to-write-code"&gt;The problem with asking your personal assistant to write code&lt;/h2&gt;
&lt;p&gt;My personal assistant, Daneel, knows a lot about me. It tracks my calendar, triages my email, controls my Home Assistant devices, remembers past conversations, and generates a morning briefing before I&amp;rsquo;ve had coffee. That rich context is exactly what makes it useful for life-admin. It&amp;rsquo;s also exactly what makes it a poor choice for writing code.&lt;/p&gt;
&lt;p&gt;When I asked Daneel to refactor a script in a session already loaded with calendar events, email threads, and device states, the suggestions came back hedged, occasionally irrelevant, and harder to trust. The model wasn&amp;rsquo;t broken — it was trying to reason across too many unrelated domains at once. Calendar management and Go module refactoring are not related problems, but they were sharing the same context window, and that matters.&lt;/p&gt;
&lt;p&gt;I think of it as desk space. A programmer works better with a clean desk focused on one problem than with every open project, email, and to-do list spread across the surface. A language model&amp;rsquo;s attention works the same way. Pack enough unrelated context into the window and the model starts making connections that aren&amp;rsquo;t there, hedging where it should be precise, or simply losing the thread.&lt;/p&gt;
&lt;h2 id="what-each-agent-actually-does"&gt;What each agent actually does&lt;/h2&gt;
&lt;p&gt;The split is clean by design. Daneel is the persistent layer — always on, full life context, memory across sessions, proactive. It handles the entire life-admin surface: heartbeats, email triage, Home Assistant automations, calendar nudges, morning briefings. It knows who I am and what I&amp;rsquo;m doing across every domain of my life. That&amp;rsquo;s its job.&lt;/p&gt;
&lt;p&gt;Claude Code is the specialist. It&amp;rsquo;s on-demand, scoped to a repository, and knows nothing about my calendar or email unless I explicitly tell it something. When it gets a task, it gets a working directory and a description. That&amp;rsquo;s the full context. Nothing else bleeds in.&lt;/p&gt;
&lt;p&gt;The analogy that fits best is a generalist doctor versus a surgeon. Your GP knows your full medical history — that breadth is valuable for holistic care. But when you need surgery, you want the surgeon focused on the procedure, not briefed on your tax situation. The surgeon&amp;rsquo;s narrow focus is a feature, not a limitation.&lt;/p&gt;
&lt;h2 id="why-narrow-context-produces-better-code"&gt;Why narrow context produces better code&lt;/h2&gt;
&lt;p&gt;The difference is observable before it&amp;rsquo;s explainable. When Claude Code gets a task with only the relevant repository in scope, the output is sharper. It references actual code, proposes concrete changes, and doesn&amp;rsquo;t pad responses with caveats about things it can&amp;rsquo;t see. When the same model does coding work inside a session loaded with unrelated context, the quality drops in ways that are subtle but consistent: more hedging, less precision, occasional suggestions that only make sense if you squint.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t run controlled experiments. This is observational. But the pattern is consistent enough that I&amp;rsquo;ve made it a rule: coding tasks get their own context, every time.&lt;/p&gt;
&lt;p&gt;The mechanism matters too. Claude Code gets a specific working directory. It explores the repo, reads the relevant files, and builds its understanding from the code itself — not from my description of my life. That working-directory scoping is the primary context control, and it works.&lt;/p&gt;
&lt;h2 id="how-the-handoff-works"&gt;How the handoff works&lt;/h2&gt;
&lt;p&gt;From my perspective, the interaction is simple. I tell Daneel what I want done: &amp;ldquo;refactor the caldav script to handle token refresh.&amp;rdquo; Daneel constructs the task, points Claude Code at the relevant file and any context it needs, spawns it as a background process, and monitors for completion. When it&amp;rsquo;s done, the result arrives in Matrix. I haven&amp;rsquo;t switched tools or changed context myself.&lt;/p&gt;
&lt;p&gt;The handoff is where the quality of the split lives or dies. Daneel has to construct a precise task description — if it&amp;rsquo;s vague, Claude Code still gets a muddled context, and the problem just moves upstream. Writing a clear task handoff is a real skill, and I&amp;rsquo;ve had to tune it. But a well-constructed handoff is much easier to get right than expecting a single model to maintain useful quality across a large mixed-domain context.&lt;/p&gt;
&lt;p&gt;The user experience is a single conversation. The complexity — spawning, monitoring, result delivery — is hidden. That&amp;rsquo;s the point.&lt;/p&gt;
&lt;h2 id="the-trade-offs-i-live-with"&gt;The trade-offs I live with&lt;/h2&gt;
&lt;p&gt;This setup is not free. Two agents means two failure modes, two configurations, and a non-trivial orchestration layer. When something breaks, it&amp;rsquo;s not always obvious whether the problem is in the task description, the spawning mechanism, or Claude Code itself. Debugging the pipeline is its own skill.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also latency. Spinning up a coding agent for every task has overhead. For a quick one-liner, it&amp;rsquo;s overkill. The split pays off for tasks with real scope — a refactor, a new feature, a bug that requires reading multiple files. For something trivial, I still just ask Daneel directly and accept the slightly lower quality.&lt;/p&gt;
&lt;p&gt;Maintenance is real. Two tools have separate update cycles, separate auth quirks, and separate failure modes. I&amp;rsquo;ve hit cases where an update changed the spawning interface, or where Claude Code&amp;rsquo;s behavior shifted between versions. Keeping both working smoothly is ongoing work, not a one-time setup.&lt;/p&gt;
&lt;p&gt;And this setup assumes comfort with CLI tooling and configuration files. It&amp;rsquo;s not plug-and-play for someone who wants a simpler life.&lt;/p&gt;
&lt;h2 id="what-i-d-do-differently"&gt;What I&amp;rsquo;d do differently&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;d set up the context separation earlier. For too long I tried to get Daneel to do everything, and I blamed the model when quality was inconsistent. The issue wasn&amp;rsquo;t the model — it was me asking it to be two things at once.&lt;/p&gt;
&lt;p&gt;If I were starting over, I&amp;rsquo;d also invest more upfront in the task handoff format. The quality of Claude Code&amp;rsquo;s output is almost entirely determined by the quality of the task description. Getting that right — concise, specific, with the right working directory and just enough background — is where the leverage is.&lt;/p&gt;
&lt;p&gt;Would I set this up again? Yes. The cognitive overhead of the orchestration is less than the cognitive overhead of getting mediocre code back and figuring out why.&lt;/p&gt;
&lt;p&gt;The principle here doesn&amp;rsquo;t require my specific tooling. If you&amp;rsquo;re using any combination of AI assistants — whether that&amp;rsquo;s two Claude sessions, a personal assistant alongside a coding agent, or even just separate chat threads — the same logic applies: don&amp;rsquo;t mix life-admin context with coding context. Keep them separate. The model on the other end will produce better output, even if it can&amp;rsquo;t tell you why.&lt;/p&gt;</description></item></channel></rss>