<?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: Javier Ramírez</title>
    <description>The latest articles on DEV Community by Javier Ramírez (@javier_ramrez_e2b4bb54fb).</description>
    <link>https://dev.to/javier_ramrez_e2b4bb54fb</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%2F3822608%2Fae12f471-1ca0-487c-af85-0f438c57590d.jpg</url>
      <title>DEV Community: Javier Ramírez</title>
      <link>https://dev.to/javier_ramrez_e2b4bb54fb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javier_ramrez_e2b4bb54fb"/>
    <language>en</language>
    <item>
      <title>I Ditched My Fitness App for a Folder of Markdown Files (Spoiler -It's Better)</title>
      <dc:creator>Javier Ramírez</dc:creator>
      <pubDate>Tue, 11 Aug 2026 00:40:40 +0000</pubDate>
      <link>https://dev.to/javier_ramrez_e2b4bb54fb/i-ditched-my-fitness-app-for-a-folder-of-markdown-files-spoiler-its-better-2lad</link>
      <guid>https://dev.to/javier_ramrez_e2b4bb54fb/i-ditched-my-fitness-app-for-a-folder-of-markdown-files-spoiler-its-better-2lad</guid>
      <description>&lt;p&gt;Let me tell you about the exact moment I knew I was over fitness apps: I opened one to log my workout, and it asked me to rate my mood in an emoji scale before it would let me type in the proper amount of lbs being worked. I didn't like it. Not. One. Bit.&lt;br&gt;
I'm fickle.&lt;br&gt;
Sue me. This happens as you age.&lt;br&gt;
I just wanted to write down a number.&lt;/p&gt;

&lt;p&gt;So I did what any reasonable human being does when a piece of software annoys them: I deleted it and rebuilt my entire training log in a text editor. Specifically, in &lt;a href="https://marketplace.visualstudio.com/items?itemName=yamlink.yamlink" rel="noopener noreferrer"&gt;Yamlink&lt;/a&gt; — a VS Code extension that turns plain Markdown notes into a live knowledge graph. Fitness was not quite the motivation behind its development built for notes and knowledge work. But, in about an hour, with just this plugin and zero mood-tracking emojis, I was pretty satisfied with what was done.&lt;/p&gt;

&lt;p&gt;Here's how, and why I think it's genuinely good — not "good for a hack," just plain good.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: A workout is just a note with opinions
&lt;/h2&gt;

&lt;p&gt;Yamlink's whole model rests on one idea: every note gets an &lt;code&gt;id:&lt;/code&gt; and a &lt;code&gt;type:&lt;/code&gt; in its YAML frontmatter, and that's basically it. No schema to define up front, no "create a Workout object" ceremony. You just... write the file. One tiny set of properties can turn your vault in an operational knowledge vault. And you can take it in any direction you want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;workout-2026-08-03&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;workout&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-03&lt;/span&gt;
&lt;span class="na"&gt;exercise&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;back squat&lt;/span&gt;
&lt;span class="na"&gt;sets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;reps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;185&lt;/span&gt;
&lt;span class="na"&gt;program&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[[program-strength-block-2]]"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Felt heavy today. Left knee a little cranky on set 4.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. That's the whole process. No ads, app login, no waiting 25 seconds before being able to log your work. It's a text file sitting in a folder I own, that'll still open in the Cyberdyne computers we'll own in twenty years, because it's Markdown, not a proprietary blob in someone else's database/platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: your log becomes a live, editable table, not a static list
&lt;/h2&gt;

&lt;p&gt;Here's where it stops being "just notes" and starts being genuinely useful. Drop a &lt;code&gt;!view&lt;/code&gt; block into a note and it renders as a real, interactive table pulling live data from every workout note in the vault:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!view workout sort date desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not a static export. It's a live query. Change a value in the table, &lt;strong&gt;it writes straight back into the actual &lt;code&gt;.md&lt;/code&gt; file&lt;/strong&gt;. No "sync," because there's nothing to sync — the table and the file are the same data, just two ways of looking at it.&lt;/p&gt;

&lt;p&gt;Want to see if your work is yielding results, or if you're just telling yourself a nice story?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!view workout where exercise = "back squat" sort date desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it, then flip the same result set to a scatter plot from the View Panel's own toolbar — no extra syntax, just a layout toggle sitting right there. Real chart, real data, zero "connect your Watch to unlock trends" poophousery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: link your workout to your program, because context matters
&lt;/h2&gt;

&lt;p&gt;This is the part that made me actually feel something. Yamlink treats &lt;code&gt;[[wikilinks]]&lt;/code&gt; as first-class graph edges — write &lt;code&gt;[[program-strength-block-2]]&lt;/code&gt; anywhere and it's a real, navigable connection, not a string that happens to look like a link.&lt;/p&gt;

&lt;p&gt;So my workout notes link to the program note they belong to, my program note links to a goal note, and suddenly I've got an actual knowledge graph of my training instead of a spreadsheet pretending to have structure. Open the graph view and you can &lt;em&gt;see&lt;/em&gt; the shape of a training block — which workouts belong to which phase, at a glance, rendered as an actual graph, not a filtered list dressed up with a fancier font.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: let the graph do the counting for you
&lt;/h2&gt;

&lt;p&gt;Yamlink has a small set of computed fields the engine tracks automatically, no formula required — &lt;code&gt;_inbound_count&lt;/code&gt; being the one I didn't know I needed. It's just "how many other notes link to this one." Point it at my &lt;code&gt;program-strength-block-2&lt;/code&gt; note, and it's quietly counting every single workout I've logged against that block.&lt;/p&gt;

&lt;p&gt;I never tally sessions. I never have. The graph already knows, because it's just counting real edges — the same links I wrote anyway to give my workouts context in Step 3, now doing double duty as a running total I didn't have to ask for.&lt;/p&gt;

&lt;p&gt;Not math. Not AI. Just an honest count of the connections that already exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: the calendar knows when you skipped leg day
&lt;/h2&gt;

&lt;p&gt;Every note with a &lt;code&gt;date:&lt;/code&gt; field just... show up on Yamlink's &lt;strong&gt;built-in calendar&lt;/strong&gt;, automatically. No separate "log this workout in the calendar too" step, because there's only one copy of the data, and everything reads from it.&lt;/p&gt;

&lt;p&gt;And here's the detail I'm really loving: Yamlink has a Vault Health feature that flags notes nobody's touched in a while. It doesn't do this with a cutesy notification like "Hey champ, ready to go get the day?! 💪" — it just quietly, honestly surfaces "this hasn't been updated in 9 days" as a structural fact about your vault. No guilt-tripping of any kind. No streak-shaming push notification at 8pm on a Sunday when you felt like having a treat. Just cold, accurate silence when you're on track, and an honest flag when you're not. Somehow, I found that &lt;em&gt;more&lt;/em&gt; motivating than the app ever was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: it's honest about what it isn't
&lt;/h2&gt;

&lt;p&gt;I want to be extremely real, because the rest of this article has been fun and kinda smug in my honest opinion: &lt;strong&gt;this is not a mobile app&lt;/strong&gt;. There is no fancy iPhone experience here. Yamlink lives in VS Code (and a genuinely nice terminal UI called &lt;strong&gt;Conduit&lt;/strong&gt;, if you're the type who'd rather log a set from a terminal than unlock your phone — and if you're reading a dev magazine, you know exactly who you are). If your ideal fitness tracker experience is thumb-typing while your quads are trembling mid-set, this isn't that, at least not yet.&lt;/p&gt;

&lt;p&gt;What it &lt;em&gt;is&lt;/em&gt;: a fitness tracker that's actually a side effect of a much more general tool — one that treats "workout" as just one possible shape a note can take, alongside "book I'm reading," "person I met at a conference," or "recipe I keep ruining." The frontmatter doesn't care what domain you point it at. It just wants a &lt;code&gt;type:&lt;/code&gt; and some fields. &lt;/p&gt;

&lt;h2&gt;
  
  
  The actual pitch
&lt;/h2&gt;

&lt;p&gt;Every fitness app I've used eventually turns into a subscription, a walled garden, or both. And honestly, I can live with that. Your training history — actual, real information about your actual, real body — ends up owned by a company whose business model depends on you not leaving. I can live with that too. But then, as Yamlink kept evolving, I figured I could flip the app experience to a folder of files on your own disk. You can grep it. You can &lt;code&gt;git log&lt;/code&gt; it. You can open it in Notepad in the year 2040 and it'll still just say what it says.&lt;/p&gt;

&lt;p&gt;Yamlink was not built to be a fitness tracker (at all). That's kind of the point — a tool that adapts to what &lt;em&gt;you&lt;/em&gt; structure, instead of a tool that structures you into whatever the product team decided this quarter, is a genuinely different kind of software. Turns out "flexible knowledge graph" and "training log" are the same shape wearing a different &lt;code&gt;type:&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;Also, no emojis. I cannot stress enough how much that matters to me at my advanced age.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Can I have my entire CRM setup in Markdown?</title>
      <dc:creator>Javier Ramírez</dc:creator>
      <pubDate>Mon, 29 Jun 2026 01:04:24 +0000</pubDate>
      <link>https://dev.to/javier_ramrez_e2b4bb54fb/can-i-have-my-entire-crm-setup-in-crm-4op6</link>
      <guid>https://dev.to/javier_ramrez_e2b4bb54fb/can-i-have-my-entire-crm-setup-in-crm-4op6</guid>
      <description>&lt;h1&gt;
  
  
  Can You Build a CRM Entirely in Markdown?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Short answer?&lt;/em&gt; Yes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Long answer?&lt;/em&gt; Yes...but only if you stop thinking about Markdown as documents and start thinking about it as data.&lt;/p&gt;




&lt;p&gt;For years I've accepted that CRM software has to look a "certain way".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A database.&lt;/li&gt;
&lt;li&gt;A web application.&lt;/li&gt;
&lt;li&gt;A backend.&lt;/li&gt;
&lt;li&gt;Authentication.&lt;/li&gt;
&lt;li&gt;A cloud subscription.&lt;/li&gt;
&lt;li&gt;Probably another tab that's permanently open in your favorite browser. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contacts live in tables. Companies live in tables. Meetings live in tables.Tasks live in tables.&lt;/p&gt;

&lt;p&gt;Everything eventually becomes another row in another SQL database.&lt;/p&gt;

&lt;p&gt;I know, this is not really 100% the case nowadays, but I'm pretty sure we can agree that, at a higher corporate level, this has been the case nine times out of ten.&lt;/p&gt;

&lt;p&gt;But here's my question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if every one of those rows was just...a Markdown file?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For many, that sounds ridiculous at first... until you realize that databases and Markdown aren't actually solving different problems.&lt;/p&gt;

&lt;p&gt;They're storing structured information. The difference is that databases hide the structure. And Markdown lets you own it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Markdown isn't the limitation.
&lt;/h1&gt;

&lt;p&gt;Treating Markdown like text files is.&lt;/p&gt;

&lt;p&gt;A CRM isn't a collection of paragraphs. It's a collection of entities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People&lt;/li&gt;
&lt;li&gt;Accounts&lt;/li&gt;
&lt;li&gt;Meetings&lt;/li&gt;
&lt;li&gt;Deals&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;li&gt;Tasks&lt;/li&gt;
&lt;li&gt;Emails&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each entity simply has properties and relationships. That's it.&lt;/p&gt;

&lt;p&gt;Take a contact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;victoria-smith&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contact&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Victoria Smith&lt;/span&gt;
&lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;globex&lt;/span&gt;&lt;span class="pi"&gt;]]&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;me&lt;/span&gt;&lt;span class="pi"&gt;]]&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;active&lt;/span&gt;
&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;victoria@globex.com&lt;/span&gt;
&lt;span class="na"&gt;phone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;+1 555 123 &lt;/span&gt;&lt;span class="m"&gt;4567&lt;/span&gt;
&lt;span class="na"&gt;last-contact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-06-28&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's already a database row. Bang.&lt;/p&gt;

&lt;p&gt;Except... it's also a perfectly readable document. Double bang.&lt;/p&gt;




&lt;h1&gt;
  
  
  Relationships become links
&lt;/h1&gt;

&lt;p&gt;Traditional CRMs store foreign keys.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;company_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody enjoys reading that.&lt;/p&gt;

&lt;p&gt;Markdown gives you something humans can actually understand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;globex&lt;/span&gt;&lt;span class="pi"&gt;]]&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;me&lt;/span&gt;&lt;span class="pi"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those aren't just pretty links. They're relationships.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Yamlink graph&lt;/strong&gt; can traverse them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queries&lt;/strong&gt; can use them.&lt;/p&gt;

&lt;p&gt;Visual graphs can render them.&lt;/p&gt;

&lt;p&gt;Exactly the same information.&lt;/p&gt;

&lt;p&gt;Far nicer representation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Your filesystem becomes the database
&lt;/h1&gt;

&lt;p&gt;Imagine opening your CRM.&lt;/p&gt;

&lt;p&gt;Except your CRM is...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CRM/

accounts/
contacts/
meetings/
projects/
deals/
tasks/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every file can be opened in VS Code.&lt;/p&gt;

&lt;p&gt;Every file works in Git.&lt;/p&gt;

&lt;p&gt;Every file survives twenty years.&lt;/p&gt;

&lt;p&gt;No vendor lock-in. No export button. No proprietary binary format. No "contact limit." No "premium tier."&lt;/p&gt;

&lt;p&gt;It's just files.&lt;/p&gt;




&lt;h1&gt;
  
  
  "But where are the tables?"
&lt;/h1&gt;

&lt;p&gt;Everyone asks me this.&lt;/p&gt;

&lt;p&gt;Ironically, the tables are the easiest part.&lt;/p&gt;

&lt;p&gt;Once every note follows a schema (any schema), tables become generated views.&lt;/p&gt;

&lt;p&gt;Show all active contacts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!view contact
where status = active
sort company
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show every meeting with Globex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!view meeting
where account = [[globex]]
sort date desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show deals closing this month.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!view deal
where close-date &amp;lt;= end-of-month()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You never manually build the table.&lt;/p&gt;

&lt;p&gt;The table is simply another projection of the vault.&lt;/p&gt;




&lt;h1&gt;
  
  
  A CRM is mostly relationships
&lt;/h1&gt;

&lt;p&gt;Here's where things become interesting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Victoria belongs to Globex.&lt;/li&gt;
&lt;li&gt;Victoria attended Meeting A.&lt;/li&gt;
&lt;li&gt;Meeting A produced Opportunity X.&lt;/li&gt;
&lt;li&gt;Opportunity X generated Proposal B.&lt;/li&gt;
&lt;li&gt;Proposal B became Project C.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional CRMs hide that chain behind different screens. A graph doesn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Victoria

↓

Globex

↓

Quarterly Review

↓

Migration Project

↓

Implementation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can literally traverse your business.&lt;/p&gt;




&lt;h1&gt;
  
  
  Frontmatter is your schema
&lt;/h1&gt;

&lt;p&gt;This is the part people underestimate.&lt;/p&gt;

&lt;p&gt;Consistency matters more than complexity.&lt;/p&gt;

&lt;p&gt;A contact always has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contact&lt;/span&gt;
&lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;phone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An account always has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;account&lt;/span&gt;
&lt;span class="na"&gt;industry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;website&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A meeting always has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;meeting&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;participants&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's your schema.&lt;/p&gt;

&lt;p&gt;Nothing magical.&lt;/p&gt;

&lt;p&gt;Just disciplined.&lt;/p&gt;




&lt;h1&gt;
  
  
  Intelligence doesn't require AI
&lt;/h1&gt;

&lt;p&gt;One misconception today is that "smart" software needs large language models.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Once hundreds of notes share the same structure, software starts recognizing patterns.&lt;/p&gt;

&lt;p&gt;If every contact has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;company
status
owner
email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...then a new contact probably should too.&lt;/p&gt;

&lt;p&gt;If every project links to an account...&lt;/p&gt;

&lt;p&gt;...missing that relationship becomes obvious.&lt;/p&gt;

&lt;p&gt;If opportunities usually become projects...&lt;/p&gt;

&lt;p&gt;...the software can suggest what probably comes next.&lt;/p&gt;

&lt;p&gt;That's not AI. That's good, old fashioned, statistics.&lt;/p&gt;




&lt;h1&gt;
  
  
  Queries become your reports
&lt;/h1&gt;

&lt;p&gt;Traditional CRM:&lt;/p&gt;

&lt;p&gt;"Can someone build me a report?"&lt;/p&gt;

&lt;p&gt;Markdown CRM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show active customers
without meetings
during the last 90 days.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The report doesn't need to exist beforehand. It's generated.&lt;/p&gt;

&lt;p&gt;Tomorrow you ask a different question. Tomorrow you get a different report.&lt;/p&gt;

&lt;p&gt;The underlying notes never changed.&lt;/p&gt;




&lt;h1&gt;
  
  
  Your CRM starts behaving like Git
&lt;/h1&gt;

&lt;p&gt;This is one of my favorite parts.&lt;/p&gt;

&lt;p&gt;Every change is text.&lt;/p&gt;

&lt;p&gt;Git shows exactly what changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-status: prospect
&lt;/span&gt;&lt;span class="gi"&gt;+status: customer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-company: [[acme]]
&lt;/span&gt;&lt;span class="gi"&gt;+company: [[globex]]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No opaque database updates. No audit log locked behind an Enterprise subscription. Just version control.&lt;/p&gt;




&lt;h1&gt;
  
  
  The biggest surprise
&lt;/h1&gt;

&lt;p&gt;The biggest surprise isn't that this works.&lt;/p&gt;

&lt;p&gt;It's that it scales better than people think.&lt;/p&gt;

&lt;p&gt;Not because Markdown is magical.&lt;/p&gt;

&lt;p&gt;Because structured knowledge scales surprisingly well.&lt;/p&gt;

&lt;p&gt;When every entity has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a stable identity&lt;/li&gt;
&lt;li&gt;consistent fields&lt;/li&gt;
&lt;li&gt;explicit relationships&lt;/li&gt;
&lt;li&gt;queryable metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...you've recreated most of what makes a CRM valuable.&lt;/p&gt;

&lt;p&gt;Without needing SQL.&lt;/p&gt;

&lt;p&gt;Without needing PostgreSQL.&lt;/p&gt;

&lt;p&gt;Without needing Docker.&lt;/p&gt;

&lt;p&gt;Without needing a browser.&lt;/p&gt;




&lt;h1&gt;
  
  
  Now, is this for everyone?
&lt;/h1&gt;

&lt;p&gt;Absolutely not.&lt;/p&gt;

&lt;p&gt;If your sales team needs Salesforce automation, marketing campaigns, AI lead scoring, an ecosystem of integrations, and enterprise workflows, buy Salesforce (I know, I know), or Pipedrive. Or about 20 other great platforms out there.&lt;/p&gt;

&lt;p&gt;But if you're someone that likes owning their data, or establishing your own structure and have the data cater to your tendencies, then Markdown becomes surprisingly compelling.&lt;/p&gt;

&lt;p&gt;Especially when software understands the structure hiding inside those files.&lt;/p&gt;




&lt;h1&gt;
  
  
  The real shift
&lt;/h1&gt;

&lt;p&gt;The interesting question isn't whether Markdown can replace a CRM.&lt;/p&gt;

&lt;p&gt;It's whether we should still think of Markdown as documentation at all.&lt;/p&gt;

&lt;p&gt;Because once notes become structured entities, documents become databases.&lt;/p&gt;

&lt;p&gt;Relationships become graphs. Queries become reports.&lt;/p&gt;

&lt;p&gt;And suddenly, your knowledge base starts behaving less like a notebook and more like an operating system.&lt;/p&gt;




&lt;p&gt;I'd argue that's a far more interesting future than yet another cloud CRM.&lt;/p&gt;

&lt;p&gt;Maybe the next CRM isn't another SaaS product.&lt;/p&gt;

&lt;p&gt;Maybe it's just a folder.&lt;/p&gt;

&lt;p&gt;That's exactly why I built &lt;a href="https://github.com/Yamlink-Labs/yamlink" rel="noopener noreferrer"&gt;Yamlink&lt;/a&gt;. Because my contacts deserve better.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>productivity</category>
      <category>database</category>
      <category>git</category>
    </item>
    <item>
      <title>Turning Markdown Files into a Queryable Knowledge Graph</title>
      <dc:creator>Javier Ramírez</dc:creator>
      <pubDate>Fri, 13 Mar 2026 15:57:51 +0000</pubDate>
      <link>https://dev.to/javier_ramrez_e2b4bb54fb/turning-markdown-files-into-a-queryable-knowledge-graph-4aho</link>
      <guid>https://dev.to/javier_ramrez_e2b4bb54fb/turning-markdown-files-into-a-queryable-knowledge-graph-4aho</guid>
      <description>&lt;p&gt;Markdown files often contain more structure than we give them credit for.&lt;/p&gt;

&lt;p&gt;With YAML frontmatter and consistent links, a collection of Markdown files can behave like a small knowledge graph.&lt;/p&gt;

&lt;p&gt;Many people already use YAML frontmatter to store metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mission-klendathu&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mission&lt;/span&gt;
&lt;span class="na"&gt;commander&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;johnny-rico&lt;/span&gt;&lt;span class="pi"&gt;]]&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2297-08-01&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once files have consistent IDs and links between them, something interesting happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;files become nodes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[[links]] become relations&lt;/li&gt;
&lt;li&gt;the collection of files becomes a graph&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Querying Markdown
&lt;/h2&gt;

&lt;p&gt;One approach is to define queries directly inside Markdown files.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you can query that graph, Markdown stops being just documents — it becomes &lt;strong&gt;structured data&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;!view mission where commander = [[johnny-rico]]&lt;br&gt;
select date, outcome&lt;br&gt;
sort date desc&lt;/p&gt;

&lt;p&gt;The query runs over all Markdown files and returns matching nodes.&lt;/p&gt;

&lt;p&gt;In my case, I tried building a VS Code extension to explore this idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Query Results
&lt;/h2&gt;

&lt;p&gt;!view queries render results as tables inside the editor.&lt;/p&gt;

&lt;p&gt;You can edit values directly in the table, and the changes write back to the YAML frontmatter of the source file.&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.amazonaws.com%2Fuploads%2Farticles%2F699ctpyjcswy1pxkndgn.gif" 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.amazonaws.com%2Fuploads%2Farticles%2F699ctpyjcswy1pxkndgn.gif" alt="Live query table in VS Code with inline editing of YAML frontmatter" width="760" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Markdown?
&lt;/h2&gt;

&lt;p&gt;Yamlink&lt;/p&gt;

&lt;p&gt;The goal is to keep everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local-first&lt;/li&gt;
&lt;li&gt;Git-native&lt;/li&gt;
&lt;li&gt;plain Markdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database, no lock-in — just structured files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yamlink
&lt;/h2&gt;

&lt;p&gt;To explore this idea, I built a VS Code extension called &lt;strong&gt;Yamlink&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're curious:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;VS Code Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=yamlink.yamlink" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=yamlink.yamlink&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm especially interested in hearing how others are working with structured data in Markdown.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>vscode</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
