<?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: perber</title>
    <description>The latest articles on DEV Community by perber (@perber).</description>
    <link>https://dev.to/perber</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%2F1040630%2F828fec19-6ad6-479e-ba0f-abfd5efe509d.jpeg</url>
      <title>DEV Community: perber</title>
      <link>https://dev.to/perber</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/perber"/>
    <language>en</language>
    <item>
      <title>Fourteen months of LeafWiki, in small moments</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/perber/fourteen-months-of-leafwiki-in-small-moments-332f</link>
      <guid>https://dev.to/perber/fourteen-months-of-leafwiki-in-small-moments-332f</guid>
      <description>&lt;p&gt;LeafWiki has 802 stars on GitHub right now. By the time you read this, that number is already wrong.&lt;/p&gt;

&lt;p&gt;Fourteen months since the first release. Not a round number, but that's the actual gap, so I'm using it. If you pull up the star history, it looks like a hockey stick — flat for most of a year, then a near-vertical line at the end. That's not how it felt while it was happening. It felt like a handful of separate moments, months apart, that only add up to a curve if you squint at it after the fact. Here's what actually happened, in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quiet release nobody noticed
&lt;/h2&gt;

&lt;p&gt;v0.1.0 went live on April 30, 2025. No launch post, no announcement. The commit that shipped it still says "LeafWiki is alive" — I kept the old releases folder around just because that line is in there.&lt;/p&gt;

&lt;p&gt;I built it for myself. A friend and I had complained about Wiki.js over a beer — &lt;a href="https://leafwiki.com/blog/a-beer-a-go-binary-and-a-wiki/" rel="noopener noreferrer"&gt;I wrote about that part separately&lt;/a&gt;. This is about what came after the beer.&lt;/p&gt;

&lt;p&gt;Nothing happened for a while. That was fine. I hadn't built it for anyone else yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issue that came after a long summer
&lt;/h2&gt;

&lt;p&gt;Months went by. Then, after a quiet summer with barely any activity, someone filed an issue.&lt;/p&gt;

&lt;p&gt;That's it. That's the whole milestone. One issue, from someone I didn't know, on a project I'd half-forgotten to keep pushing on.&lt;/p&gt;

&lt;p&gt;It's a strange thing to admit, but that single issue is what got me building faster again. Not a star count, not a mention anywhere — one person taking the project seriously enough to report a bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Someone who said he'd help, then went quiet
&lt;/h2&gt;

&lt;p&gt;The project was sitting at around 50 stars — nothing much — when I labeled a few issues "good first issue," hoping someone would pick one up. Someone did. He commented that he'd take it on.&lt;/p&gt;

&lt;p&gt;Then nothing. No pull request, no update, no message saying he'd changed his mind. He just never came back.&lt;/p&gt;

&lt;p&gt;No hard feelings — that's just how a lot of open source goes. People show up for exactly as long as they meant to, and they don't owe you an explanation for leaving. I don't think about it as a loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pull request I almost missed
&lt;/h2&gt;

&lt;p&gt;Later, someone else opened a PR without asking first — no issue, no discussion, just a change. Then he closed it himself, before I'd even seen it.&lt;/p&gt;

&lt;p&gt;I found it later, reopened it, and pinged him to say the idea behind it was good. If I hadn't noticed, he'd probably have been gone for good.&lt;/p&gt;

&lt;p&gt;That person has stuck around and supported the project ever since. I'm keeping the details vague here by their preference, but it's one of the clearest examples I have of something I didn't expect going into this: the people who end up caring most aren't always the ones who show up loudest first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sergio, and the first person who kept paying
&lt;/h2&gt;

&lt;p&gt;The first recurring sponsor showed up a while after that — Sergio, who'd been filing issues and testing versions for months already. &lt;a href="https://leafwiki.com/blog/a-beer-a-go-binary-and-a-wiki/" rel="noopener noreferrer"&gt;That story is its own post&lt;/a&gt;, so I won't retell it here. Short version: he started paying every month without saying a word first, and I still think about that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posting it, for the first time
&lt;/h2&gt;

&lt;p&gt;I don't spend much time on social media. Writing the code never scared me. Posting it anywhere outside GitHub did.&lt;/p&gt;

&lt;p&gt;I put up a Hacker News submission for the "ops team" post — just a link to the blog, nothing more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=48228944" rel="noopener noreferrer"&gt;Self-hosted wikis shouldn't need an ops team&lt;/a&gt; — 10 points, 2 comments. Not a viral moment by HN standards.&lt;/p&gt;

&lt;p&gt;A few days after that post, someone I'd never interacted with before sponsored the project — a single, one-time payment, not a recurring one. Not Sergio, someone else entirely. The first time anyone had paid anything for LeafWiki without it turning into an ongoing thing.&lt;/p&gt;

&lt;p&gt;Then, a few days after that, came the post that actually moved the star count.&lt;/p&gt;

&lt;h2&gt;
  
  
  The post that actually moved the number
&lt;/h2&gt;

&lt;p&gt;I'd already written a few dev.to posts and picked up a small, steady trickle of users from those. Posting about the v0.10.0 release on r/selfhosted felt exactly as uncomfortable as the Hacker News post had — same nerves, different platform.&lt;/p&gt;

&lt;p&gt;72 stars in one day. Then 64 the day after. That's still the single largest jump in the entire history of the project — bigger than every press mention combined. One honest post about a release did more than months of quiet building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two mentions I didn't ask for
&lt;/h2&gt;

&lt;p&gt;Self-Hosted Weekly mentioned LeafWiki once as a regular app listing, then featured it in their spotlight section a week later. Go Weekly picked it up not long after — that one landed differently. No single-day spike; the stars came in steadily over the following day instead, closer to how people actually read a newsletter than how they scroll a feed.&lt;/p&gt;

&lt;p&gt;I didn't pitch either one. Someone just noticed and wrote about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where that leaves things
&lt;/h2&gt;

&lt;p&gt;802 stars. A handful of sponsors. One person who filed an issue after a long silence and got me building again. One contributor who came and went. One who stayed. Still one person — me — writing the code, on evenings and weekends, next to actual client work.&lt;/p&gt;

&lt;p&gt;What's actually changed is the room around it. Most feature requests now come from people using LeafWiki for things I never anticipated. Some just tell me what's missing. A few build it themselves and open a PR instead of a wishlist. Discussions that used to sit unanswered for weeks now get real back-and-forth, sometimes before I've even seen them myself.&lt;/p&gt;

&lt;p&gt;If you're building something in public and it doesn't feel like it's compounding — it probably isn't, not smoothly. Mine didn't. It moved in steps, and most of the steps were just one person doing one small thing at exactly the right moment. You only see the line if you draw it backward.&lt;/p&gt;

&lt;p&gt;LeafWiki is still free, still open source, still &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt; if you want to look at where all of this actually lives.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>go</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a boring wiki on purpose</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Tue, 30 Jun 2026 14:03:23 +0000</pubDate>
      <link>https://dev.to/perber/i-built-a-boring-wiki-on-purpose-53eo</link>
      <guid>https://dev.to/perber/i-built-a-boring-wiki-on-purpose-53eo</guid>
      <description>&lt;p&gt;Boring is a compliment.&lt;/p&gt;

&lt;p&gt;I started LeafWiki alone, about a year ago. Single Go binary, SQLite, Markdown on disk. No Redis, no Node.js, no Postgres.&lt;/p&gt;

&lt;p&gt;Most people building wiki tools today are trying to build the next Notion. Or Confluence. Or Obsidian. I understand the instinct — those tools are successful, and closing the feature gap feels like progress.&lt;/p&gt;

&lt;p&gt;I went the other way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three categories I decided not to compete in
&lt;/h2&gt;

&lt;p&gt;Everyone seems to be building a Confluence clone — team wikis with approval workflows, granular permissions, nested spaces, and enterprise SSO. For a team of five writing runbooks, that's a lot of surface area to operate.&lt;/p&gt;

&lt;p&gt;Everyone seems to be building a Notion clone — databases, Kanban boards, real-time collaboration, AI summaries. Notion is genuinely impressive. It's also become everything. People build workarounds inside it for things it was never designed to do. The tool becomes infrastructure. And then the tool needs its own ops team.&lt;/p&gt;

&lt;p&gt;Everyone seems to be building an Obsidian clone — local-first, graph view, personal knowledge management. I like Obsidian. It's a great tool. But it's a personal tool. The moment a second person needs to write something, the model breaks.&lt;/p&gt;

&lt;p&gt;LeafWiki is none of these. It's a team wiki. That's a smaller, more boring problem. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision that shaped everything
&lt;/h2&gt;

&lt;p&gt;Markdown files on disk are the source of truth. Not the database.&lt;/p&gt;

&lt;p&gt;The database is a cache. On restart, the system reads everything back from the Markdown files. If the database is gone, the content isn't. Backup means &lt;code&gt;cp -r&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One exception: user accounts live in &lt;code&gt;users.db&lt;/code&gt; and need to be included in your backup. Content is in the files; credentials aren't.&lt;/p&gt;

&lt;p&gt;That sounds simple. It isn't.&lt;/p&gt;

&lt;p&gt;Revision history. Link refactoring when pages are renamed. Keeping in-memory state and files consistent across concurrent writes. In a Postgres-backed tool, these are straightforward. When the files are what matters, you do the work properly or you corrupt content.&lt;/p&gt;

&lt;p&gt;The easy path is Postgres. I didn't take it. I wanted content that survives without the application — readable in a text editor even if the server is gone.&lt;/p&gt;

&lt;p&gt;The other thing nobody talks about: atomic writes.&lt;/p&gt;

&lt;p&gt;When a user saves a page, two things need to happen: the Markdown file on disk has to be updated, and the in-memory SQLite cache has to reflect the change. You can't wrap both in a database transaction — one of them is a file.&lt;/p&gt;

&lt;p&gt;The approach: write to a temp file first, then &lt;code&gt;os.Rename()&lt;/code&gt;. On Linux, rename is atomic at the filesystem level — readers either see the old file or the new one, never a half-written state. The SQLite update follows after the rename.&lt;/p&gt;

&lt;p&gt;If the process crashes between the rename and the SQLite update, the cache and the files drift. That's intentional. On restart, the system reads from files and rebuilds the cache. Files win. That's the contract.&lt;/p&gt;

&lt;p&gt;This forces a discipline: nothing important can live only in SQLite. Any feature that stores data only in the cache loses that data on restart. The architecture makes you honest about what the source of truth actually is.&lt;/p&gt;

&lt;p&gt;Two more decisions that follow from this:&lt;/p&gt;

&lt;p&gt;Page metadata — IDs, revision references, internal assignments — lives in the frontmatter of each Markdown file. Not in the database. That way a full reconstruct on restart reads everything it needs directly from the files, with no dependency on cached state that might be stale or missing.&lt;/p&gt;

&lt;p&gt;Page ordering within a section is stored in a &lt;code&gt;.order.json&lt;/code&gt; sidecar file alongside the Markdown files. Filesystems don't guarantee consistent ordering across platforms, so you need somewhere to persist it. A tiny JSON file next to the content is the simplest answer that survives a restart, a migration, or a manual &lt;code&gt;cp -r&lt;/code&gt; to a new server.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I said no to
&lt;/h2&gt;

&lt;p&gt;Outline uses Redis for real-time collaboration. In practice, most small teams rarely need two people editing the same page simultaneously — they assumed they did because Notion has it.&lt;/p&gt;

&lt;p&gt;No Redis. No real-time collaboration. No AI features in the UI. No PDF export pipeline that requires Node.js. One binary, no external dependencies.&lt;/p&gt;

&lt;p&gt;Every one of these was a reasonable request. Each one would have pulled the project toward something heavier — something that needs its own maintenance schedule, something that eventually becomes the problem instead of the solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I cared about instead
&lt;/h2&gt;

&lt;p&gt;I like Obsidian's editor. I wanted that feeling — sitting down and writing without the interface getting in the way.&lt;/p&gt;

&lt;p&gt;Most wikis feel like websites. Click a link, the page reloads, the sidebar resets. Wiki.js had a specific problem I couldn't ignore: a 404 made the entire navigation tree disappear. A broken link shouldn't break the interface.&lt;/p&gt;

&lt;p&gt;LeafWiki is a SPA. Navigate between pages and nothing reloads. The Go binary delivers Markdown content fast. CSS and JavaScript load once. The frontend is compiled into the binary at build time via Go's &lt;code&gt;embed&lt;/code&gt; — no static file server, no asset directory to manage.&lt;/p&gt;

&lt;p&gt;The SQLite library is pure Go (&lt;code&gt;modernc.org/sqlite&lt;/code&gt;) — no C compiler needed. That's part of why the binary is genuinely self-contained. Download it, run it.&lt;/p&gt;

&lt;p&gt;Ctrl+Alt+P finds a page by title. Ctrl+V pastes an image. Creating a new page takes seconds.&lt;/p&gt;

&lt;p&gt;DokuWiki understood something twenty years ago: files are enough. No database required. The interface just didn't keep up. I wanted what DokuWiki understood, with an editor you actually want to write in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Whether it was the right call
&lt;/h2&gt;

&lt;p&gt;About a month ago I noticed the first sponsor on GitHub. Someone from the community — filing issues, testing versions, shaping features since early on. The custom favicon support came from him. Sections in the navigation tree came from him.&lt;/p&gt;

&lt;p&gt;He'd switched from Wiki.js. He's building a hardware documentation wiki — parts, assemblies, technical guides for a real project. His description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"here it's just 'create page in sidebar → upload assets per page → done'"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He quietly started paying — without being asked, without a pricing page.&lt;/p&gt;

&lt;p&gt;That felt like the right answer to the question.&lt;/p&gt;




&lt;p&gt;Pre-1.0, actively developed, free and open source: &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live demo at &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;demo.leafwiki.com&lt;/a&gt; — resets every hour.&lt;/p&gt;

&lt;p&gt;v1 is focused on making LeafWiki company-ready — two-factor authentication, email and user invitations, and Git sync are coming.&lt;/p&gt;

&lt;p&gt;If you like the direction: a &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;GitHub star&lt;/a&gt; helps others find it. And if you want to support development directly, &lt;a href="https://github.com/sponsors/perber" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt; is the most direct way.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>react</category>
    </item>
    <item>
      <title>LeafWiki Devlog #10: v0.9.0 – no more broken links, lost edits, or overwritten changes</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sat, 02 May 2026 18:23:45 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-devlog-9-v090-no-more-broken-links-lost-edits-or-overwritten-changes-1e35</link>
      <guid>https://dev.to/perber/leafwiki-devlog-9-v090-no-more-broken-links-lost-edits-or-overwritten-changes-1e35</guid>
      <description>&lt;p&gt;LeafWiki - A self-hosted wiki for long-lived documentation.&lt;br&gt;
Built for engineers, self-hosters, and small teams.&lt;/p&gt;

&lt;p&gt;LeafWiki v0.9.0 is out. This release focuses on four problems that come up in any shared wiki over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Someone changed something last week — what did it look like before?"
&lt;/h2&gt;

&lt;p&gt;The revision system stores Markdown snapshots for every page save. You can browse the history, read older versions, and restore any of them.&lt;/p&gt;

&lt;p&gt;Assets are deduplicated across revisions, so history does not balloon your storage.&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%2F20g1mbeua3hq9ex2x938.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%2F20g1mbeua3hq9ex2x938.png" alt="Revision history panel" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable it with &lt;code&gt;--enable-revision&lt;/code&gt;. The default history limit is 100 revisions per page, configurable with &lt;code&gt;--max-revision-history&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  "I moved a section and now half the links are broken"
&lt;/h2&gt;

&lt;p&gt;Link refactoring tracks internal links across the wiki. When you rename or move a page, LeafWiki shows you every page with an affected link and lets you decide whether to update them — before anything breaks.&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%2Fmyovrnzof9ob37k0bxh6.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%2Fmyovrnzof9ob37k0bxh6.png" alt="Link refactoring dialog" width="768" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable it with &lt;code&gt;--enable-link-refactor=true&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Two of us edited the same page and one overwrote the other"
&lt;/h2&gt;

&lt;p&gt;LeafWiki now uses optimistic locking. If your version of a page is out of date when you try to save, you get notified before anything is written. You can review what changed and decide whether to overwrite or merge manually.&lt;/p&gt;

&lt;p&gt;No more last-write-wins.&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%2F3l1xbbliof8x5u0ioqzo.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%2F3l1xbbliof8x5u0ioqzo.png" alt="overwrite warning" width="571" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "I shared this link and now it's dead because we restructured"
&lt;/h2&gt;

&lt;p&gt;Pages now have permalinks — short, stable URLs that resolve to the correct page even after it has been moved or renamed. Safe to share in Slack, emails, or external docs.&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%2Fdwcpyb8xudns618mif1h.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%2Fdwcpyb8xudns618mif1h.png" alt="perma links dialog" width="674" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Shoutout boxes
&lt;/h2&gt;

&lt;p&gt;Callout blocks have been extended. Predefined types (&lt;code&gt;:::info&lt;/code&gt;, &lt;code&gt;:::warning&lt;/code&gt;, &lt;code&gt;:::error&lt;/code&gt;) and color-based variants (&lt;code&gt;:::blue&lt;/code&gt;, &lt;code&gt;:::red&lt;/code&gt;, &lt;code&gt;:::green&lt;/code&gt;) are available, as well as custom shoutouts without titles for more flexible styling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importer improvements
&lt;/h2&gt;

&lt;p&gt;The importer now resolves WikiLinks and Markdown links between pages, connects relationships, and handles asset uploads more reliably.&lt;/p&gt;




&lt;p&gt;Thanks to everyone who provided feedback and tested early versions!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;Try the demo&lt;/a&gt;, &lt;a href="https://leafwiki.com" rel="noopener noreferrer"&gt;Visit the Project Website&lt;/a&gt; or grab the &lt;a href="https://github.com/perber/leafwiki/releases" rel="noopener noreferrer"&gt;latest release on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>documentation</category>
      <category>opensource</category>
      <category>go</category>
    </item>
    <item>
      <title>LeafWiki Devlog #9: v0.8.2 – Tree Improvements &amp; Reverse Proxy Support</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sun, 08 Mar 2026 18:27:16 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-devlog-9-v082-tree-improvements-reverse-proxy-support-3o7h</link>
      <guid>https://dev.to/perber/leafwiki-devlog-9-v082-tree-improvements-reverse-proxy-support-3o7h</guid>
      <description>&lt;p&gt;Hi!&lt;/p&gt;

&lt;p&gt;Time for another small update on LeafWiki.&lt;/p&gt;

&lt;p&gt;Version &lt;strong&gt;v0.8.2&lt;/strong&gt; focuses on usability improvements in the Tree View and a small but very useful deployment feature for self-hosted setups.&lt;/p&gt;

&lt;p&gt;If you're new here:&lt;/p&gt;

&lt;p&gt;LeafWiki is a lightweight, self-hosted Markdown wiki built as a &lt;strong&gt;single Go binary&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown files stored directly on disk
&lt;/li&gt;
&lt;li&gt;No external database service required
&lt;/li&gt;
&lt;li&gt;Designed for people who &lt;strong&gt;think in folders, not feeds&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If LeafWiki disappears tomorrow, your content is still yours.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  A quick recap: the 0.8 series
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;v0.8.0&lt;/strong&gt;, LeafWiki introduced one of the biggest structural changes so far: &lt;strong&gt;Sections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sections allow the wiki tree to behave more like a real folder structure.&lt;/p&gt;

&lt;p&gt;Instead of every node being a page, a node can now simply act as a &lt;strong&gt;container for other pages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This enables things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cleaner hierarchical structures&lt;/li&gt;
&lt;li&gt;better organization for larger documentation sets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;v0.8 also introduced &lt;strong&gt;import and recovery tools&lt;/strong&gt;, making it much easier to bring existing documentation into LeafWiki or rebuild the wiki structure from files on disk.&lt;/p&gt;

&lt;p&gt;With that structural foundation in place, the following releases in the &lt;strong&gt;0.8.x series focus on refinement&lt;/strong&gt; — improving usability, performance, and deployment flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reverse Proxy Support (&lt;code&gt;--base-path&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;One improvement in &lt;strong&gt;v0.8.2&lt;/strong&gt; makes LeafWiki easier to run behind reverse proxies.&lt;/p&gt;

&lt;p&gt;LeafWiki now supports a &lt;code&gt;--base-path&lt;/code&gt; flag, which allows the application to be served from a &lt;strong&gt;subpath instead of the domain root&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This enables setups like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/wiki
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of requiring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://wiki.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;p&gt;Many self-hosted environments run multiple services behind a single domain using tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Traefik&lt;/li&gt;
&lt;li&gt;Caddy&lt;/li&gt;
&lt;li&gt;corporate reverse proxies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supporting a base path makes LeafWiki much easier to integrate into these environments without requiring a dedicated subdomain.&lt;/p&gt;

&lt;p&gt;For self-hosters, this makes deployments a lot more flexible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tree View usability improvements
&lt;/h2&gt;

&lt;p&gt;As wikis grow, navigation becomes increasingly important.&lt;/p&gt;

&lt;p&gt;v0.8.2 adds &lt;strong&gt;Expand All&lt;/strong&gt; and &lt;strong&gt;Collapse All&lt;/strong&gt; actions to the Tree View.&lt;/p&gt;

&lt;p&gt;This makes it much easier to quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explore the full structure of a wiki&lt;/li&gt;
&lt;li&gt;collapse everything to focus on a specific section&lt;/li&gt;
&lt;li&gt;navigate large documentation trees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a small feature, but it becomes very useful once a wiki contains many nested pages and sections.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;With the structural work introduced in &lt;strong&gt;v0.8.0&lt;/strong&gt;, the current focus is on polishing the experience around the new tree model.&lt;/p&gt;

&lt;p&gt;The goal is to keep LeafWiki simple, fast, and predictable — while gradually improving the everyday experience of using it.&lt;/p&gt;




&lt;p&gt;Thanks to everyone who reports issues, suggests improvements, or contributes to the project.&lt;/p&gt;

&lt;p&gt;Your feedback continues to shape the direction of LeafWiki 🌿&lt;/p&gt;

&lt;p&gt;If you'd like to try it out or follow development:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>markdown</category>
      <category>documentation</category>
    </item>
    <item>
      <title>LeafWiki Devlog #8: v0.7.3 - Secure by Default: Authentication, Roles &amp; Safer Self-Hosting</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sun, 01 Feb 2026 12:59:52 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-devlog-8-v073-secure-by-default-authentication-roles-safer-self-hosting-154e</link>
      <guid>https://dev.to/perber/leafwiki-devlog-8-v073-secure-by-default-authentication-roles-safer-self-hosting-154e</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;This release marks an important step for LeafWiki.&lt;/p&gt;

&lt;p&gt;With recent versions, LeafWiki has moved beyond a purely personal wiki running on &lt;code&gt;localhost&lt;/code&gt;.&lt;br&gt;
People are now running it on servers, exposing it to internal networks — and sometimes to the public internet.&lt;/p&gt;

&lt;p&gt;That shift comes with new responsibilities.&lt;/p&gt;

&lt;p&gt;So v0.7.x focuses on something less flashy than backlinks or editors — but far more important in the long run:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security, authentication, and safer defaults for self-hosted setups.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A quick reminder: what LeafWiki is
&lt;/h2&gt;

&lt;p&gt;If you're new here:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;LeafWiki is a lightweight, self-hosted Markdown wiki built as a single Go binary.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown files on disk
&lt;/li&gt;
&lt;li&gt;No external database service
&lt;/li&gt;
&lt;li&gt;Designed for people who think in folders, not feeds
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If LeafWiki disappears tomorrow, your content is still yours.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Why security became a priority now
&lt;/h2&gt;

&lt;p&gt;Security was always considered in LeafWiki — but v0.7.x is where it becomes &lt;strong&gt;intentional and explicit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two things triggered this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LeafWiki started to be used for &lt;strong&gt;real internal documentation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Instances were being &lt;strong&gt;exposed beyond localhost&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, authentication and access control stop being &lt;em&gt;nice to have&lt;/em&gt; and start being &lt;strong&gt;table stakes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But there was one constraint I didn’t want to break:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adding security must not turn LeafWiki into an operational project.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No extra services.&lt;br&gt;&lt;br&gt;
No complex setup.&lt;br&gt;&lt;br&gt;
No surprise defaults.&lt;/p&gt;




&lt;h2&gt;
  
  
  Secure by default, flexible by design
&lt;/h2&gt;

&lt;p&gt;The guiding principle for this release was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Secure by default — but explicit when you want to opt out.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That principle led to a few foundational changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authentication &amp;amp; session handling
&lt;/h2&gt;

&lt;p&gt;LeafWiki now uses &lt;strong&gt;session-based authentication backed by a local database&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this enables
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Secure, HttpOnly cookies enabled by default
&lt;/li&gt;
&lt;li&gt;CSRF protection on all state-changing requests
&lt;/li&gt;
&lt;li&gt;Rate limiting on authentication-related endpoints
&lt;/li&gt;
&lt;li&gt;Configurable access and refresh token timeouts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are boring features — and that’s a good thing.&lt;br&gt;&lt;br&gt;
They are meant to quietly do their job without being noticed.&lt;/p&gt;

&lt;p&gt;All of this works without introducing external dependencies or services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Roles &amp;amp; access control
&lt;/h2&gt;

&lt;p&gt;LeafWiki now supports &lt;strong&gt;explicit roles&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewer&lt;/strong&gt; (read-only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes a big difference for common setups like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public documentation with authenticated editing
&lt;/li&gt;
&lt;li&gt;Internal runbooks where most users only read
&lt;/li&gt;
&lt;li&gt;Small teams with a single maintainer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If authentication is disabled, editing without login is still possible — but it is now an &lt;strong&gt;explicit choice&lt;/strong&gt;, not an implicit side effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Escape hatches (and why they exist)
&lt;/h2&gt;

&lt;p&gt;Two new flags were added in v0.7.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--allow-insecure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--disable-auth&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;strong&gt;not shortcuts&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
They are deliberate escape hatches.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;--allow-insecure&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Required for HTTP-only setups where Secure/HttpOnly cookies would otherwise break local development.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;--disable-auth&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Completely disables authentication and authorization.&lt;/p&gt;

&lt;p&gt;This flag is intended &lt;strong&gt;only&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local development
&lt;/li&gt;
&lt;li&gt;Trusted internal networks
&lt;/li&gt;
&lt;li&gt;VPN- or firewall-protected environments
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using it on a public instance is unsafe — and the documentation is intentionally explicit about that.&lt;/p&gt;

&lt;p&gt;Security should be strong by default, but never magical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Branding &amp;amp; UX improvements
&lt;/h2&gt;

&lt;p&gt;While security was the main theme, a few smaller — but very practical — improvements landed as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branding settings
&lt;/h3&gt;

&lt;p&gt;LeafWiki now supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom site name
&lt;/li&gt;
&lt;li&gt;Logo
&lt;/li&gt;
&lt;li&gt;Favicon
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds small, but it matters a lot for internal tools.&lt;br&gt;
Branding helps with adoption and trust — especially when LeafWiki becomes part of daily workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Under the hood: safer foundations
&lt;/h2&gt;

&lt;p&gt;Some less visible changes shipped in the background as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomic writes for critical files
&lt;/li&gt;
&lt;li&gt;Schema versioning and migrations
&lt;/li&gt;
&lt;li&gt;Improved SQLite FTS5 tokenization (e.g. &lt;code&gt;C++&lt;/code&gt;, filenames)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are headline features — but together they make upgrades safer and behavior more predictable.&lt;/p&gt;




&lt;h2&gt;
  
  
  About 2FA / TOTP (and why it’s not in yet)
&lt;/h2&gt;

&lt;p&gt;A recent feature request asked about &lt;strong&gt;TOTP-based 2FA support&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Short answer:&lt;br&gt;&lt;br&gt;
Yes — it makes sense, especially for internet-exposed instances.&lt;/p&gt;

&lt;p&gt;Longer answer:&lt;br&gt;&lt;br&gt;
LeafWiki still lacks a few core building blocks, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content versioning
&lt;/li&gt;
&lt;li&gt;Import / export
&lt;/li&gt;
&lt;li&gt;Conflict handling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those come first.&lt;/p&gt;

&lt;p&gt;Security is not a checkbox you tick once — it is an ongoing process.&lt;br&gt;&lt;br&gt;
The goal of v0.7.x was to lay a solid foundation before stacking more features on top.&lt;/p&gt;

&lt;p&gt;The issue is open and tracked, and I’ll revisit it once the basics are in place.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks
&lt;/h2&gt;

&lt;p&gt;This release was shaped heavily by feedback and contributions from the community.&lt;/p&gt;

&lt;p&gt;Thanks to everyone who uses LeafWiki, reports issues, and shares ideas — your feedback directly influences the direction of the project.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>documentation</category>
      <category>go</category>
    </item>
    <item>
      <title>LeafWiki Devlog #7: v0.6.1 - Introducing Backlinks + Better Search (SQLite FTS5) 🌿</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sat, 17 Jan 2026 18:47:59 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-devlog-7-v061-introducing-backlinks-better-search-sqlite-fts5-1llo</link>
      <guid>https://dev.to/perber/leafwiki-devlog-7-v061-introducing-backlinks-better-search-sqlite-fts5-1llo</guid>
      <description>&lt;p&gt;Hi! &lt;/p&gt;

&lt;p&gt;It’s time for another update on &lt;strong&gt;LeafWiki&lt;/strong&gt; 🌿&lt;/p&gt;

&lt;p&gt;The new version &lt;strong&gt;v0.6.1&lt;/strong&gt; focuses on two things you use &lt;em&gt;constantly&lt;/em&gt; in a wiki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; — fuzzy search &amp;amp; improved ranking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backlinks / link UX&lt;/strong&gt; — introducing backlinks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re new here: LeafWiki is a lightweight, self-hosted Markdown wiki built as a &lt;strong&gt;single Go binary&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s for people who think in &lt;strong&gt;folders&lt;/strong&gt;, not feeds.&lt;/p&gt;

&lt;p&gt;LeafWiki stores everything locally — Markdown files on disk, plus a small tree file for structure and metadata.&lt;/p&gt;

&lt;p&gt;If LeafWiki disappears tomorrow, &lt;strong&gt;your content is still yours&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 GitHub: &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Backlinks
&lt;/h2&gt;

&lt;p&gt;Backlinks are one of those features that turn a wiki into a &lt;strong&gt;knowledge base&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They also enable something important: showing the &lt;strong&gt;impact of moves and renames&lt;/strong&gt; - because in a real wiki, pages don’t stay static forever.&lt;/p&gt;

&lt;p&gt;LeafWiki follows an explicit approach here (similar to working in an IDE):&lt;br&gt;
when you rename or move a page, you can decide whether links inside Markdown should be updated as well.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Automatic link updates are planned for a future release.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Backlinks answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Where is this page referenced?”&lt;/li&gt;
&lt;li&gt;“Which docs depend on this decision?”&lt;/li&gt;
&lt;li&gt;“What’s connected to this topic?”&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What’s included in v0.6.1 (Backlinks &amp;amp; Links)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Incoming &lt;strong&gt;backlinks&lt;/strong&gt; per page&lt;/li&gt;
&lt;li&gt;Outgoing link list&lt;/li&gt;
&lt;li&gt;Broken links are tracked (so you can see what needs fixing)
&lt;em&gt;(A dashboard / overview for broken links is planned for a future release.)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The link section was intentionally made &lt;strong&gt;less visually dominant&lt;/strong&gt;, so your page content stays the focus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My goal is to make link navigation feel useful without turning LeafWiki into a graph tool.  &lt;/p&gt;

&lt;p&gt;This is the first release where I’m properly introducing &lt;strong&gt;backlinks&lt;/strong&gt; — and I’d love feedback on how you use them.&lt;/p&gt;


&lt;h2&gt;
  
  
  Search improvements for a Markdown based wiki
&lt;/h2&gt;

&lt;p&gt;Search is a daily driver feature — if search feels unreliable, a wiki slowly turns into a graveyard.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;v0.6.1&lt;/strong&gt;, I focused on making search feel more reliable and practical during day-to-day use.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Under the hood: local SQLite FTS5 (no external services)
&lt;/h2&gt;

&lt;p&gt;LeafWiki is file-based, so search needs to be fast &lt;strong&gt;without requiring a separate DB server&lt;/strong&gt; or Elasticsearch.&lt;/p&gt;

&lt;p&gt;LeafWiki uses a local &lt;strong&gt;SQLite FTS5&lt;/strong&gt; index (&lt;code&gt;search.db&lt;/code&gt;) and keeps it up to date.&lt;/p&gt;

&lt;p&gt;A few implementation details for devs &amp;amp; self-hosters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parallel indexing&lt;/strong&gt;: Markdown files are indexed using a small worker pool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown-aware indexing&lt;/strong&gt;: headings are extracted and indexed separately so important sections rank well&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevance ranking&lt;/strong&gt;: results are ordered with &lt;strong&gt;BM25&lt;/strong&gt; weighting (title &amp;gt; headings &amp;gt; content)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better UX&lt;/strong&gt;: highlighted titles and snippets/excerpts generated directly by FTS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuzzy-by-default&lt;/strong&gt;: normal queries get &lt;code&gt;*&lt;/code&gt; wildcards automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Optional: tiny schema snippet)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;VIRTUAL&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;fts5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;headings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;tokenize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"unicode61 tokenchars '-_/+#.'"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;Backlinks can be a deep rabbit hole (graphs, tags, multi-references, etc.).&lt;br&gt;&lt;br&gt;
LeafWiki tries to keep it simple — but useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So I’d love to hear:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you use backlinks in your &lt;strong&gt;documentation&lt;/strong&gt; or more for &lt;strong&gt;knowledge management&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Should the link section be more prominent, or is the subtle approach better?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for following along 🌿&lt;/p&gt;

&lt;p&gt;Try it out: &lt;strong&gt;&lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;https://demo.leafwiki.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you like the project, check it out on GitHub: &lt;strong&gt;&lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>markdown</category>
      <category>documentation</category>
    </item>
    <item>
      <title>LeafWiki Devlog #6: v0.5.2 - is out - dark mode and Markdown improvements</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sun, 21 Dec 2025 14:48:36 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-v052-is-out-dark-mode-and-markdown-improvements-2l87</link>
      <guid>https://dev.to/perber/leafwiki-v052-is-out-dark-mode-and-markdown-improvements-2l87</guid>
      <description>&lt;p&gt;I'm happy to announce that &lt;strong&gt;Leafwiki v0.5.2&lt;/strong&gt; is out.&lt;br&gt;&lt;br&gt;
This release introduces dark mode support.&lt;/p&gt;

&lt;p&gt;With support for Mermaid diagrams, images, and HTML inside Markdown, Leafwiki can be used for project documentation, technical notes, and internal documentation for personal use and small dev teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Leafwiki
&lt;/h2&gt;

&lt;p&gt;Leafwiki is a lightweight, self-hosted wiki engine built for developers who want a simple and reliable way to manage documentation.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;markdown-powered wiki&lt;/strong&gt;: content is stored as plain Markdown, while Leafwiki itself takes care of structure, navigation, and rendering. The goal is to behave like a real wiki, just without unnecessary complexity.&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%2F90gf6bia85r2fn27vh49.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%2F90gf6bia85r2fn27vh49.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;At a high level, Leafwiki keeps things intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content is stored as Markdown files (no vendor lock-in).&lt;/li&gt;
&lt;li&gt;Page hierarchy and ordering are stored in &lt;code&gt;tree.json&lt;/code&gt; (loaded into memory). Leafwiki can reorder and move pages, and updates the on-disk layout accordingly.&lt;/li&gt;
&lt;li&gt;SQLite is used for search indexing and user management, so no external database is required.&lt;/li&gt;
&lt;li&gt;Leafwiki is implemented as a single-page application (SPA). This allows fast navigation between pages and a smoother editing experience, without full page reloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who Leafwiki is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Leafwiki already works well as a &lt;strong&gt;personal wiki&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;v0.6.0&lt;/strong&gt;, Leafwiki will get backlinks, which will improve navigation and content discovery.&lt;/li&gt;
&lt;li&gt;Team-related features, such as versioning, are planned for future releases, moving it closer to an internal documentation tool for small dev teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's new in v0.5.2&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark mode support&lt;/li&gt;
&lt;li&gt;HTML support in Markdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think the dark mode is already looking good.&lt;br&gt;
From a code perspective, I previously had many inline styles inside components. In this version, those styles were moved into &lt;code&gt;index.css&lt;/code&gt;, and configuration is overridden there.&lt;/p&gt;

&lt;p&gt;This makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adjust styles for dark mode&lt;/li&gt;
&lt;li&gt;introduce new colors&lt;/li&gt;
&lt;li&gt;override Tailwind tokens in a single place&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, this simplifies theming and makes the codebase easier to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project status
&lt;/h2&gt;

&lt;p&gt;Leafwiki has reached 32 GitHub stars, which I’m genuinely happy about.&lt;br&gt;
I’ve also received some early feedback from users, for example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I use it for personal use, I find it attractive because the LeafWiki is light and fast.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Demo and source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Demo: &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;https://demo.leafwiki.com&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading!&lt;br&gt;
Feedback and issues are always welcome&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>markdown</category>
      <category>documentation</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The 3 small Wiki UX frustrations that pushed me to build LeafWiki</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Mon, 24 Nov 2025 20:50:52 +0000</pubDate>
      <link>https://dev.to/perber/the-3-small-wiki-ux-frustrations-that-pushed-me-to-build-leafwiki-47hk</link>
      <guid>https://dev.to/perber/the-3-small-wiki-ux-frustrations-that-pushed-me-to-build-leafwiki-47hk</guid>
      <description>&lt;p&gt;This post is not meant as criticism of any existing tool.&lt;br&gt;&lt;br&gt;
LeafWiki itself is still in active development, and I’m sure I’ll eventually run into UX issues in my own project too — that’s normal.&lt;/p&gt;

&lt;p&gt;But I want to describe the &lt;em&gt;real workflow pains&lt;/em&gt; I experienced while using other wiki tools like Wiki.js, Confluence, and similar systems.&lt;br&gt;&lt;br&gt;
These small frictions kept interrupting my writing flow, and over time they motivated me to build &lt;strong&gt;LeafWiki&lt;/strong&gt; as a simpler alternative for developers and teams.&lt;/p&gt;

&lt;p&gt;I’m actively improving the UI and UX, and there are still things I want to polish — but the core philosophy stays the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple to run&lt;/strong&gt;: No container, no database, just Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple to host&lt;/strong&gt;: You know where your data is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple to trust&lt;/strong&gt;: Markdown is portable &amp;amp; future-proof&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose Go specifically to keep LeafWiki a single, fast binary with no external dependencies.&lt;br&gt;&lt;br&gt;
Your knowledge shouldn’t belong to a database you maintain — it should belong to &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. I wanted to paste screenshots directly into the editor (Ctrl+V)
&lt;/h2&gt;

&lt;p&gt;In the wikis I used before, adding a screenshot felt like a mini project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take screenshot
&lt;/li&gt;
&lt;li&gt;Open upload dialog
&lt;/li&gt;
&lt;li&gt;Choose the correct folder
&lt;/li&gt;
&lt;li&gt;Upload the file
&lt;/li&gt;
&lt;li&gt;Click the uploaded item to insert it into the page
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every time I tried to quickly document something, this tiny workflow broke my flow.&lt;/p&gt;

&lt;p&gt;What I really wanted was the natural workflow developers use everywhere else:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot → Ctrl+V → done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So in &lt;strong&gt;LeafWiki&lt;/strong&gt;, pasting images directly into the Markdown editor automatically uploads them and inserts the correct Markdown link — with no dialogs and no mental friction.&lt;/p&gt;

&lt;p&gt;Just write.&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%2Fldbgqwzgpg86bkuaxsuw.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%2Fldbgqwzgpg86bkuaxsuw.gif" alt="CTRL+V Demo" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. I kept having to choose folders just to upload the right file
&lt;/h2&gt;

&lt;p&gt;Another small thing that slowed me down:&lt;/p&gt;

&lt;p&gt;Before I could upload a file, I had to select a folder.&lt;/p&gt;

&lt;p&gt;Yes, technically that makes sense - but on the user level, it felt unnatural.&lt;br&gt;&lt;br&gt;
My brain doesn’t think in terms of asset location. I write documentation and the asset should be part of the page. I think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This file belongs to this page.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Let me browse to the correct folder for this file…&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So &lt;strong&gt;LeafWiki&lt;/strong&gt; stores assets &lt;em&gt;per page&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you upload an image while writing, it’s automatically attached to that page.&lt;br&gt;&lt;br&gt;
No folder selecting. No searching. No extra decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. I wanted to create pages directly in the tree where I’m thinking
&lt;/h2&gt;

&lt;p&gt;This one bothered me more than it should:&lt;/p&gt;

&lt;p&gt;I’d see exactly where a new page belongs in the structure - but to create it, I had to go somewhere else, usually a top-level menu.&lt;/p&gt;

&lt;p&gt;That disconnect always broke my flow.&lt;/p&gt;

&lt;p&gt;I also didn’t want to think about slugs during the creative flow.&lt;br&gt;&lt;br&gt;
Yes, I sometimes need to adjust slugs later, but that’s not the usual writing moment. (Of course changing slug is possible in LeafWiki.)&lt;/p&gt;

&lt;p&gt;So &lt;strong&gt;LeafWiki&lt;/strong&gt; lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create pages directly in the tree
&lt;/li&gt;
&lt;li&gt;create pages from non-existing links
&lt;/li&gt;
&lt;li&gt;create pages from the 404 view
&lt;/li&gt;
&lt;li&gt;insert structure &lt;em&gt;while thinking in structure&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The wiki should adapt to how you think, not the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these small things matter
&lt;/h2&gt;

&lt;p&gt;None of these issues are “big”.&lt;br&gt;&lt;br&gt;
They’re small, almost invisible UX friction points.&lt;/p&gt;

&lt;p&gt;But they add up.&lt;/p&gt;

&lt;p&gt;If you document things all day, these little interruptions make the tool feel heavy, slow, and mentally expensive.&lt;/p&gt;

&lt;p&gt;LeafWiki tries to remove these tiny friction points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste-to-upload&lt;/strong&gt; (no dialogs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-page assets&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structure where you think&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown editor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single Go binary&lt;/strong&gt; — easy to host, easy to trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that sounds interesting, you can try it here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;https://demo.leafwiki.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, ideas, and discussions are always welcome&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>ux</category>
    </item>
    <item>
      <title>Self-Hosting a lightweight Wiki on Raspberry PI with Cloudflare Tunnel</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sat, 08 Nov 2025 15:58:47 +0000</pubDate>
      <link>https://dev.to/perber/self-hosting-a-lightweight-wiki-on-raspberry-pi-with-cloudflare-tunnel-226p</link>
      <guid>https://dev.to/perber/self-hosting-a-lightweight-wiki-on-raspberry-pi-with-cloudflare-tunnel-226p</guid>
      <description>&lt;p&gt;I’m the developer behind LeafWiki, a lightweight, Markdown-based Wiki that doesn’t require a database.&lt;br&gt;
One of our users recently set it up on a Raspberry Pi, connected it to the Internet through Cloudflare Tunnel, and the setup was so clean that I decided to write a short guide about it.&lt;/p&gt;

&lt;p&gt;He also published the documentation in the project repository:&lt;br&gt;
&lt;a href="https://github.com/perber/leafwiki/edit/main/docs/install/raspberry.md" rel="noopener noreferrer"&gt;Install LeafWiki on Raspberry PI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re into &lt;strong&gt;self-hosted tools&lt;/strong&gt;, this might be interesting to you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Project Installation
&lt;/h2&gt;

&lt;p&gt;To begin, you need to install &lt;code&gt;LeafWiki&lt;/code&gt;. &lt;br&gt;
Here is the quick install command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://raw.githubusercontent.com/perber/leafwiki/main/install.sh &lt;span class="nt"&gt;-o&lt;/span&gt; install.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./install.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo&lt;/span&gt; ./install.sh &lt;span class="nt"&gt;--arch&lt;/span&gt; arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During installation, you’ll be asked for an &lt;strong&gt;admin password&lt;/strong&gt; and a &lt;strong&gt;JWT secret&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s it 🎉&lt;br&gt;
LeafWiki should now be running locally at:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="http://localhost:8080/" rel="noopener noreferrer"&gt;http://localhost:8080/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can open that in your browser to confirm the installation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exposing LeafWiki to the Internet with Cloudflare Tunnel
&lt;/h2&gt;

&lt;p&gt;At this point, LeafWiki is only accessible &lt;strong&gt;within your local network&lt;/strong&gt;.&lt;br&gt;
You could open ports on your router — but that’s risky and not ideal for security.  &lt;/p&gt;

&lt;p&gt;Instead, we’ll use &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;, a secure, zero-trust connection that lets you expose your local service to the Internet &lt;strong&gt;without opening any ports&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Cloudflare acts as a &lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt; sitting between the user and your server.&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%2Frqp5z5c6lozdvatbwsam.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%2Frqp5z5c6lozdvatbwsam.png" alt=" " width="683" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Traffic goes through &lt;strong&gt;Cloudflare&lt;/strong&gt;, which then routes it safely to your local machine.&lt;br&gt;
This way your &lt;strong&gt;IP stays hidden&lt;/strong&gt;, and your &lt;strong&gt;connection stays encrypted&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In our case, the Cloudflare &lt;strong&gt;tunnel&lt;/strong&gt; forwards traffic to LeafWiki running on your Pi — and exposes it as a &lt;strong&gt;subdomain&lt;/strong&gt; of your domain, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wiki.mysite.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F5rzlfxn1q12ekblcakqd.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%2F5rzlfxn1q12ekblcakqd.png" alt=" " width="617" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain Setup
&lt;/h2&gt;

&lt;p&gt;You’ll need a domain name.&lt;br&gt;
It can be managed through Cloudflare or any other registrar —&lt;br&gt;
if your DNS is elsewhere, you’ll just need to point it to Cloudflare.&lt;/p&gt;

&lt;p&gt;Sign up or log in to your &lt;a href="https://dash.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare dashboard&lt;/a&gt; before continuing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a tunnel
&lt;/h2&gt;

&lt;p&gt;Once your domain is ready:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Cloudflare dashboard.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Zero Trust&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Network&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Tunnels&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a tunnel&lt;/strong&gt; and choose &lt;strong&gt;Cloudflared&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give your tunnel a name.&lt;/li&gt;
&lt;/ol&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%2Ffmrxappyk8oet9lhnxrf.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%2Ffmrxappyk8oet9lhnxrf.png" alt=" " width="257" height="889"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll then reach the configuration page:&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%2Fri0t3zjcxhxpijrdphoa.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%2Fri0t3zjcxhxpijrdphoa.png" alt=" " width="251" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure the server (your Raspberry Pi)
&lt;/h2&gt;

&lt;p&gt;After creating the tunnel, Cloudflare shows setup instructions for your device.&lt;br&gt;
Connect to your Raspberry Pi via SSH and copy/paste the provided commands.  &lt;/p&gt;

&lt;p&gt;This will install &lt;strong&gt;Cloudflared&lt;/strong&gt;, authenticate it, and connect your Pi to your Cloudflare account.&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%2F8gygm971d0nbfcl2j0yc.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%2F8gygm971d0nbfcl2j0yc.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expose your LeafWiki instance
&lt;/h2&gt;

&lt;p&gt;Now that the tunnel is live, register your local app — in our case, LeafWiki&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocol: HTTP&lt;/li&gt;
&lt;li&gt;URL: localhost:8080&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save the configurtion&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%2Fr1i7fb59e42phonpene1.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%2Fr1i7fb59e42phonpene1.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare will now route external traffic (e.g. wiki.mydomain.com) directly to your LeafWiki instance — securely and without exposing your local IP. 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;You now have: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LeafWiki running on your Raspberry PI&lt;/li&gt;
&lt;li&gt;A secure Cloudflare Tunnle exposing it to the internet&lt;/li&gt;
&lt;li&gt;Your own self-hosted lightweight wiki - accessible anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try ityourself or checkout the project: &lt;br&gt;
👉 &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like the project and the idea,&lt;br&gt;
⭐ drop a star on GitHub&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>wiki</category>
    </item>
    <item>
      <title>LeafWiki Devlog #5: v0.4.9 - Mermaid Diagrams, Page Copy &amp; Easier Setup 🚀</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Fri, 07 Nov 2025 18:17:02 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-v049-mermaid-diagrams-page-copy-easier-setup-47ai</link>
      <guid>https://dev.to/perber/leafwiki-v049-mermaid-diagrams-page-copy-easier-setup-47ai</guid>
      <description>&lt;p&gt;Hey everyone 👋  &lt;/p&gt;

&lt;p&gt;After a few weeks of feedback and polishing, &lt;strong&gt;LeafWiki v0.4.9&lt;/strong&gt; is out!&lt;br&gt;&lt;br&gt;
This update focuses on making LeafWiki easier to start, smoother to use, and just a little more powerful.&lt;/p&gt;
&lt;h2&gt;
  
  
  🌿 What is LeafWiki?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LeafWiki&lt;/strong&gt; is a lightweight, tree-based wiki that keeps your content in plain Markdown — fast, clean, and self-hosted.&lt;br&gt;&lt;br&gt;
It’s a single Go binary with no database or dependencies, designed for teams and individuals who want a structured, file-backed knowledge base they can fully own.&lt;/p&gt;

&lt;p&gt;Run your knowledge base in 5 minutes.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt; &lt;em&gt;(resets hourly)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ✨ What’s New in v0.4.9
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🧭 Copy Pages (with Assets)
&lt;/h3&gt;

&lt;p&gt;You can now &lt;strong&gt;duplicate entire pages&lt;/strong&gt;, including all uploaded images and files.&lt;br&gt;&lt;br&gt;
Perfect for templates or similar documents.&lt;/p&gt;
&lt;h3&gt;
  
  
  🪄 Mermaid.js Diagram Support
&lt;/h3&gt;

&lt;p&gt;You can now embed &lt;strong&gt;Mermaid.js diagrams&lt;/strong&gt; directly inside Markdown pages using fenced code blocks:&lt;/p&gt;

&lt;pre&gt;

```mermaid
graph TD
  A[Start] --&amp;gt; B[Write Markdown]
  B --&amp;gt; C[Render Mermaid Diagram]
  C --&amp;gt; D[Enjoy!]
```


&lt;/pre&gt;

&lt;p&gt;LeafWiki automatically renders these diagrams in the page preview.&lt;/p&gt;
&lt;h3&gt;
  
  
  Improved Installer
&lt;/h3&gt;

&lt;p&gt;A installation script was added to make it even simpler to set up LeafWiki on Linux or Raspberry Pi.  &lt;/p&gt;

&lt;p&gt;Try it in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://raw.githubusercontent.com/perber/leafwiki/main/install.sh &lt;span class="nt"&gt;-o&lt;/span&gt; install.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./install.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo&lt;/span&gt; ./install.sh &lt;span class="nt"&gt;--arch&lt;/span&gt; amd64 &lt;span class="nt"&gt;--jwt-secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yoursecret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or checkout the documentation &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/perber/leafwiki/blob/main/docs/install/nginx.md" rel="noopener noreferrer"&gt;Run LeafWiki behind nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/perber/leafwiki/blob/main/docs/install/raspberry.md" rel="noopener noreferrer"&gt;Run Leafwiki on a raspberry pi with CloudFlare tunnels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌐 Live Demo Added
&lt;/h3&gt;

&lt;p&gt;You can now explore LeafWiki without installing anything.&lt;br&gt;&lt;br&gt;
The &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;public demo&lt;/a&gt; resets hourly — so feel free to experiment!&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 A Few Words of Thanks
&lt;/h2&gt;

&lt;p&gt;Big thanks to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@Hugo-Galley&lt;/strong&gt; for documentation and onboarding improvements
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@magnus-madsen&lt;/strong&gt; for feedback on hosting and UX
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@schewara&lt;/strong&gt; for the hint on Alpine Docker images
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Community feedback has been a big part of shaping this release 💚&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why LeafWiki Exists
&lt;/h2&gt;

&lt;p&gt;I wanted something between a static Markdown site and a full database wiki:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File-based and transparent
&lt;/li&gt;
&lt;li&gt;Still editable and searchable
&lt;/li&gt;
&lt;li&gt;Easy to host and maintain
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built LeafWiki — a small Go application that manages Markdown pages in a true tree structure, supports uploads, and provides a built-in editor with live preview.&lt;/p&gt;

&lt;p&gt;It’s not trying to be everything — just &lt;strong&gt;a fast, minimal wiki that values clarity over complexity.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Try It Yourself
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://demo.leafwiki.com" rel="noopener noreferrer"&gt;demo.leafwiki.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Your knowledge should live in files you own — not in a database you maintain.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>LeafWiki - Finding Clarity in Open Source</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Sun, 26 Oct 2025 17:48:21 +0000</pubDate>
      <link>https://dev.to/perber/leafwiki-finding-clarity-in-open-source-39pc</link>
      <guid>https://dev.to/perber/leafwiki-finding-clarity-in-open-source-39pc</guid>
      <description>&lt;p&gt;I’ve been working for a few months now on my vision of a developer-friendly Markdown wiki.&lt;br&gt;&lt;br&gt;
Maybe you’ve already seen one of my earlier posts about it.&lt;/p&gt;

&lt;p&gt;At the beginning of an open-source project, the energy is wild.&lt;br&gt;&lt;br&gt;
You have big ambitions: replace Wiki.js, replace Confluence, build a simpler, cleaner alternative.&lt;/p&gt;

&lt;p&gt;The idea for LeafWiki was straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to self-host
&lt;/li&gt;
&lt;li&gt;Markdown-based content
&lt;/li&gt;
&lt;li&gt;No database
&lt;/li&gt;
&lt;li&gt;A lightweight tool for internal knowledge sharing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just download the binary, run it, start writing.&lt;br&gt;&lt;br&gt;
That’s still the heart of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The early phase: feature, feature, feature
&lt;/h2&gt;

&lt;p&gt;During the first months I built one feature after another:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public pages sounded cool
&lt;/li&gt;
&lt;li&gt;Full Markdown file sync from disk sounded powerful
&lt;/li&gt;
&lt;li&gt;More features would make more people happy… right?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well. I can’t achieve everything and keep the focus on the goal:&lt;br&gt;&lt;br&gt;
A wiki for developers &lt;strong&gt;without ops pain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So for me it became clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public pages aren’t necessary for an internal wiki
&lt;/li&gt;
&lt;li&gt;The internal structure should still be determined by &lt;code&gt;tree.json&lt;/code&gt;, not the filesystem — which offers some benefits&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A break and a new direction
&lt;/h2&gt;

&lt;p&gt;In August, I took a small break.&lt;br&gt;
While I wasn’t coding, something great happened:&lt;/p&gt;

&lt;p&gt;⭐️ LeafWiki reached 16 GitHub stars&lt;br&gt;&lt;br&gt;
🐛 The first user-submitted issue arrived&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My first real user, besides myself.&lt;br&gt;&lt;br&gt;
That felt unexpectedly amazing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Their feature request was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When clicking an internal link, automatically create the page if it doesn’t exist.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Absolutely logical. Very helpful.&lt;br&gt;&lt;br&gt;
I implemented it — and it felt great.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That interaction helped me clarify LeafWiki’s purpose:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This is a wiki for developers and internal teams — not a public website generator.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The closer LeafWiki gets to real developer workflows, the better it becomes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What I decided to remove
&lt;/h2&gt;

&lt;p&gt;I decided to remove these features from the roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static public pages
&lt;/li&gt;
&lt;li&gt;Reading all content directly from Markdown files on disk&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's coming next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copy Page — duplicate pages and assets
&lt;/li&gt;
&lt;li&gt;Mermaid support
&lt;/li&gt;
&lt;li&gt;Auto page creation (already done)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think these are the right features to work on at the current state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do you want to help shape LeafWiki?
&lt;/h2&gt;

&lt;p&gt;LeafWiki is still a young project — which means your feedback will help shape a developer-friendly wiki.&lt;/p&gt;

&lt;p&gt;I’d love to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What’s missing?
&lt;/li&gt;
&lt;li&gt;What feels unnecessary?
&lt;/li&gt;
&lt;li&gt;What is the one feature you think a developer wiki should have?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment, open an issue — and maybe leave a ⭐️.&lt;br&gt;&lt;br&gt;
Every star motivates me more. 🙌&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;https://github.com/perber/leafwiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>devjournal</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🐶 Dogfooding LeafWiki – Why Using Your Own Tool Matters</title>
      <dc:creator>perber</dc:creator>
      <pubDate>Tue, 24 Jun 2025 21:20:19 +0000</pubDate>
      <link>https://dev.to/perber/-dogfooding-leafwiki-why-using-your-own-tool-matters-3ka</link>
      <guid>https://dev.to/perber/-dogfooding-leafwiki-why-using-your-own-tool-matters-3ka</guid>
      <description>&lt;p&gt;&lt;strong&gt;"Eat your own dog food."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In other words: Use your own product.&lt;/p&gt;

&lt;p&gt;That’s exactly what I did with &lt;strong&gt;LeafWiki&lt;/strong&gt; – the Markdown-based wiki I’m building. I started writing its own public documentation &lt;em&gt;using LeafWiki itself&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And as expected, a few things broke along the way. Which is great – because that's exactly the point of dogfooding.&lt;br&gt;&lt;br&gt;
You think your tool works – until you actually rely on it.&lt;br&gt;&lt;br&gt;
Real usage surfaces issues you'd never catch while just developing.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 What is LeafWiki?
&lt;/h2&gt;

&lt;p&gt;Quick version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Markdown-based wiki with a tree structure
&lt;/li&gt;
&lt;li&gt;Content lives as &lt;code&gt;.md&lt;/code&gt; files in folders
&lt;/li&gt;
&lt;li&gt;No database, no cloud, no lock-in
&lt;/li&gt;
&lt;li&gt;Just a single Go binary you can run anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is to give devs and small teams a &lt;strong&gt;simple, self-hosted alternative&lt;/strong&gt; to tools like &lt;strong&gt;Confluence or Wiki.js&lt;/strong&gt;, without all the setup overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Why I built it
&lt;/h2&gt;

&lt;p&gt;I’ve used a lot of wikis – and honestly, most of them felt like too much.&lt;br&gt;&lt;br&gt;
Complex setup, clunky UI, full DB stack – or just... slow.&lt;/p&gt;

&lt;p&gt;I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;looks clean
&lt;/li&gt;
&lt;li&gt;runs fast
&lt;/li&gt;
&lt;li&gt;stores everything in plain Markdown
&lt;/li&gt;
&lt;li&gt;doesn’t tie me to a platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not trying to replace Confluence or Wiki.js completely – but for &lt;strong&gt;small teams, dev environments, or side projects&lt;/strong&gt;, LeafWiki might be all you need.&lt;/p&gt;

&lt;p&gt;So I built it in Go, made it a single binary, and made sure it works on everything from servers to Raspberry Pis.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What LeafWiki can do (v0.4.3)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Public Pages
&lt;/li&gt;
&lt;li&gt;🔍 Full-Text Search (via SQLite)
&lt;/li&gt;
&lt;li&gt;📂 Tree Navigation
&lt;/li&gt;
&lt;li&gt;✍️ Markdown Editing with CodeMirror (Split View, auto-scroll)
&lt;/li&gt;
&lt;li&gt;🎨 Syntax Highlighting
&lt;/li&gt;
&lt;li&gt;📱 Mobile-Optimized UI
&lt;/li&gt;
&lt;li&gt;👥 Simple Role System (Admin / Editor)
&lt;/li&gt;
&lt;li&gt;📤 Asset Upload &amp;amp; File Management
&lt;/li&gt;
&lt;li&gt;🧱 No external db service&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 What I found while dogfooding
&lt;/h2&gt;

&lt;p&gt;While writing LeafWiki’s docs inside LeafWiki, I ran into a few rough spots – most of which are already fixed for the upcoming &lt;code&gt;v0.4.4&lt;/code&gt; (dropping June 29):&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Bugs I ran into:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slugs saved too early&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ If you typed fast and hit Enter, the slug wasn’t ready (&lt;code&gt;roadma&lt;/code&gt; instead of &lt;code&gt;roadmap&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Editor jumped to top after save&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ Classic React remount issue – annoying, but fixed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scroll position lost when navigating back&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ React router + scrollable divs = not friends by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edits lost after token refresh&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ Access token expired silently; the refreshed token didn’t apply to the save.&lt;br&gt;&lt;br&gt;
Losing edits like that was especially frustrating – and definitely something I needed to fix.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ What dogfooding really taught me
&lt;/h2&gt;

&lt;p&gt;Dogfooding is more than just testing – it forces you to experience the product like a real user.&lt;/p&gt;

&lt;p&gt;Things that seemed fine during development became frustrating during actual writing.&lt;br&gt;&lt;br&gt;
Suddenly, a scroll jump broke focus.&lt;br&gt;&lt;br&gt;
Suddenly, saving wasn’t just a button – it had consequences.&lt;/p&gt;

&lt;p&gt;Dogfooding gave me honest, immediate feedback.&lt;br&gt;&lt;br&gt;
It highlighted weak spots and helped me prioritize what really matters.&lt;/p&gt;

&lt;p&gt;If you’re building a dev tool and haven’t used it for actual work yet: &lt;strong&gt;Do it.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It’s uncomfortable, but it makes everything better.&lt;/p&gt;




&lt;h2&gt;
  
  
  📣 What’s next?
&lt;/h2&gt;

&lt;p&gt;I’m putting the finishing touches on the &lt;strong&gt;public docs&lt;/strong&gt;, which will go live soon.&lt;/p&gt;

&lt;p&gt;In the meantime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;a href="https://github.com/perber/leafwiki" rel="noopener noreferrer"&gt;github.com/perber/leafwiki&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Try it out. It’s free, open source, and zero-setup.
&lt;/li&gt;
&lt;li&gt;Bug reports, feedback, or just saying hi – all welcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Heads up:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LeafWiki is still very much in active development.&lt;br&gt;&lt;br&gt;
It works, and I use it daily – but if you're planning to use it in &amp;gt; production, be aware that things may still shift a bit over the &amp;gt; next few releases.&lt;br&gt;&lt;br&gt;
That said, early feedback is incredibly helpful right now.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Let me know what you think – or better yet:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Try writing your own docs with it. That’s how it gets better.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
