<?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: zhitong</title>
    <description>The latest articles on DEV Community by zhitong (@zhitongblog).</description>
    <link>https://dev.to/zhitongblog</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%2F3874383%2F514ce83a-a590-4923-99a4-865cf6d0ab96.jpg</url>
      <title>DEV Community: zhitong</title>
      <link>https://dev.to/zhitongblog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhitongblog"/>
    <language>en</language>
    <item>
      <title>I built a 3.2 MB archiver your AI agent can drive</title>
      <dc:creator>zhitong</dc:creator>
      <pubDate>Tue, 15 Sep 2026 05:23:03 +0000</pubDate>
      <link>https://dev.to/zhitongblog/i-built-a-32-mb-archiver-your-ai-agent-can-drive-2jga</link>
      <guid>https://dev.to/zhitongblog/i-built-a-32-mb-archiver-your-ai-agent-can-drive-2jga</guid>
      <description>&lt;p&gt;Disclosure up front: &lt;strong&gt;I wrote Ziplark.&lt;/strong&gt; It is MIT, free, and I will list its weak spots at the bottom so you can judge for yourself.&lt;/p&gt;

&lt;p&gt;The Windows installer is &lt;strong&gt;3.2 MB&lt;/strong&gt;. Not because of any clever trick — the desktop app uses the OS webview instead of bundling a browser, and there is no account system, no store, no telemetry to ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  One engine, three shells
&lt;/h2&gt;

&lt;p&gt;Everything lives in &lt;code&gt;ziplark-core&lt;/code&gt;. The GUI, the CLI and the MCP server are thin wrappers over it, so whatever the CLI does, the desktop app does identically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ziplark list     movie.rar           &lt;span class="c"&gt;# or: l&lt;/span&gt;
ziplark extract  photos.zip &lt;span class="nt"&gt;-o&lt;/span&gt; ./out &lt;span class="c"&gt;# or: x&lt;/span&gt;
ziplark create   backup.tar.zst ./src &lt;span class="nt"&gt;--level&lt;/span&gt; best   &lt;span class="c"&gt;# or: c&lt;/span&gt;
ziplark &lt;span class="nb"&gt;test     &lt;/span&gt;download.7z         &lt;span class="c"&gt;# or: t&lt;/span&gt;
ziplark info     mystery.bin         &lt;span class="c"&gt;# format from magic bytes, not the extension&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Options are few: &lt;code&gt;-p/--password&lt;/code&gt;, &lt;code&gt;-o&lt;/code&gt;, &lt;code&gt;--overwrite&lt;/code&gt;, &lt;code&gt;--include &amp;lt;PAT&amp;gt;&lt;/code&gt; to pull only matching entries, &lt;code&gt;--level store|fast|default|best&lt;/code&gt;, and &lt;code&gt;--json&lt;/code&gt; on every command.&lt;/p&gt;

&lt;p&gt;That last one is the point. &lt;code&gt;ziplark l big.7z --json&lt;/code&gt; gives you a structured entry list — path, size, compressed size, encrypted flag, CRC32 — so piping into &lt;code&gt;jq&lt;/code&gt; just works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part you are probably here for: MCP
&lt;/h2&gt;

&lt;p&gt;Ziplark ships an MCP server, &lt;code&gt;ziplark-mcp&lt;/code&gt;, speaking JSON-RPC over stdio. Register it like anything else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ziplark"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/ziplark-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"--allow-write"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your agent can answer "is there a &lt;code&gt;.env&lt;/code&gt; in this 7z?" or "extract this into tmp" or "is this download corrupt?" without you unpacking anything first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reads and writes are separated, and not the way you might expect.&lt;/strong&gt; Three read-only tools — &lt;code&gt;ziplark_info&lt;/code&gt;, &lt;code&gt;ziplark_list&lt;/code&gt;, &lt;code&gt;ziplark_test&lt;/code&gt; — are always available. The two that touch your disk, &lt;code&gt;ziplark_extract&lt;/code&gt; and &lt;code&gt;ziplark_create&lt;/code&gt;, &lt;strong&gt;do not appear in &lt;code&gt;tools/list&lt;/code&gt; at all&lt;/strong&gt; unless you pass &lt;code&gt;--allow-write&lt;/code&gt;. It is not a runtime refusal; the model simply never sees them. Default is read-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extraction is a security problem, so it gets one guard
&lt;/h2&gt;

&lt;p&gt;The paths inside an archive are chosen by whoever made the archive. An entry can be named &lt;code&gt;../../../../etc/passwd&lt;/code&gt;. It can be a symlink pointing at a system directory. An extractor that takes them at face value lets one archive overwrite arbitrary files — the class of bug known as zip slip.&lt;/p&gt;

&lt;p&gt;Every format in Ziplark extracts through the same guard, and it checks &lt;strong&gt;both&lt;/strong&gt; ends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;entry name&lt;/strong&gt; — &lt;code&gt;../&lt;/code&gt;, absolute paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;what is actually on disk&lt;/strong&gt; at the destination — is that a symlink?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second check is the one that gets skipped elsewhere. That symlink may have been planted by an earlier entry &lt;em&gt;in the same archive&lt;/em&gt;, or it may already be sitting in the target directory. There is a test named &lt;code&gt;rejects_zip_slip&lt;/code&gt; that builds a hand-crafted escaping zip and throws it at the extractor.&lt;/p&gt;

&lt;p&gt;Fifteen formats share that one guard because they share one engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formats
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Read and write:&lt;/strong&gt; ZIP (AES-256), 7z (AES-256), tar, tar.gz/.bz2/.xz/.zst/.lz4, and gz / bz2 / xz / zst / lz4 single streams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read only:&lt;/strong&gt; RAR and RAR5 (encrypted ones included) — the UnRAR licence forbids using that code to build a compressor, so no open-source tool can write RAR. Also ISO 9660 / Joliet, through a dependency-free parser.&lt;/p&gt;

&lt;p&gt;Permissions, mtimes and symlinks survive the round trip, so an extracted binary still runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Right-click integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ziplark shell-integration &lt;span class="nb"&gt;install&lt;/span&gt;     &lt;span class="c"&gt;# status | uninstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adds &lt;strong&gt;Extract here&lt;/strong&gt; and &lt;strong&gt;Compress to ZIP&lt;/strong&gt;. On Windows it writes to &lt;code&gt;HKCU&lt;/code&gt;, so &lt;strong&gt;no admin prompt&lt;/strong&gt;. On macOS it installs two Automator Quick Actions; on Linux, KDE service menus and Nautilus scripts. All three just shell out to the same &lt;code&gt;ziplark&lt;/code&gt; binary, so moving the binary moves the menu with it.&lt;/p&gt;

&lt;p&gt;Name collisions never clobber: an existing folder gets &lt;code&gt;(2)&lt;/code&gt;, &lt;code&gt;(3)&lt;/code&gt; appended.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it compares
&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%2F0reshedc5ti7ff5xda9b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0reshedc5ti7ff5xda9b.jpg" alt="Four archivers compared: Ziplark is free and MIT with GUIs on Windows, macOS and Linux plus five MCP tools; 7-Zip is free and open source but its GUI is Windows-only; WinRAR costs $29 after a 40-day trial and is the only one that can create RAR; Bandizip's free tier is advertising-supported with a $30 Pro licence" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7-Zip is the solid one here — version 26.03, mostly LGPL, and it reads thirty-odd formats including ARJ, CAB, CHM, DMG and VHD. But its &lt;strong&gt;GUI is Windows-only&lt;/strong&gt;; on Linux and macOS the official build is a console version.&lt;/p&gt;

&lt;p&gt;WinRAR 7.23 is the only one that can &lt;em&gt;create&lt;/em&gt; RAR. Its licence says plainly: "anyone may use the software during a test period of a maximum of 40 days at no charge", then "the user must purchase a license to continue using the software." A single-machine licence is $29 at checkout today.&lt;/p&gt;

&lt;p&gt;Bandizip's free tier is funded by ads — that is their own product page wording, &lt;code&gt;Advertising-supported software&lt;/code&gt;. Pro is $30 perpetual for up to 5 machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things it is not
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It is barely used.&lt;/strong&gt; 1 star on GitHub; the v0.2.2 Windows installer has 11 downloads. You would be an early user, and you would probably be filing your own issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It reads fewer formats than 7-Zip.&lt;/strong&gt; Fifteen versus thirty-plus. No ARJ, CAB, CHM, DMG, MSI, VHD or SquashFS. Keep 7-Zip for the long tail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No RAR creation and no split archives.&lt;/strong&gt; RAR is a licence wall nobody can climb. Split volumes are just not built yet — there is no such option in the CLI and no such concept in the engine. If you need a file cut into five 200 MB parts, WinRAR or 7-Zip.&lt;/p&gt;

&lt;p&gt;The desktop UI is also plain. No image preview inside archives, which Bandizip Pro has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Windows &lt;code&gt;.exe&lt;/code&gt; 3.2 MB or &lt;code&gt;.msi&lt;/code&gt; 4.3 MB. macOS is a 7.0 MB universal dmg. Linux has a 2.1 MB deb and a 73.3 MB AppImage — the gap is real: the deb uses your system libraries, the AppImage carries its own.&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="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; zhitongblog/tap/ziplark   &lt;span class="c"&gt;# desktop&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;zhitongblog/tap/ziplark          &lt;span class="c"&gt;# CLI + MCP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ziplark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/zhitongblog/scoop-bucket&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ziplark&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source and builds: &lt;a href="https://github.com/zhitongblog/ziplark" rel="noopener noreferrer"&gt;https://github.com/zhitongblog/ziplark&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One closing thought about RAR. It is one of the most widely circulated archive formats on earth, and to this day no open-source tool can produce one, because the UnRAR licence explicitly forbids using that code to reconstruct the compression algorithm. A format that ubiquitous, and creating it still means buying one company's software.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>rust</category>
      <category>tools</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built a lightweight Markdown editor (~15 MB) with live preview, KaTeX, and Mermaid support</title>
      <dc:creator>zhitong</dc:creator>
      <pubDate>Sun, 12 Apr 2026 07:34:54 +0000</pubDate>
      <link>https://dev.to/zhitongblog/i-built-a-lightweight-markdown-editor-15-mb-with-live-preview-katex-and-mermaid-support-5d51</link>
      <guid>https://dev.to/zhitongblog/i-built-a-lightweight-markdown-editor-15-mb-with-live-preview-katex-and-mermaid-support-5d51</guid>
      <description>&lt;p&gt;Hey r/markdown! I've been working on SoloMD, a cross-platform Markdown editor focused on simplicity.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Live preview (markers hide when cursor leaves the line)&lt;/li&gt;
&lt;li&gt;KaTeX math rendering ($E=mc^2$)&lt;/li&gt;
&lt;li&gt;Mermaid diagrams&lt;/li&gt;
&lt;li&gt;Focus mode &amp;amp; typewriter mode&lt;/li&gt;
&lt;li&gt;Export to HTML/PDF/DOCX&lt;/li&gt;
&lt;li&gt;Multi-encoding support (UTF-8, GBK, Big5, Shift_JIS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why I built it:&lt;/strong&gt;&lt;br&gt;
I wanted something lighter than Obsidian (~250 MB) and Typora (~80 MB), that works offline and doesn't require a subscription. SoloMD is about 15 MB installed.&lt;/p&gt;

&lt;p&gt;It's free, open source (MIT), and available for macOS, Windows, and Linux.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://solomd.app" rel="noopener noreferrer"&gt;https://solomd.app&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/zhitongblog/solomd" rel="noopener noreferrer"&gt;https://github.com/zhitongblog/solomd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear what features you'd want in a Markdown editor!&lt;br&gt;
r/opensource&lt;br&gt;
Title&lt;br&gt;
SoloMD: A lightweight, open-source Markdown editor built with Tauri 2 + Rust (MIT license)&lt;br&gt;
Body&lt;br&gt;
I just released SoloMD, a cross-platform Markdown editor I've been building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tauri 2 (Rust backend, system webview)&lt;/li&gt;
&lt;li&gt;Vue 3 + TypeScript&lt;/li&gt;
&lt;li&gt;CodeMirror 6&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why open source matters here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No telemetry, no accounts, no cloud dependency&lt;/li&gt;
&lt;li&gt;MIT licensed – use it however you want&lt;/li&gt;
&lt;li&gt;Fully offline, your files never leave your machine&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;~15 MB installed (no bundled Chromium)&lt;/li&gt;
&lt;li&gt;Live Markdown preview&lt;/li&gt;
&lt;li&gt;KaTeX math, Mermaid diagrams&lt;/li&gt;
&lt;li&gt;Multi-encoding (GBK/Big5/Shift_JIS auto-detection)&lt;/li&gt;
&lt;li&gt;Export to HTML/PDF/DOCX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/zhitongblog/solomd" rel="noopener noreferrer"&gt;https://github.com/zhitongblog/solomd&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://solomd.app" rel="noopener noreferrer"&gt;https://solomd.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contributions welcome! Looking for feedback on the editor experience.&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%2Fvj2fyf9j4ic4n22nmyds.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%2Fvj2fyf9j4ic4n22nmyds.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>markdown</category>
      <category>md</category>
      <category>notebook</category>
    </item>
  </channel>
</rss>
