<?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: Alexandr Zahatski</title>
    <description>The latest articles on DEV Community by Alexandr Zahatski (@zag).</description>
    <link>https://dev.to/zag</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%2F278411%2Fca74b53c-e5da-4111-a96b-878fb352bff6.png</url>
      <title>DEV Community: Alexandr Zahatski</title>
      <link>https://dev.to/zag</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zag"/>
    <language>en</language>
    <item>
      <title>What an AI agent can verify in the Raku Knowledge Base: page, section, passage</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Fri, 25 Sep 2026 13:27:21 +0000</pubDate>
      <link>https://dev.to/zag/what-an-ai-agent-can-verify-in-the-raku-knowledge-base-page-section-passage-81c</link>
      <guid>https://dev.to/zag/what-an-ai-agent-can-verify-in-the-raku-knowledge-base-page-section-passage-81c</guid>
      <description>&lt;h2&gt;
  
  
  One base, many sources
&lt;/h2&gt;

&lt;p&gt;Raku documentation does not live in one place. The language docs are one repository. Module documentation lives with the modules, across two ecosystems. The examples are a third repository. Each is written by different people, in whatever markup their project already used.&lt;/p&gt;

&lt;p&gt;Putting all of that under one roof is what the &lt;a href="https://raku-knowledge-base.podlite.org/" rel="noopener noreferrer"&gt;Raku Knowledge Base&lt;/a&gt; is for: one build, one URL scheme, one search. It is not affiliated with the official Raku project; it is an independent base, built and published with Podlite, and it has run on that engine since its first commit in January 2023.&lt;/p&gt;

&lt;p&gt;Two things are new this month. Since 22 September 2026 the base has an &lt;a href="https://raku-knowledge-base.podlite.org/mcp" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;, so an AI agent can be pointed at the documentation and answer from it rather than from memory. And each monthly data release now carries an &lt;a href="https://raku-knowledge-base.podlite.org/blog/2026-09-01-ecosystem" rel="noopener noreferrer"&gt;ecosystem report&lt;/a&gt;: what appeared, what moved, what version it moved to.&lt;/p&gt;

&lt;p&gt;What follows is what is actually in it, measured on 25 September 2026, and what an agent gets when it is pointed at the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an agent can check, not just trust
&lt;/h2&gt;

&lt;p&gt;An agent answers with the same confidence whether it read the documentation or remembered it wrong. Naming a source does not settle that either: a real page can be cited for a claim the page never makes.&lt;/p&gt;

&lt;p&gt;So the useful question is narrower. Can the agent hand back the page, the section and the words it leaned on, so all three can be checked?&lt;/p&gt;

&lt;p&gt;Here is one run, start to finish.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;question  How does an action class share state between grammar rules?
page      /doc/language/grammars
section   Special tokens → "Always succeed" assertion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The section is worth noting. It is not the one whose name sounds closest — &lt;code&gt;Attributes in grammars&lt;/code&gt; is the obvious guess, and it is the wrong one. The answer sits two headings away, in the &lt;code&gt;Digifier&lt;/code&gt; and &lt;code&gt;Devanagari&lt;/code&gt; example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Devanagari {
    has @!numbers;
    method digit ($/) { @!numbers.tail ~= &amp;lt;० १ २ ३ ४ ५ ६ ७ ८ ९&amp;gt;[$/] }
    method succ ($) { @!numbers.push: '' }
    method TOP ($/) { make @!numbers[^(*-1)] }
}
say Digifier.parse('255 435 777', actions =&amp;gt; Devanagari.new).made;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One rule opens the current slot, another extends the most recent one. The state lives on the action object, so the methods cooperate through the same attribute. The limit sits nearby, under &lt;code&gt;Attributes in grammars&lt;/code&gt;. Grammar attributes are reachable only from methods. Change one inside a method, and if that method was called from a token, the change reaches only that token's own match object.&lt;/p&gt;

&lt;p&gt;Three things came back, and all three can be opened and read. That is the whole claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  How retrieval actually works
&lt;/h2&gt;

&lt;p&gt;What sits behind the service is a flat index. A record holds four fields: url, title, top-level section, text. Search scores pages on title and text matches and returns a url, a title, a section name like &lt;code&gt;doc&lt;/code&gt;, and a window of text. There is no per-heading retrieval in it.&lt;/p&gt;

&lt;p&gt;That section name was readable because it was printed in the page the server handed over. That is a lower bar than structure-aware retrieval, and it is worth stating plainly, because it is the bar that was actually cleared. A page with visible headings, returned whole, is enough to make an answer checkable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in the Raku Knowledge Base
&lt;/h2&gt;

&lt;p&gt;Start with what the engine is pointed at: a tree of 60,501 files. Only 20,469 of them are in a format a page can be made from at all:&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%2Faz51j3c1m8swjlfuc0us.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%2Faz51j3c1m8swjlfuc0us.png" alt="Source files a page can be made from: 20,469 files out of a tree of 60,501. .rakumod 8,982 (43.9%), .md 3,801 (18.6%), .raku 3,525 (17.2%), .rakudoc 2,029 (9.9%), .pm6 1,558 (7.6%), .pl6 306 (1.5%), .pod6 229 (1.1%), .pod 39 (0.2%)." width="1656" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those other 40,032 files never had a chance: test files, JSON, build settings, images, and the project bookkeeping — licences, changelogs, &lt;code&gt;.gitignore&lt;/code&gt;. Two thirds of the tree is walked past.&lt;/p&gt;

&lt;p&gt;Even inside that fifth, a file is only a candidate. Most Raku programs carry no documentation, and the engine has to open each one to find out. A file earns a page by documenting itself. In a sample of 219 published pages whose source is a Raku program, the rule held without exception: every one carried embedded RakuDoc.&lt;/p&gt;

&lt;p&gt;Group those same files by the markup their contents carry, and measure the volume rather than the count:&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%2Fprx1a60r1xv1vbzk09ko.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%2Fprx1a60r1xv1vbzk09ko.png" alt="How much markup those files hold. Markdown: 3,801 files, 557,376 lines (42.6%), 24,681,645 characters (51.2%). RakuDoc as its own document: 2,297 files, 517,962 lines (39.6%), 15,759,433 characters (32.7%). RakuDoc inside Raku programs: 14,371 files, 232,998 lines (17.8%), 7,775,482 characters (16.1%). RakuDoc total 57.4% of markup lines." width="1657" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the programs only the lines inside a RakuDoc block are counted, not the whole file. Some files could not be matched on disk, so each group total is scaled from the ones that could; coverage ran from 81% to 98%.&lt;/p&gt;

&lt;p&gt;Two measures, and they disagree without either being wrong. RakuDoc holds more of the markup lines; Markdown holds more of the characters, because a Markdown line runs about half again as long. Lines say RakuDoc, characters say Markdown, and it is worth knowing which of the two a claim is standing on.&lt;/p&gt;

&lt;p&gt;One figure inside that is worth pulling out. Across every Raku program in the tree, 12.9% of all lines are documentation. Among the ones that made it to a page — the documented ones — it is 36.5%. Same markup, different population.&lt;/p&gt;

&lt;p&gt;All of it comes out as 10,754 pages with one URL scheme. That is the work Podlite does here, and it happens before any agent connects: a search index does not need a common authoring format, it needs a common published one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed this month
&lt;/h2&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%2F4xr5wvgs7c442mgwpyub.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%2F4xr5wvgs7c442mgwpyub.png" alt="Ecosystem report, 1 September 2026: 2,117 modules before, 2,142 now, 25 added, 83 updated, across both ecosystems p6c and zef." width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ecosystem report mentioned above is generated, not written. &lt;a href="https://raku-knowledge-base.podlite.org/blog/2026-09-01-ecosystem" rel="noopener noreferrer"&gt;The one dated 1 September 2026&lt;/a&gt; lists every module added and every module updated since the one before it, each with its version change and a link. Snapshots are compared, the difference is printed. It ranks nothing and scores nothing. It is a change list.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the MCP server offers
&lt;/h2&gt;

&lt;p&gt;The server went live on 22 September 2026. It speaks the Model Context Protocol, so any client that speaks MCP can use it — Claude Code, Codex, and the rest. Three tools, and that is the whole surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search the document collection available through the service, and get back matching pages with a snippet;&lt;/li&gt;
&lt;li&gt;read one page by url;&lt;/li&gt;
&lt;li&gt;list the top-level sections with a page count for each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third is duller than it sounds and more useful than it sounds. It gives an agent the size and shape of what it is about to search before it spends a single query.&lt;/p&gt;

&lt;p&gt;That server is open source under the Artistic License 2.0, the same licence as Rakudo. Its code sits in &lt;a href="https://github.com/zag/raku-knowledge-base/tree/main/mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-server&lt;/code&gt;&lt;/a&gt; in the &lt;a href="https://github.com/zag/raku-knowledge-base" rel="noopener noreferrer"&gt;knowledge base repository&lt;/a&gt;, so the retrieval described above can be read rather than taken on trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stops
&lt;/h2&gt;

&lt;p&gt;What the server reads is the document collection available through it: the Raku documentation, module documentation from both ecosystems, and the examples repository. It does not automatically include every page the site publishes, and it does not include the tooling around the base.&lt;/p&gt;

&lt;p&gt;Search it for MCP material and it returns the Raku modules named &lt;code&gt;MCP&lt;/code&gt;, &lt;code&gt;MCP::Server&lt;/code&gt; and &lt;code&gt;MCP::Client&lt;/code&gt;, plus pages that merely matched on &lt;code&gt;bundle&lt;/code&gt; and &lt;code&gt;install&lt;/code&gt;. That boundary runs both ways: if the service does not find something, that is a fact about the collection, not about Raku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect an agent
&lt;/h2&gt;

&lt;p&gt;Every data release ships the collection offline with a prebuilt index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar &lt;/span&gt;xzf raku-kb-mcp-offline.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;raku-kb-mcp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
&lt;/span&gt;claude mcp add raku-kb &lt;span class="nt"&gt;--&lt;/span&gt; node &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/bin/raku-kb-mcp.mjs"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Written for Claude Code, those three lines run as they stand; the same setup runs under Codex with one word changed. Connection commands for the hosted server, and the list of what it will not answer, are on &lt;a href="https://raku-knowledge-base.podlite.org/mcp" rel="noopener noreferrer"&gt;the MCP page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ask it the grammar question above, then check its answer: the page it names, the heading it quotes under, and whether the code it shows is the code the page carries.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the documents are your own
&lt;/h2&gt;

&lt;p&gt;Search only ever repays what publishing put in. For documents to come back with a page and a heading an agent can name, they have to be published with those headings intact and addressable. &lt;a href="https://podlite.org/for-agents" rel="noopener noreferrer"&gt;Podlite for agents&lt;/a&gt; is the kit for that side of it: a parser an agent can call instead of guessing at a document's shape.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>podlite</category>
      <category>rakulang</category>
      <category>agents</category>
    </item>
    <item>
      <title>Podlite Desktop 0.8 released</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Sun, 21 Jun 2026 16:54:40 +0000</pubDate>
      <link>https://dev.to/zag/podlite-desktop-08-released-3c3i</link>
      <guid>https://dev.to/zag/podlite-desktop-08-released-3c3i</guid>
      <description>&lt;p&gt;Podlite Desktop 0.8 is out. Podlite Desktop is a free, open source editor for the Podlite markup language, and it runs on macOS, Windows and Linux. This version shipped as a string of patch releases, 0.8.0 through 0.8.3, over a single week. This post covers the whole cycle: what is new, what got fixed, and a short note on where the fix list came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Inline image paste and drag-and-drop. Paste with Cmd+V or drag a file from Finder. It lands in a &lt;code&gt;media/&lt;/code&gt; folder next to the current document, and an &lt;code&gt;=picture&lt;/code&gt; line referencing it appears at the cursor. Drop a file that already lives in &lt;code&gt;media/&lt;/code&gt; and the editor references it in place, no copy.&lt;/li&gt;
&lt;/ul&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%2Flspvujtbdgnw35naear7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flspvujtbdgnw35naear7.gif" alt="Drag a file onto the editor and the =picture line lands at the cursor" width="560" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=include&lt;/code&gt; in the live preview. References resolve at render time against the current document's directory, so the preview shows the real included content instead of a placeholder. A recursive watcher invalidates the cache when an included file changes on disk, and the preview re-renders. Glob patterns work too: &lt;code&gt;=include file:**/*.podlite | defn&lt;/code&gt; expands through a depth-bounded directory walk and skips dotfiles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auto-numbered headings and lists. Mark a heading &lt;code&gt;:numbered&lt;/code&gt; and it gets a prefix like &lt;code&gt;1.&lt;/code&gt;, &lt;code&gt;1.1.&lt;/code&gt;, &lt;code&gt;1.2.1.&lt;/code&gt;. Set the document default with &lt;code&gt;=config head1 :numbered&lt;/code&gt;, and opt a single heading out with &lt;code&gt;:!numbered&lt;/code&gt;. &lt;code&gt;=config item1 :numbered&lt;/code&gt; renders a list as ordered (1., 2., 3.) instead of bulleted.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fooa63poluf3usu01gtly.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%2Fooa63poluf3usu01gtly.png" alt="Headings render with 1., 1.1., 1.2. prefixes; the items below become an ordered list" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Syntax-highlighted code blocks. &lt;code&gt;=code&lt;/code&gt; blocks with a &lt;code&gt;:lang&lt;/code&gt; attribute are highlighted in the live preview now, matching the editor pane. Inline formatting composes with the highlighter, so bold inside a code block renders over the syntax colors, and so do italic and inline code.&lt;/li&gt;
&lt;/ul&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%2Fpghykfnyi61y7vl0nil9.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%2Fpghykfnyi61y7vl0nil9.png" alt="Syntax-highlighted code blocks" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Apple Silicon build. The macOS distribution ships separate arm64 and x64 builds. Apple Silicon Macs run native instead of going through Rosetta 2; startup, file open, and preview switching are faster on M-series machines. Grab the &lt;code&gt;-arm64&lt;/code&gt; file for Apple Silicon, the unsuffixed one for Intel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What got fixed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Opening a &lt;code&gt;.podlite&lt;/code&gt; file from Finder no longer creates two windows. &lt;code&gt;File -&amp;gt; Open&lt;/code&gt; opens a fresh window instead of replacing the current one, and &lt;code&gt;Cmd+S&lt;/code&gt; on an untitled document opens Save-As instead of doing nothing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=picture&lt;/code&gt; renders under the Mac App Store sandbox. The build reads image bytes in the main process and inlines them as a base64 data URL, so the renderer no longer needs the &lt;code&gt;file://&lt;/code&gt; access the sandbox denies for sibling files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;External-edit reload survives atomic writes. The watcher now watches the parent directory and reloads on rename, instead of losing the inode when an IDE or sync tool writes via tmp + rename.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The file watcher no longer crashes the app when the OS denies recursive directory watching. Mac App Store paths and iCloud Drive folders hit this; auto-reload disables for that document instead of taking the app down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An empty &lt;code&gt;=Mermaid&lt;/code&gt; block no longer crashes the preview while the body is still empty.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A note on where the fix list came from
&lt;/h2&gt;

&lt;p&gt;Most of 0.8.x was shaped by one contributor. Across three ship cycles, &lt;a href="https://github.com/schueani" rel="noopener noreferrer"&gt;@schueani&lt;/a&gt; filed detailed bug reports: stack traces, reproducible test cases, and follow-up testing on each patch release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;p&gt;Podlite Desktop is on the &lt;a href="https://www.microsoft.com/store/apps/9NVNT9SNQJM8" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt;, &lt;a href="https://snapcraft.io/podlite" rel="noopener noreferrer"&gt;Snap&lt;/a&gt;, and the &lt;a href="https://apps.apple.com/us/app/podlite/id1526511053" rel="noopener noreferrer"&gt;Mac App Store&lt;/a&gt;. You can also download directly from &lt;a href="https://github.com/podlite/podlite-desktop/releases/tag/v0.8.3" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;: macOS arm64 and x64 DMG/zip, Windows .exe/.zip, Linux AppImage.&lt;/p&gt;

&lt;p&gt;Source is at &lt;a href="https://github.com/podlite/podlite-desktop" rel="noopener noreferrer"&gt;github.com/podlite/podlite-desktop&lt;/a&gt;. Want to try the markup without installing anything? &lt;a href="https://pod6.in" rel="noopener noreferrer"&gt;pod6.in&lt;/a&gt; runs the editor in the browser.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>podlite</category>
      <category>markup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Podlite 2.0 released</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Fri, 29 May 2026 09:57:15 +0000</pubDate>
      <link>https://dev.to/zag/podlite-20-released-3me</link>
      <guid>https://dev.to/zag/podlite-20-released-3me</guid>
      <description>&lt;p&gt;Podlite 2.0 is tagged. Podlite is a block-based markup language built around typed blocks and explicit boundaries — the same document is meant to read cleanly whether a person or a tool parses it. This release adds eight blocks and attributes and changes two parsing rules.&lt;/p&gt;

&lt;p&gt;The specification is at &lt;a href="https://podlite.org/specification" rel="noopener noreferrer"&gt;podlite.org/specification&lt;/a&gt;; the full changelog sits inside the spec under &lt;code&gt;=head2 v2.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://podlite.org/2026/5/7/1/coming-in-podlite-2-0" rel="noopener noreferrer"&gt;Coming in Podlite 2.0&lt;/a&gt; article from the review window covered what is new in depth. This post focuses on what to do now: how to migrate existing documents and where to find the rest. For most documents the answer is short — a well-formed v1.0 document renders unchanged under v2.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;p&gt;Two changes parse differently than before. Neither touches a well-formed document — if anything needs updating, it is a parser, not your text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Legacy attribute syntax removed
&lt;/h3&gt;

&lt;p&gt;A few outdated string attribute formats are gone. The bracket form (&lt;code&gt;:key&amp;lt;value&amp;gt;&lt;/code&gt;) and the parenthesized form (&lt;code&gt;:key('value')&lt;/code&gt;) remain.&lt;/p&gt;

&lt;p&gt;If a document uses the current syntax, nothing changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  =include is now a directive
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;=include&lt;/code&gt; always behaved like a directive, but the spec previously listed it under block types. Tokenization rules differ between directives and blocks. Parsers built against the v1.0 spec must move &lt;code&gt;=include&lt;/code&gt; into the directive dispatch path alongside &lt;code&gt;=config&lt;/code&gt; and &lt;code&gt;=alias&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For document authors: no change. &lt;code&gt;=include&lt;/code&gt; still takes the same syntax and produces the same output. The reclassification matters only for tools that build ASTs.&lt;/p&gt;

&lt;h2&gt;
  
  
  New features at a glance
&lt;/h2&gt;

&lt;p&gt;Eight additions ship in v2.0. Existing documents render unchanged.&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%2F55h60m9828vajmcp7gra.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.amazonaws.com%2Fuploads%2Farticles%2F55h60m9828vajmcp7gra.png" alt="All eight additions at a glance — 8-card grid" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=boundary&lt;/code&gt;: a typed section divider. Renders as a horizontal rule, exposes structure to tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=set&lt;/code&gt;: pre-configure attributes for the next block. Multiline values, inline markup, lexical scope.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;G&amp;lt;&amp;gt;&lt;/code&gt; + &lt;code&gt;:masked&lt;/code&gt;: content masking. Inline mark or whole-block attribute; hidden by default, revealed by render condition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=data-table&lt;/code&gt; block: renders CSV or TSV as a table. Three source forms (inline body, external &lt;code&gt;:src&amp;lt;file:X&amp;gt;&lt;/code&gt;, &lt;code&gt;=data&lt;/code&gt; reference). &lt;code&gt;:columns&lt;/code&gt; selects projection, &lt;code&gt;:rename{}&lt;/code&gt; overrides display names.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;  &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;begin&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Quarterly&lt;/span&gt; &lt;span class="k"&gt;sales&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;mime&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;'&lt;/span&gt;&lt;span class="k"&gt;text&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;csv&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="k"&gt;header&lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;present&lt;/span&gt;&lt;span class="err"&gt;'&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;quarter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;revenue&lt;/span&gt;
  &lt;span class="k"&gt;Q&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;12000&lt;/span&gt;
  &lt;span class="k"&gt;Q&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;18000&lt;/span&gt;
  &lt;span class="k"&gt;Q&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;15400&lt;/span&gt;
  &lt;span class="k"&gt;Q&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Gadget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;21200&lt;/span&gt;
  &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Extended &lt;code&gt;:mime-type&lt;/code&gt; syntax: accepts MIME parameters per RFC 6838, with &lt;code&gt;header=present|absent&lt;/code&gt; for CSV/TSV header indication per RFC 4180 §3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Markdown fenced code block attributes: the string after the language tag is now parsed as Podlite attributes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Per-link configuration attributes for &lt;code&gt;L&amp;lt;&amp;gt;&lt;/code&gt;: settings stay with the link rather than scattering through prose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;=table&lt;/code&gt; error recovery: explicit warnings for malformed rows (cell count mismatch, mixed separators), graceful fallback instead of silent corruption.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For full examples and rationale, the &lt;a href="https://podlite.org/2026/5/7/1/coming-in-podlite-2-0" rel="noopener noreferrer"&gt;Coming in Podlite 2.0&lt;/a&gt; article is still accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go from here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spec: &lt;a href="https://podlite.org/specification" rel="noopener noreferrer"&gt;podlite.org/specification&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changelog: spec &lt;code&gt;v2.0&lt;/code&gt; section, Keep a Changelog format&lt;/li&gt;
&lt;li&gt;GitHub release: &lt;a href="https://github.com/podlite/podlite-specs/releases/tag/v2.0" rel="noopener noreferrer"&gt;podlite-specs/releases/tag/v2.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discussions: &lt;a href="https://github.com/podlite/podlite-specs/discussions" rel="noopener noreferrer"&gt;podlite-specs/discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Editor: &lt;a href="https://pod6.in" rel="noopener noreferrer"&gt;pod6.in&lt;/a&gt; for trying the new directives live&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>documentation</category>
      <category>web</category>
      <category>podlite</category>
      <category>markup</category>
    </item>
    <item>
      <title>Coming in Podlite 2.0</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Thu, 07 May 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/zag/coming-in-podlite-20-4gn1</link>
      <guid>https://dev.to/zag/coming-in-podlite-20-4gn1</guid>
      <description>&lt;p&gt;The spec branch for Podlite 2.0 has landed in a pull request. The final tag goes up once the review window closes. If you build parsers or ship documents in Podlite, this is the time to read the diff and push back.&lt;/p&gt;

&lt;p&gt;Why a major bump? A few real breaking changes (mostly legacy string-attribute syntax that nobody should have been writing anyway), plus five big new features. Bundling them means one parser-side update instead of five spread over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two new directives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;=boundary&lt;/code&gt; — section dividers with semantics
&lt;/h3&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%2F4gfklsbhyk8kcmzixfme.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.amazonaws.com%2Fuploads%2Farticles%2F4gfklsbhyk8kcmzixfme.png" alt=" " width="321" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A divider with semantics. It renders as a horizontal rule, but the parser sees a typed block. A tool building a table of contents, page-splitter, or chapter-navigator knows exactly where one section ends and the next begins. The optional &lt;code&gt;:caption&lt;/code&gt; attribute describes the transition (&lt;code&gt;=boundary :caption('Part Two')&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;=set&lt;/code&gt; — per-block attribute assignment
&lt;/h3&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%2Fb01xlujfh7evj9htbsl3.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.amazonaws.com%2Fuploads%2Farticles%2Fb01xlujfh7evj9htbsl3.png" alt=" " width="507" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pre-configure attributes for the next block. Multiline values via continuation lines, inline markup inside attribute values, and lexical scope per file. The mechanism is useful when an attribute value is too long to sit on the directive line, or when you want to factor common attributes out of repeated blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content masking
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accept the terms to read G&amp;lt;the full case study&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="cm"&gt;=begin para :masked
Premium analysis. Hidden until the reader signs in.
=end&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;G&amp;lt;&amp;gt;&lt;/code&gt; masks inline content, &lt;code&gt;:masked&lt;/code&gt; masks whole blocks. The renderer hides the content by default and shows it once a condition is met — terms accepted, sign-in done, draft mode on. Use it for content released after agreement (T&amp;amp;C, paywall, age gate). Use it for credentials in code samples, PII in case studies, or unreleased details that should live in the source file but stay out of the rendered output.&lt;/p&gt;

&lt;p&gt;This hides content at render time. It is one layer of defense-in-depth, not a replacement for source-file access controls or secret-management tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smarter attributes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Markdown fenced code blocks accept attributes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The string after the language tag is now parsed as Podlite attributes. Previous behavior (raw meta string) is preserved when no attribute syntax is present.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;L&amp;lt;&amp;gt;&lt;/code&gt; takes per-link attributes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L&amp;lt;docs|https://example.com :rel&amp;lt;external&amp;gt; :class&amp;lt;button&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Settings stay with the link, not scattered through surrounding prose. Existing plain &lt;code&gt;L&amp;lt;text|url&amp;gt;&lt;/code&gt; works unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;:mime-type&lt;/code&gt; accepts MIME parameters
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;begin&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;planets&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;mime&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;'&lt;/span&gt;&lt;span class="k"&gt;text&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;csv&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="k"&gt;header&lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;present&lt;/span&gt;&lt;span class="err"&gt;'&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;radius&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;km&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;moons&lt;/span&gt;
  &lt;span class="k"&gt;Mercury&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2440&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;Venus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;6052&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;Earth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;6371&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;Mars&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3390&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;
&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;

&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;src&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;data:&lt;/span&gt;&lt;span class="k"&gt;planets&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Inner&lt;/span&gt; &lt;span class="k"&gt;planets&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;header=present|absent&lt;/code&gt; parameter (per RFC 4180 §3) tells the renderer to treat the first row as column labels in &lt;code&gt;=table data:X&lt;/code&gt;. The MIME parameter syntax follows RFC 6838.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSV and TSV tables with column projection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=for data-table :src&amp;lt;file:./planets.csv&amp;gt;
=    :columns&amp;lt;name,radius_km&amp;gt;
=    :rename{radius_km=&amp;gt;Radius}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A new &lt;code&gt;=data-table&lt;/code&gt; block renders CSV or TSV as a table. Three source forms: inline body between &lt;code&gt;=begin data-table&lt;/code&gt; and &lt;code&gt;=end data-table&lt;/code&gt;, external file via &lt;code&gt;:src&amp;lt;file:X.csv&amp;gt;&lt;/code&gt;, or referenced &lt;code&gt;=data&lt;/code&gt; block via &lt;code&gt;:src&amp;lt;data:key&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:columns&amp;lt;&amp;gt;&lt;/code&gt; selects which columns appear in output and in what order (names or 1-based indices). &lt;code&gt;:rename{}&lt;/code&gt; overrides column display names — sparse hash, only listed columns get overrides.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:mime-type&lt;/code&gt; is inferred when possible: from file extension for &lt;code&gt;file:&lt;/code&gt; sources, from HTTP &lt;code&gt;Content-Type&lt;/code&gt; for remote sources, inherited from the referenced block for &lt;code&gt;data:&lt;/code&gt; sources. Explicit declaration is required only for inline body and when inference fails.&lt;/p&gt;

&lt;p&gt;Why a separate block? CSV/TSV bodies need verbatim parsing different from &lt;code&gt;=table&lt;/code&gt;'s formatted-row grammar. Putting two grammars behind one typename would force the parser to read attributes before picking a code path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reclassifications and fixes
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;=include&lt;/code&gt; is now formally a directive, consistent with &lt;code&gt;=config&lt;/code&gt; and &lt;code&gt;=alias&lt;/code&gt;. &lt;code&gt;:folded&lt;/code&gt; got a tighter definition. &lt;code&gt;=table&lt;/code&gt; has explicit error recovery rules. Malformed rows (wrong cell count, mixed separators) now emit a warning and continue, instead of dropping the parser into silent fallback.&lt;/p&gt;

&lt;p&gt;Removed: a few outdated string attribute formats. If you write the current syntax, nothing changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the diff before the tag lands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pull request: &lt;a href="https://github.com/podlite/podlite-specs/pull/26" rel="noopener noreferrer"&gt;podlite-specs#26&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Branch: &lt;code&gt;release/v2.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Discussions: &lt;a href="https://github.com/podlite/podlite-specs/discussions" rel="noopener noreferrer"&gt;podlite-specs/discussions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something looks off — a broken example, ambiguous wording, an edge case the spec doesn't cover — this is the window. Feedback after the tag is much harder to act on.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>podlite</category>
      <category>webdev</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Podlite Desktop 0.7.0 — smart lists, code folding</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Mon, 30 Mar 2026 16:59:08 +0000</pubDate>
      <link>https://dev.to/zag/podlite-desktop-070-smart-lists-code-folding-am</link>
      <guid>https://dev.to/zag/podlite-desktop-070-smart-lists-code-folding-am</guid>
      <description>&lt;p&gt;Podlite Desktop 0.7.0 is out. A free, open source editor for Podlite markup — a block-based language that extends Markdown with diagrams, formulas, tables and task lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in 0.7.0
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;smart list continuation on Enter with checkbox/numbering inheritance&lt;/li&gt;
&lt;li&gt;Tab / Shift+Tab for nesting levels&lt;/li&gt;
&lt;li&gt;code folding for &lt;code&gt;=begin&lt;/code&gt;/&lt;code&gt;=end&lt;/code&gt; and &lt;code&gt;=head&lt;/code&gt; sections&lt;/li&gt;
&lt;li&gt;collapsible blocks via &lt;code&gt;:folded&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;input latency reduced from 860ms to near-zero&lt;/li&gt;
&lt;li&gt;session restore (cursor, scroll, folds, view mode)&lt;/li&gt;
&lt;/ul&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%2Fjap62jpiimyfyeskbni4.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%2Fjap62jpiimyfyeskbni4.gif" alt="Smart Lists" width="900" height="600"&gt;&lt;/a&gt;&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%2Fwivsg9vpnpwz2wgjzpcw.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%2Fwivsg9vpnpwz2wgjzpcw.gif" alt="Nesting Levels" width="720" height="480"&gt;&lt;/a&gt;&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%2Fkm5fz5rpiee8uu979ha0.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%2Fkm5fz5rpiee8uu979ha0.gif" alt="Code Folding" width="800" height="533"&gt;&lt;/a&gt;&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%2Fm7xe47wipea6w8jczt0y.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%2Fm7xe47wipea6w8jczt0y.gif" alt="Folded blocks" width="900" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Available on macOS, Windows, Linux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/podlite/podlite-desktop/releases/tag/v0.7.0" rel="noopener noreferrer"&gt;Download from GitHub&lt;/a&gt; · &lt;a href="https://apps.apple.com/us/app/podlite/id1526511053" rel="noopener noreferrer"&gt;Mac App Store&lt;/a&gt; · &lt;a href="https://www.microsoft.com/store/apps/9NVNT9SNQJM8" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt; · &lt;a href="https://snapcraft.io/podlite" rel="noopener noreferrer"&gt;Snap Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Site: &lt;a href="https://podlite.org/2026/3/30/1/podlite-desktop-0-7-0-released" rel="noopener noreferrer"&gt;podlite.org&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>One command to add structured markup to your AI agent</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Wed, 11 Mar 2026 21:41:26 +0000</pubDate>
      <link>https://dev.to/zag/one-command-to-add-structured-markup-to-your-ai-agent-3pp9</link>
      <guid>https://dev.to/zag/one-command-to-add-structured-markup-to-your-ai-agent-3pp9</guid>
      <description>&lt;p&gt;I've been keeping a personal knowledge base for years. Notes, specs, decisions, journal entries — all in plain text files. When AI agents became part of my workflow, I started using them to write structured documents: RFC drafts, revision histories, typed notes with metadata. It worked well. Until I closed the session.&lt;/p&gt;

&lt;p&gt;The next agent would open the same file and start from scratch — not because it forgot, but because the file gave no structure to hold onto. That's when I started looking at the format, not the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I kept running into
&lt;/h2&gt;

&lt;p&gt;My knowledge base has hundreds of files. An agent can read them, but reading isn't the same as understanding the shape of the file. Is this a journal entry or a spec? Is this draft published or scheduled? When was it written?&lt;/p&gt;

&lt;p&gt;Plain text doesn't answer those questions. Markdown frontmatter gets you partway — but it's a convention, not a contract. Tools may or may not parse it, and agents that haven't been told what to look for usually don't. When I asked an agent to "write a blog post and schedule it for next Thursday," it produced great prose and put a date somewhere in the text. My publishing pipeline saw nothing.&lt;/p&gt;

&lt;p&gt;The problem wasn't the agent's writing. The problem was that the file had no machine-readable structure. The agent had nowhere to put the metadata so that both humans and downstream tools could reliably find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Podlite gives you
&lt;/h2&gt;

&lt;p&gt;Podlite is a markup language built around explicit, typed blocks. Every block has a declared type, and blocks can carry named attributes — structured metadata that travels with the content.&lt;/p&gt;

&lt;p&gt;Here's what a blog post looks like when an agent creates it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=begin pod :pubdate('2026-03-12 10:00:00') :type('page') :publishUrl('/blog/podlite-skills')

=TITLE One command to add structured markup to your AI agent

Content written by the agent...

=end pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;:pubdate&lt;/code&gt;, &lt;code&gt;:type&lt;/code&gt;, and &lt;code&gt;:publishUrl&lt;/code&gt; attributes aren't decorative. They're fields — any parser or tool that reads Podlite can access them directly, without guessing where in the prose to look.&lt;/p&gt;

&lt;p&gt;Podlite natively includes Markdown, so you don't throw away existing files or habits. You can use Markdown syntax inside Podlite blocks without any changes. The structure layer sits on top; the content layer stays familiar.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this plays out in practice
&lt;/h2&gt;

&lt;p&gt;I ask Claude Code to draft a blog post about a recent technical decision. It creates a &lt;code&gt;.podlite&lt;/code&gt; file with &lt;code&gt;:pubdate&lt;/code&gt; set to next Wednesday and &lt;code&gt;:publishUrl&lt;/code&gt; matching the slug I described. The prose is good. The metadata is correct. I close the session.&lt;/p&gt;

&lt;p&gt;On Tuesday, I open a new session and ask a different agent to review the post and push the publish date back a week — I want more time to add a code example. The agent opens the file, reads the block header, finds &lt;code&gt;:pubdate&lt;/code&gt;, changes the timestamp. That's it.&lt;/p&gt;

&lt;p&gt;Worth slowing down on: the second agent didn't need context from the first session. The file itself carried the instructions. &lt;code&gt;:pubdate&lt;/code&gt; is not a comment or a prose sentence — it's a structured field that any agent, parser, or tool can read without guessing. What acts on it depends on your setup — in my case a publishing pipeline that scans the folder and schedules based on the attribute. But the attribute is readable by anything.&lt;/p&gt;

&lt;p&gt;This is the difference between "metadata mentioned in the file" and "metadata in the 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%2Fst77qh7qx5xe9azy5w3h.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.amazonaws.com%2Fuploads%2Farticles%2Fst77qh7qx5xe9azy5w3h.png" alt="podlite-skills" width="800" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing podlite-skills
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add podlite/podlite-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds Podlite support to your AI agent environment — Claude Code, GitHub Copilot, Cursor, Codex CLI. After installation, the agent understands Podlite block syntax, attribute conventions, and how to create well-formed structured documents.&lt;/p&gt;

&lt;p&gt;No configuration file to edit. No extension to install separately. The skill installs, and the agent knows the format. Even without a custom pipeline, you get files where an agent consistently puts type information and metadata in the same place — which means the next agent (or the next you, in six months) can read the file and know exactly what it is and what state it's in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually use it for
&lt;/h2&gt;

&lt;p&gt;Three categories got noticeably better after switching:&lt;/p&gt;

&lt;p&gt;Blog posts and RFC drafts — &lt;code&gt;:pubdate&lt;/code&gt;, &lt;code&gt;:status&lt;/code&gt;, &lt;code&gt;:type&lt;/code&gt; mean any agent can pick up where another left off without me re-explaining the document's state.&lt;/p&gt;

&lt;p&gt;Decision logs — typed blocks mean I can query "all decisions made in Q1" without parsing prose.&lt;/p&gt;

&lt;p&gt;Specs with revision history — explicit block structure makes diff-reading much easier for agents doing review passes.&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%2Fstpk8du9tpwzfr5tlrqr.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.amazonaws.com%2Fuploads%2Farticles%2Fstpk8du9tpwzfr5tlrqr.png" alt="RFC drafts" width="792" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The files are still plain text. The agent still writes prose. The difference is that now the output holds its shape between sessions — metadata stays where it was put, structure stays parseable, and any tool or agent that opens the file later starts with something to work with rather than nothing.&lt;/p&gt;

&lt;p&gt;If you're already using an AI agent for writing or documentation, this is a one-minute install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add podlite/podlite-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://github.com/podlite/podlite-skills" rel="noopener noreferrer"&gt;podlite-skills repository&lt;/a&gt; has the full list of supported blocks and attributes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>writing</category>
      <category>llm</category>
    </item>
    <item>
      <title>The Block Structure of Podlite</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Fri, 05 Dec 2025 08:14:04 +0000</pubDate>
      <link>https://dev.to/zag/the-block-structure-of-podlite-513m</link>
      <guid>https://dev.to/zag/the-block-structure-of-podlite-513m</guid>
      <description>&lt;p&gt;&lt;a href="https://podlite.org" rel="noopener noreferrer"&gt;Podlite&lt;/a&gt; is a small block-based markup language that is easy to read as plain text, simple to parse, and flexible enough to be used everywhere — in code, notes, technical documents, long-form writing, and even full documentation systems.&lt;/p&gt;

&lt;p&gt;One of the core ideas behind Podlite is its consistent block-based structure.&lt;br&gt;
Every meaningful element of a document — a heading, a paragraph, a list item, a table, a code block, a callout — is represented as a block. This makes documents both readable for humans and predictable for tools.&lt;/p&gt;

&lt;p&gt;Podlite supports three interchangeable block styles: &lt;code&gt;delimited&lt;/code&gt;, &lt;code&gt;paragraph&lt;/code&gt;, and &lt;code&gt;abbreviated&lt;/code&gt;.&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%2Fn6biozuatt1z0y2i6e8r.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.amazonaws.com%2Fuploads%2Farticles%2Fn6biozuatt1z0y2i6e8r.png" alt="diagram here showing the three block styles and how they map to the same internal structure" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Abbreviated blocks (&lt;code&gt;=BLOCK&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;This is the most compact form.&lt;br&gt;
A block starts with &lt;code&gt;=&lt;/code&gt; followed by the block name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;head1&lt;/span&gt; &lt;span class="nv"&gt;Getting&lt;/span&gt; &lt;span class="nv"&gt;Started&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt; &lt;span class="nv"&gt;Install&lt;/span&gt; &lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;js&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;para&lt;/span&gt; &lt;span class="nv"&gt;Podlite&lt;/span&gt; &lt;span class="nv"&gt;makes&lt;/span&gt; &lt;span class="nv"&gt;documentation&lt;/span&gt; &lt;span class="nv"&gt;predictable&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;easy&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;automate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ends on the next directive or a blank line&lt;/li&gt;
&lt;li&gt;best used for simple one-line blocks&lt;/li&gt;
&lt;li&gt;cannot include configuration options (attributes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Paragraph blocks (&lt;code&gt;=for BLOCK&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Use this form when you want a multi-line block or need attributes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;code&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nv"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;Hello from Podlite!&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ends when a blank line appears&lt;/li&gt;
&lt;li&gt;can include complex content&lt;/li&gt;
&lt;li&gt;allows attributes such as &lt;code&gt;:lang&lt;/code&gt;, &lt;code&gt;:id&lt;/code&gt;, &lt;code&gt;:caption&lt;/code&gt;, &lt;code&gt;:nested&lt;/code&gt;, …&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Delimited blocks (&lt;code&gt;=begin BLOCK&lt;/code&gt; … &lt;code&gt;=end BLOCK&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The most expressive form. Useful for large sections, nested blocks, or structures that require clarity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;begin&lt;/span&gt; &lt;span class="nv"&gt;nested&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;important&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nv"&gt;Make&lt;/span&gt; &lt;span class="nv"&gt;sure&lt;/span&gt; &lt;span class="nv"&gt;you&lt;/span&gt; &lt;span class="nv"&gt;have&lt;/span&gt; &lt;span class="nv"&gt;administrator&lt;/span&gt; &lt;span class="nv"&gt;privileges&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;nested&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;explicit start and end markers&lt;/li&gt;
&lt;li&gt;perfect for code, lists, tables, notifications, markdown, formulas&lt;/li&gt;
&lt;li&gt;can contain other blocks, including nested ones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These block styles differ in syntax convenience, but all produce the same internal structure.&lt;/p&gt;

&lt;p&gt;Regardless of which syntax you choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all three forms represent the same &lt;strong&gt;block type&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;attributes apply the same way (&lt;code&gt;:lang&lt;/code&gt;, &lt;code&gt;:caption&lt;/code&gt;, &lt;code&gt;:id&lt;/code&gt;, …)&lt;/li&gt;
&lt;li&gt;tools and renderers treat them uniformly&lt;/li&gt;
&lt;li&gt;nested blocks work identically&lt;/li&gt;
&lt;li&gt;you can freely mix styles inside a document&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project site: &lt;a href="https://podlite.org" rel="noopener noreferrer"&gt;https://podlite.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/podlite" rel="noopener noreferrer"&gt;https://github.com/podlite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Specification

&lt;ul&gt;
&lt;li&gt;(HTML): &lt;a href="https://podlite.org/specification" rel="noopener noreferrer"&gt;https://podlite.org/specification&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;source: &lt;a href="https://github.com/podlite/podlite-specs" rel="noopener noreferrer"&gt;https://github.com/podlite/podlite-specs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Roadmap: &lt;a href="https://podlite.org/#Roadmap" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://podlite.org/#Roadmap" rel="noopener noreferrer"&gt;https://podlite.org/#Roadmap&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>documentation</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Podlite Desktop Editor 0.6.1 is out</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Sat, 01 Nov 2025 10:51:12 +0000</pubDate>
      <link>https://dev.to/zag/podlite-desktop-editor-061-is-out-3e0i</link>
      <guid>https://dev.to/zag/podlite-desktop-editor-061-is-out-3e0i</guid>
      <description>&lt;p&gt;Just released a new version of Podlite Desktop Editor - a free markup editor that works with Markdown and extends it with some pretty useful features. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's Podlite?
&lt;/h2&gt;

&lt;p&gt;Think of it as Markdown++. All your standard Markdown works via &lt;code&gt;=markdown&lt;/code&gt; blocks. It's block-oriented, so everything stays clean and readable.  Check out the Podlite Quick Tour: &lt;a href="https://podlite.org/quick-tour" rel="noopener noreferrer"&gt;https://podlite.org/quick-tour&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in 0.6.1
&lt;/h2&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%2F9x7pt0jdo3xccc5i19nt.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.amazonaws.com%2Fuploads%2Farticles%2F9x7pt0jdo3xccc5i19nt.png" alt="Editor screenshot" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rebuilt the editor from scratch with updated libraries. Here's what changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Syntax highlighting that actually works well&lt;/li&gt;
&lt;li&gt;Inline formatting: &lt;code&gt;B&amp;lt;bold&amp;gt;&lt;/code&gt;, &lt;code&gt;I&amp;lt;italic&amp;gt;&lt;/code&gt;, &lt;code&gt;C&amp;lt;code&amp;gt;&lt;/code&gt;, &lt;code&gt;L&amp;lt;links&amp;gt;&lt;/code&gt;, &lt;code&gt;O&amp;lt;strikethrough&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click links with Cmd/Ctrl to open them&lt;/li&gt;
&lt;li&gt;Link to other files with &lt;code&gt;file:&lt;/code&gt; schema - they open in new windows&lt;/li&gt;
&lt;li&gt;Text search (finally!)&lt;/li&gt;
&lt;li&gt;Fixed a bunch of window resize bugs&lt;/li&gt;
&lt;li&gt;macOS Tahoe support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can toggle between half-screen and full-screen preview with keyboard shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;p&gt;Available free on all platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github releases: &lt;a href="https://github.com/podlite/podlite-desktop/releases" rel="noopener noreferrer"&gt;https://github.com/podlite/podlite-desktop/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Store, Snap Store, Mac App Store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try the web version first if you want: &lt;a href="https://pod6.in" rel="noopener noreferrer"&gt;https://pod6.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full details: &lt;a href="https://podlite.org/2025/11/1/1/podlite-desktop-editor-0-6-1-released" rel="noopener noreferrer"&gt;https://podlite.org/2025/11/1/1/podlite-desktop-editor-0-6-1-released&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/podlite/podlite-desktop" rel="noopener noreferrer"&gt;https://github.com/podlite/podlite-desktop&lt;/a&gt;&lt;/p&gt;

</description>
      <category>writing</category>
      <category>programming</category>
      <category>markdown</category>
      <category>webdev</category>
    </item>
    <item>
      <title>📝 Inline text formatting in Podlite editor</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Sun, 26 Oct 2025 15:30:09 +0000</pubDate>
      <link>https://dev.to/zag/inline-text-formatting-in-podlite-editor-4gnm</link>
      <guid>https://dev.to/zag/inline-text-formatting-in-podlite-editor-4gnm</guid>
      <description>&lt;p&gt;Podlite supports rich inline text formatting within paragraphs and table cells:&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%2F2dcfdtp257mx3u493f0x.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%2F2dcfdtp257mx3u493f0x.gif" alt=" " width="760" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Supported Formatting Codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;B&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bold text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;B&amp;lt;important&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;important&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;I&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Italic text&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;I&amp;lt;emphasis&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;emphasis&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;C&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Code/monospace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;C&amp;lt;function()&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;function()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔗 Links&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;L&amp;lt;https://example.com&lt;/code&gt;|&lt;code&gt;click here&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://example.com" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;O&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;Strikethrough&lt;/del&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;O&amp;lt;deleted text&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;del&gt;deleted text&lt;/del&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These formatting codes can be combined within any paragraph or table cell to create rich, formatted content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://podlite.org" rel="noopener noreferrer"&gt;Podlite&lt;/a&gt; is a lightweight block-based markup language designed for flexibility and ease of use.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>tutorial</category>
      <category>writing</category>
    </item>
    <item>
      <title>Web editor with Podlite markup language syntax highlighting is here!</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Mon, 13 Jan 2025 17:39:25 +0000</pubDate>
      <link>https://dev.to/zag/web-editor-with-podlite-markup-language-syntax-highlighting-is-here-2la</link>
      <guid>https://dev.to/zag/web-editor-with-podlite-markup-language-syntax-highlighting-is-here-2la</guid>
      <description>&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%2Fieth624nmdaq9bzw1h58.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%2Fieth624nmdaq9bzw1h58.gif" alt="Web Editor with Podlite markup language syntax highlighting" width="720" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check it out at &lt;a href="https://pod6.in/" rel="noopener noreferrer"&gt;pod6.in&lt;/a&gt;!  &lt;/p&gt;

&lt;p&gt;It was included as part of &lt;a href="https://github.com/podlite/podlite/releases/tag/v0.0.45" rel="noopener noreferrer"&gt;Podlite v0.0.45&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>podlite</category>
    </item>
    <item>
      <title>Podlite: Powering Up Knowledge Management</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Fri, 04 Oct 2024 06:00:00 +0000</pubDate>
      <link>https://dev.to/zag/podlite-powering-up-knowledge-management-1knn</link>
      <guid>https://dev.to/zag/podlite-powering-up-knowledge-management-1knn</guid>
      <description>&lt;p&gt;Hey  👋 Exciting news from the &lt;a href="https://podlite.org" rel="noopener noreferrer"&gt;Podlite&lt;/a&gt; project!  Podlite keeps evolving, opening up new possibilities for knowledge management. &lt;/p&gt;

&lt;p&gt;Check out this list of recent achievements in the &lt;a href="https://github.com/podlite/podlite-web/" rel="noopener noreferrer"&gt;Podlite-web&lt;/a&gt; package for creating web projects:&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New? 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Support&lt;/strong&gt;: Extend functionality easily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Term Index &amp;amp; Full-Text Search&lt;/strong&gt;: Find info fast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Integration&lt;/strong&gt;: Build dynamic, interactive pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic ToC &amp;amp; Breadcrumbs&lt;/strong&gt;: Improve navigation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Syntax Highlighting&lt;/strong&gt;: Make your docs shine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  See It in Action 👀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Raku Knowledge Base v1.0 (Artistic 2.0 License)
&lt;/h3&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%2Fcvtg3bop0oq4cnh5h046.jpg" 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%2Fcvtg3bop0oq4cnh5h046.jpg" alt="The Raku Knowledge Base" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://raku-knowledge-base.podlite.org/" rel="noopener noreferrer"&gt;The Raku Knowledge Base&lt;/a&gt; - a comprehensive, open-source knowledge base for the Raku programming language built with Podlite-web.&lt;/p&gt;

&lt;p&gt;Raku (formerly Perl 6) is a powerful, multi-paradigm language. This knowledge base aims to make it more accessible and easier to learn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📚 Official Raku documentation&lt;/li&gt;
&lt;li&gt;📦 User module docs&lt;/li&gt;
&lt;li&gt;💻 Code example collections&lt;/li&gt;
&lt;li&gt;🔍 Full-text search&lt;/li&gt;
&lt;li&gt;🧭 Easy navigation with breadcrumbs&lt;/li&gt;
&lt;li&gt;🔗 Auto-generated term index&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read more about the &lt;a href="https://raku-knowledge-base.podlite.org/" rel="noopener noreferrer"&gt;The Raku Knowledge Base&lt;/a&gt; in detail in the official announcement on the Podlite website &lt;a href="https://podlite.org/a5ZK1" rel="noopener noreferrer"&gt;podlite.org/a5ZK1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Involved 🤝
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌟 Star the repo: &lt;a href="https://github.com/zag/raku-knowledge-base" rel="noopener noreferrer"&gt;https://github.com/zag/raku-knowledge-base&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 Report issues: &lt;a href="https://github.com/zag/raku-knowledge-base/issues" rel="noopener noreferrer"&gt;https://github.com/zag/raku-knowledge-base/issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🛠️ Contribute: PRs welcome!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Podlite for your next documentation project!&lt;br&gt;
Let me know what you think or if you have any questions!&lt;/p&gt;

&lt;p&gt;Happy coding! 💻✨&lt;br&gt;
thank you!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>documentation</category>
      <category>podlite</category>
      <category>rakulang</category>
    </item>
    <item>
      <title>Excited to announce that Podlite's TypeScript implementation now supports formulas! 🧮✨</title>
      <dc:creator>Alexandr Zahatski</dc:creator>
      <pubDate>Mon, 27 May 2024 08:12:11 +0000</pubDate>
      <link>https://dev.to/zag/excited-to-announce-that-podlites-typescript-implementation-now-supports-formulas-55g4</link>
      <guid>https://dev.to/zag/excited-to-announce-that-podlites-typescript-implementation-now-supports-formulas-55g4</guid>
      <description>&lt;p&gt;I'm excited to announce that&amp;nbsp;&lt;a href="https://github.com/podlite/podlite" rel="noopener noreferrer"&gt;podlite&lt;/a&gt;&amp;nbsp;now supports formulas!&lt;/p&gt;

&lt;p&gt;You can enter formulas using the code&amp;nbsp;&lt;code&gt;F&amp;lt;&amp;gt;&lt;/code&gt;&amp;nbsp;and the block&amp;nbsp;&lt;code&gt;=formula&lt;/code&gt;.&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%2Fwhernpyc8qigh2yqv3rw.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%2Fwhernpyc8qigh2yqv3rw.gif" alt="podlite fomulas" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within the&amp;nbsp;&lt;code&gt;=markdown&lt;/code&gt;&amp;nbsp;block, use&amp;nbsp;&lt;code&gt;$...$&lt;/code&gt;&amp;nbsp;for inline formulas and&amp;nbsp;&lt;code&gt;$$...$$&lt;/code&gt;&amp;nbsp;for display formulas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pod6.in/#p=%3Dfor+formula+%3Acaption%28%27The+Cauchy-Schwarz+Inequality%27%29%0A+++%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+a_k+b_k+%5Cright%29%5E2+%5Cleq+%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+a_k%5E2+%5Cright%29+%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+b_k%5E2+%5Cright%29%0A%0A%0A%0AThis+is+an+inline++example%3A+F%3C+y+%3D+%5Csqrt%7B3x-1%7D%2B%281%2Bx%29%5E2+%3E%0A%0A%3Dbegin+markdown%0A%0A++*+this+is+a+example+of+%60formula%60+inside+markdown%3A+%24y+%3D+%5Csqrt%7B3x-1%7D%2B%281%2Bx%29%5E2%24%0A++%0A++and+block%3A+%0A++%0A++%24%24%0A++%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+a_k+b_k+%5Cright%29%5E2+%5Cleq+%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+a_k%5E2+%5Cright%29+%5Cleft%28+%5Csum_%7Bk%3D1%7D%5En+b_k%5E2+%5Cright%29%0A++%24%24%0A++%0A++%0A%0A%3Dend+markdown%0A%0A" rel="noopener noreferrer"&gt;Example on pod6.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, see&amp;nbsp;&lt;a href="https://en.wikibooks.org/wiki/LaTeX/Mathematics" rel="noopener noreferrer"&gt;LaTeX/Mathematics&lt;/a&gt;&amp;nbsp;in Wikibooks.&lt;/p&gt;

&lt;p&gt;thank you!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>podlite</category>
      <category>documentation</category>
    </item>
  </channel>
</rss>
