<?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: Masaya Kumagai</title>
    <description>The latest articles on DEV Community by Masaya Kumagai (@kumagallium).</description>
    <link>https://dev.to/kumagallium</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3891564%2F1c518c9a-6e8f-46a2-ade4-dd098d4de6d6.jpeg</url>
      <title>DEV Community: Masaya Kumagai</title>
      <link>https://dev.to/kumagallium</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kumagallium"/>
    <language>en</language>
    <item>
      <title>Write notes the way you always do — structure comes out afterwards</title>
      <dc:creator>Masaya Kumagai</dc:creator>
      <pubDate>Tue, 05 May 2026 13:44:56 +0000</pubDate>
      <link>https://dev.to/kumagallium/write-notes-the-way-you-always-do-structure-comes-out-afterwards-42bc</link>
      <guid>https://dev.to/kumagallium/write-notes-the-way-you-always-do-structure-comes-out-afterwards-42bc</guid>
      <description>&lt;p&gt;If you're going to record what you tried, what you really want to write is something close to a flowchart: what you used, how you tried it, what came out. Keep that machine-readable and you can replay or compare runs later. The value is obvious.&lt;/p&gt;

&lt;p&gt;But writing a flowchart for every attempt is heavy work. While you're actually trying things, you'd rather scribble a sentence. Pure prose, on the other hand, is hard to pull machine-readable structure out of afterwards. &lt;em&gt;Can I write loose prose and still get structured provenance out of it?&lt;/em&gt; — that's roughly the question I had in mind for &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;Graphium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Take a sentence like "Dissolved 5 g NaCl in 80 °C water, obtained a clear solution." I'd like to write that as prose, and still extract afterwards: what was the material, what was the condition, what was the output.&lt;/p&gt;

&lt;p&gt;Older Graphium was "one label per block." Input block: NaCl. Parameter block: 80 °C. Output block: clear solution. Provenance was clean — but from the writer's side, a single sentence had to be broken apart into four entry fields. It felt less like an experiment note and more like filling out a structured form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two perspectives meeting in the same note
&lt;/h2&gt;

&lt;p&gt;What's actually happening here is the question of whether &lt;strong&gt;two different demands can coexist in the same note&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One demand is to leave behind a graph-shaped record. If the data survives in a form you can search, aggregate, and compare later, replay and review become much easier. From a data-science perspective, this is the starting point.&lt;/p&gt;

&lt;p&gt;The other demand is to capture what's happening in front of you, without losing it. Following the flow of thought and hand, write it down naturally as prose. The traditions of recording trial and error — lab notebooks, recipe notes, sketchbooks — all lean this way, valuing a kind of in-the-moment improvisation.&lt;/p&gt;

&lt;p&gt;To satisfy both demands in the same place, you need something to bridge them. I put that bridge in the &lt;strong&gt;grammar of the document&lt;/strong&gt;. Writing already comes with grammar — headings, paragraphs, nouns, verbs — and the distinction between act and object is naturally embedded in it. Place labels along that grammar, and the writer is just writing prose, while the reader gets a graph for free. That bridge — that's what convinced me to rebuild around grammar.&lt;/p&gt;

&lt;p&gt;In v0.5.0 I restructured along this principle into &lt;strong&gt;three layers: Section (headings) / Phase (plan vs result) / Inline (in-text highlights)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mapping document grammar onto PROV-DM
&lt;/h2&gt;

&lt;p&gt;The idea is small: pin PROV-DM's ontology onto the grammar of writing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PROV-DM&lt;/th&gt;
&lt;th&gt;Grammar&lt;/th&gt;
&lt;th&gt;Graphium&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Activity (verb / clause)&lt;/td&gt;
&lt;td&gt;Heading hierarchy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Section&lt;/strong&gt; — h1/h2/h3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;※ PROV-DM extension (&lt;code&gt;graphium:phase&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sub-heading&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Phase&lt;/strong&gt; — &lt;code&gt;[Plan]&lt;/code&gt; / &lt;code&gt;[Result]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entity / Attribute (noun / phrase)&lt;/td&gt;
&lt;td&gt;In-text term&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Inline&lt;/strong&gt; — &lt;code&gt;[Input]&lt;/code&gt; / &lt;code&gt;[Tool]&lt;/code&gt; / &lt;code&gt;[Parameter]&lt;/code&gt; / &lt;code&gt;[Output]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The middle row is the odd one out. Phase is not a standard PROV-DM concept — Graphium adds it as a custom attribute (&lt;code&gt;graphium:phase&lt;/code&gt;). The intent behind it comes later in this post.&lt;/p&gt;

&lt;p&gt;Verbs become headings, nouns become inline highlights. Hold to that mapping and you can write prose as prose, and provenance falls out for free.&lt;/p&gt;

&lt;p&gt;That earlier sentence, under the heading "Dissolving NaCl":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Input]NaCl[/] [Parameter]5 g[/] was dissolved in [Parameter]80 °C[/] [Input]water[/] to give a [Output]clear solution[/].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Almost identical to the original — a few small spans of color added. Underneath, Section creates an Activity, Inline creates Entities (NaCl, water, clear solution) and Attributes (5 g, 80 °C), and &lt;code&gt;prov:used&lt;/code&gt; / &lt;code&gt;prov:wasGeneratedBy&lt;/code&gt; are wired automatically.&lt;/p&gt;

&lt;p&gt;Inline highlights also work inside bullet lists, not just prose. You can dump conditions as a quick list and add highlights afterward, or write everything as flowing prose and highlight later. The 3-layer model only asks that you respect the document's grammar — it stays out of the way of writing style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase as scaffolding for "templates at multiple resolutions"
&lt;/h2&gt;

&lt;p&gt;The middle layer (Phase, &lt;code&gt;[Plan]&lt;/code&gt; / &lt;code&gt;[Result]&lt;/code&gt;) doesn't carry strong necessity today. Distinguishing planned values from actual ones can be expressed with Section headings or Inline tags alone.&lt;/p&gt;

&lt;p&gt;I still made Phase its own layer because I wanted to &lt;strong&gt;pull a process out at multiple resolutions&lt;/strong&gt;. Step headings alone give you a skeleton template — just the shape of the procedure. Layer Plan on top, and you get a richer template that also fixes the planned values. Fill in Result, and the note becomes a complete execution record. The same note should read at three resolutions: skeleton, skeleton + plan, and the full thing. A replication run reuses Step + Plan; a control experiment edits just part of the Plan. That's the operating model I'm betting on.&lt;/p&gt;

&lt;p&gt;Implementation-wise, I don't use PROV-DM's &lt;code&gt;prov:Plan&lt;/code&gt; type for this. The PROV-DM Plan refers to the &lt;em&gt;whole recipe a Plan-aware Agent uses to perform an Activity&lt;/em&gt; — tagging individual planned values with &lt;code&gt;prov:Plan&lt;/code&gt; would be a misuse. So Graphium carries Phase as a custom-namespace attribute (&lt;code&gt;graphium:phase&lt;/code&gt;), splits node IDs between plan and execution variants, and connects them with &lt;code&gt;prov:wasDerivedFrom&lt;/code&gt;. PROV-DM explicitly allows this kind of custom-attribute extension, so the result still sits inside PROV-DM compliance — I'm layering my own resolution on top, not bending the schema.&lt;/p&gt;

&lt;p&gt;The templating workflow itself isn't implemented yet. Phase is the kind of structural decision you can't easily retrofit later, so I drove the stake in early — before the payoff actually arrives.&lt;/p&gt;

&lt;p&gt;Phase is also optional. Skip the Phase headings and everything is treated as &lt;code&gt;execution&lt;/code&gt; internally — you can write notes without ever noticing the layer exists. Phase is there for people who want to pull the same note out at multiple resolutions, not something forced on every user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why both blocks and inline
&lt;/h2&gt;

&lt;p&gt;A reasonable question: if inline carries the Entity, is block structure still needed?&lt;/p&gt;

&lt;p&gt;Yes. After implementing this, my settled answer is that &lt;strong&gt;blocks and inline highlights operate at different granularities, and you need both&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blocks&lt;/strong&gt; — the unit of editing. The granularity AI uses when you say "rewrite this paragraph."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline&lt;/strong&gt; — the in-text referent identified as a PROV Entity. Phrase-level granularity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need both. Blocks-only is too coarse to pick up in-text terms; inline-only is too fine to be a useful edit unit. Inline highlights actually keep their &lt;code&gt;entityId&lt;/code&gt; separate from the text range, so identity stays stable even when the range moves under editing (a design point worth its own post). But "from here to here is one unit of work" still needs the coarser frame that blocks provide.&lt;/p&gt;

&lt;p&gt;The three-layer structure is a deliberate fix for this gap. Section/Phase says "this region is one act"; Inline says "and these specific things were involved."&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing order is no longer constrained
&lt;/h2&gt;

&lt;p&gt;A side effect: order doesn't matter anymore.&lt;/p&gt;

&lt;p&gt;In the old model, block-level labels nudged you toward "drop the Input block first, then a Step block." The 3-layer model lets you write the whole experiment as prose first, and add headings + highlights afterward. Or start from a heading template and fill in. Either works.&lt;/p&gt;

&lt;p&gt;Decoupling &lt;strong&gt;writing order&lt;/strong&gt; from &lt;strong&gt;PROV structure&lt;/strong&gt; moves notes back from form-shaped to essay-shaped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it currently sits
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;[Plan]&lt;/code&gt; vs &lt;code&gt;[Result]&lt;/code&gt; distinction isn't for everyone. Tracking planned vs actual is second nature in some research cultures and feels like overhead in others. Keeping Phase as an optional layer is the place I've landed on for now.&lt;/p&gt;

&lt;p&gt;Same with how inline highlights get applied — selection + toolbar, slash command, AI auto-tagging — "AI roughly tags during a draft pass, human refines" is the workflow I've settled into, and I don't feel a strong need to push past it yet.&lt;/p&gt;

&lt;p&gt;The direction — &lt;em&gt;write prose as prose, and still pull machine-readable provenance out of it&lt;/em&gt; — fits the larger theme I want to keep chasing, and the 3-layer structure feels like a settled answer for it, at least for now.&lt;/p&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;https://github.com/kumagallium/Graphium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>science</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why we built provenance into a notes app</title>
      <dc:creator>Masaya Kumagai</dc:creator>
      <pubDate>Mon, 04 May 2026 15:20:15 +0000</pubDate>
      <link>https://dev.to/kumagallium/why-we-built-provenance-into-a-notes-app-24hk</link>
      <guid>https://dev.to/kumagallium/why-we-built-provenance-into-a-notes-app-24hk</guid>
      <description>&lt;p&gt;Notes written while you're in the middle of trying something out are good at recording results and reflections, but keeping &lt;strong&gt;the flow that led to those results&lt;/strong&gt; as structure is surprisingly hard. The procedure that lived only in someone's head at the time, the implicit assumptions that didn't make it onto the page, the judgment calls that got summarized away in meeting decks — when you read the notes back years later, those rarely survive together.&lt;/p&gt;

&lt;p&gt;I felt this myself. More than ten years after stepping away from active experimental work, I tried to recall the flow of one of those experiments. What I had left were fragmented notes and a few meeting decks. The results were there, but the flow that led to them had thinned out over time.&lt;/p&gt;

&lt;p&gt;There is advice that says: write the procedure as a flow chart in your notebook. Even so, notes written in the moment tend to be results-centric, and keeping the flow recorded as structure on top of that takes more effort than expected. For reproducing or revisiting work later, having a setup that records &lt;strong&gt;the flow as structured data&lt;/strong&gt; alongside the results would be valuable.&lt;/p&gt;

&lt;p&gt;Japanese cooking has a saying about "sa-shi-su-se-so" — adding sugar, salt, vinegar, soy sauce, and miso in that order changes the taste. The same is true anywhere you're trying things — experiments, recipes, code, drafts. What you add when, in what order, how long you wait — those choices shape the outcome. The flow is making the result.&lt;/p&gt;

&lt;p&gt;So I wanted a way to keep "what came from what, through what flow" — that causal data — as &lt;strong&gt;a structured record&lt;/strong&gt;. There is also another reason: this kind of data feels especially interesting in an era when AI starts handling the data of trial-and-error work itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  PROV-DM as the missing model
&lt;/h2&gt;

&lt;p&gt;That is when I came across &lt;a href="https://www.w3.org/TR/prov-dm/" rel="noopener noreferrer"&gt;PROV-DM (Provenance Data Model)&lt;/a&gt;, a W3C standard for describing what was made, from what, and how. It defines three primitives — Entity, Activity, Agent — and the relations between them.&lt;/p&gt;

&lt;p&gt;Academic data systems use it. Personal notes apps don't, as far as I can tell. But the daily output of anyone trying things on the ground already fits this shape. A researcher writing "I heat-treated Sample A and got Sample B" and a baker writing "I added sugar before salt and the texture changed" both describe, in PROV-DM terms, "Entity B was generated by an Activity from Entity A." With this, I had a way to keep the flow of trial and error — the part that used to live only in my head — as structured data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Another layer of provenance — same model for edit history
&lt;/h2&gt;

&lt;p&gt;Looking deeper into PROV-DM, I realized the same data model also fits &lt;strong&gt;document edit history&lt;/strong&gt;, not only content provenance. In fact, that may be closer to what PROV-DM was originally designed for.&lt;/p&gt;

&lt;p&gt;So in &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;Graphium&lt;/a&gt;, I track provenance in two layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layer 1: Content provenance&lt;/strong&gt; — the experimental workflow (Sample A flowing into Sample B, and so on)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer 2: Document edit provenance&lt;/strong&gt; — who edited what, and when&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Layer 2 maps the editor (human or AI) to &lt;code&gt;prov:Agent&lt;/code&gt;, edit operations to &lt;code&gt;prov:Activity&lt;/code&gt;, and document revisions to &lt;code&gt;prov:Entity&lt;/code&gt;. The fact that both layers describe themselves in the same PROV-DM vocabulary felt like the right design choice to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Both layers gain weight in the AI era
&lt;/h2&gt;

&lt;p&gt;I think both layers grow in value as AI becomes part of the picture.&lt;/p&gt;

&lt;p&gt;Layer 1 keeps the procedure inside a note as &lt;strong&gt;causal structure&lt;/strong&gt;. When inputs, steps, and outputs are connected as a causal flow within the same note, you — or an AI reading that note later — can trace the flow at a higher resolution. As AI starts handling this kind of trial-and-error data, structured procedures themselves gain value as material that can be analyzed or reused.&lt;/p&gt;

&lt;p&gt;Layer 2 matters when AI-written and human-written content start mixing in the same notes. As AI writes parts, summarizes, or edits, being able to tell later "this was my own observation, this was added by AI" matters when you re-read your own work or share it with others. Just having "AI or not" recorded as Agent gives that distinction a place to live.&lt;/p&gt;

&lt;p&gt;The same "what came from what" question applies far beyond lab work. Recipes, software change histories, medical records — the shape is the same. That's why the header image of this post is a bread-making note rather than a chemistry experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recording it without making the user edit a graph
&lt;/h2&gt;

&lt;p&gt;Asking users to author a graph directly is a non-starter. So &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;Graphium&lt;/a&gt; maps &lt;strong&gt;PROV-DM onto the grammar of the document itself&lt;/strong&gt;: headings become Activities, and short inline highlights inside headings turn the named term ("NaCl", "80°C", "clear solution") into Entities.&lt;/p&gt;

&lt;p&gt;The writing experience stays "type a heading, write a paragraph, occasionally highlight a word." The provenance graph is a &lt;em&gt;computed view&lt;/em&gt; — never something you edit by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coexisting with knowledge links
&lt;/h2&gt;

&lt;p&gt;Not every link should be causal. "This paper was interesting" or "this concept resembles that one" are non-directional. Forcing causality on them is unnatural.&lt;/p&gt;

&lt;p&gt;So Graphium splits them. &lt;code&gt;@&lt;/code&gt; mentions default to &lt;em&gt;knowledge links&lt;/em&gt; (no direction, cycles allowed). Relations between inline highlights inside heading scopes are &lt;em&gt;provenance links&lt;/em&gt; (directed, acyclic). Same act of writing, two different graphs underneath.&lt;/p&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;https://github.com/kumagallium/Graphium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>product</category>
      <category>productivity</category>
      <category>science</category>
    </item>
    <item>
      <title>I Want to Build a Note App Where Discoveries Happen</title>
      <dc:creator>Masaya Kumagai</dc:creator>
      <pubDate>Thu, 23 Apr 2026 00:37:01 +0000</pubDate>
      <link>https://dev.to/kumagallium/i-want-to-build-a-note-app-where-discoveries-happen-496n</link>
      <guid>https://dev.to/kumagallium/i-want-to-build-a-note-app-where-discoveries-happen-496n</guid>
      <description>&lt;p&gt;like the moment when something clicks.&lt;/p&gt;

&lt;p&gt;When you've been tweaking a recipe and finally nail the flavor. When you're debugging and suddenly see the root cause. When you're reading a paper and a concept from a completely different field connects. The domain changes, but that "this is it" feeling is the same.&lt;/p&gt;

&lt;p&gt;I wanted to build a note app that supports the trial and error behind those moments. That's why I started building &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;Graphium&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The limits of lab notebooks
&lt;/h3&gt;

&lt;p&gt;When I was doing materials science research, I kept running into the same problem: experimental processes were hard to record and even harder to pass on. In grad school, different senior researchers taught me different preprocessing procedures for the same sample material. The know-how lived in people's heads, not in any shared system. We wrote things down in paper lab notebooks, but describing a process precisely is tedious, and searching through those notes later is nearly impossible. On top of that, the data that makes it into publications is just the tip of the iceberg — the trial-and-error data sitting in each lab usually goes unused and eventually disappears.&lt;/p&gt;

&lt;p&gt;In 2019, I had a vague idea: "If we could record experimental processes in a structured way, maybe AI could make use of them." (I wrote about this problem in a &lt;a href="https://kumagallium.hatenablog.com/entry/2020/09/16/112045" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; and a &lt;a href="https://speakerdeck.com/kumagallium/fit2020-masayakumagai" rel="noopener noreferrer"&gt;FIT2020 presentation&lt;/a&gt; at the time — both in Japanese.) That was the starting point for Graphium. But I had no concrete vision of what it would look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pieces that didn't fit yet
&lt;/h3&gt;

&lt;p&gt;Over the next few years, the pieces I needed started coming together in my hands, one by one.&lt;/p&gt;

&lt;p&gt;In 2023, around the time GPT-4 came out, I discovered Niklas Luhmann's &lt;a href="https://link.springer.com/chapter/10.1007/978-3-322-87749-9_19" rel="noopener noreferrer"&gt;Zettelkasten&lt;/a&gt; — a method where you write individual notes in your own words, link them to each other, and let a network of thought grow over time. I was drawn to the idea that connecting notes could lead to new insights. At the same time, I felt the weight of "permanent notes" — the process of abstracting and restructuring raw notes into refined knowledge. "Could AI handle this part?" I thought. But I couldn't see how this connected to my 2019 problem yet.&lt;/p&gt;

&lt;p&gt;In 2024, I came across &lt;a href="https://www.blocknotejs.org/" rel="noopener noreferrer"&gt;BlockNote.js&lt;/a&gt;, a block-based editor framework. Each element — text, images, data — exists as an independent block with its own ID. I sensed potential in its extensibility. At that point, it felt like "an interesting piece of technology" to me personally, but I didn't yet have a concrete sense of how it would tie into my 2019 problem.&lt;/p&gt;

&lt;p&gt;In 2025, I learned about &lt;a href="https://www.w3.org/TR/prov-dm/" rel="noopener noreferrer"&gt;PROV-DM&lt;/a&gt;, the W3C standard for describing provenance. It models relationships between Entities (things), Activities (actions), and Agents (actors) in a structured way. That year, a colleague and I wrote a paper called &lt;a href="https://arxiv.org/abs/2509.01042" rel="noopener noreferrer"&gt;MatPROV&lt;/a&gt;, applying PROV-DM to structure the provenance of materials synthesis. It was accepted at a NeurIPS 2025 workshop. For the first time, the vague 2019 idea — "structured recording of experimental processes" — had a formal framework to attach to.&lt;/p&gt;

&lt;p&gt;The pieces were accumulating. But I still couldn't see how to put them together into one thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The moment everything connected
&lt;/h3&gt;

&lt;p&gt;In January 2026, a colleague suggested: "What if you could attach context labels to blocks?" A simple idea — give semantic meaning to individual blocks via labels. But the moment I heard it, the scattered pieces clicked into a single picture. Blocks have IDs. IDs mean you can attach labels. Labels mean you can auto-generate a PROV-DM provenance graph. Links between blocks become a Zettelkasten network. And if AI layers a knowledge base on top of that network, you can break through the permanent-note bottleneck.&lt;/p&gt;

&lt;p&gt;It also helped that this was a time when AI could vibe-code. Once the ideas connected, I could immediately start building. I went from incubating a concept to implementing it almost overnight.&lt;/p&gt;

&lt;p&gt;Then in April 2026, Andrej Karpathy proposed a design pattern called &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;LLM Wiki&lt;/a&gt; — an approach where LLMs continuously build and update a Markdown wiki. As he put it: "LLMs don't get bored, don't forget to update a cross-reference, and can touch 15 files in one pass." The idea I'd been carrying since 2023 — "let AI handle Zettelkasten's permanent notes" — suddenly had a concrete implementation pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three layers of Graphium
&lt;/h3&gt;

&lt;p&gt;These pieces combined into a structure where Graphium supports discovery through three layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organize your thinking.&lt;/strong&gt; Type &lt;code&gt;@&lt;/code&gt; to reference another note, and a network between your notes starts growing. Zettelkasten's "connect your thoughts through links" philosophy, built directly into the editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accelerate discovery.&lt;/strong&gt; As you accumulate daily notes, AI reads across them and auto-generates a knowledge layer draft. For example, scattered experimental findings across multiple notes get organized into a single synthesized page, which you can then review and edit. With minimal effort, a knowledge base equivalent to Zettelkasten's permanent notes grows over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protect your discoveries.&lt;/strong&gt; Attach labels like &lt;code&gt;#Input&lt;/code&gt; or &lt;code&gt;#Output&lt;/code&gt; to blocks, and a provenance graph is auto-generated, showing what went in, what steps were taken, and what came out. Back in grad school, different senior researchers taught me different preprocessing procedures and I couldn't reliably reproduce any of them — this is exactly the kind of tool I wished I'd had back then. Provenance is described using the W3C standard PROV-DM, and when you quote or derive new notes from existing blocks, those connections are structurally recorded too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Without any action, it stays a simple note app
&lt;/h3&gt;

&lt;p&gt;A key design principle: these features only appear when you need them.&lt;/p&gt;

&lt;p&gt;Without labels, Graphium is a simple note app. Start using &lt;code&gt;@&lt;/code&gt; references and the link network becomes visible. Add &lt;code&gt;#&lt;/code&gt; labels and provenance graphs appear. Enable AI and the knowledge layer starts growing. Complexity scales with your actions, step by step.&lt;/p&gt;

&lt;p&gt;Structure reveals itself gradually, only to the extent you need it — a progressive design I want to preserve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Just getting started
&lt;/h3&gt;

&lt;p&gt;The first commit was on March 23, 2026 — just about a month ago. There's plenty left to build, but ideas I'd been carrying in fragments since 2019 are coming together into a single product, and that process itself has been a chain of discoveries.&lt;/p&gt;

&lt;p&gt;Right now Graphium is built for individual discovery. But I have a feeling this structure could eventually extend toward formalizing tacit knowledge within teams and growing collective intelligence.&lt;/p&gt;

&lt;p&gt;In this series, I'll walk through Graphium's design decisions one by one. Why I built it this way, what I chose not to build, what I'm still figuring out. I want to share the development process as it actually is.&lt;/p&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/kumagallium/Graphium" rel="noopener noreferrer"&gt;https://github.com/kumagallium/Graphium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
