<?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: Emad Elsaid</title>
    <description>The latest articles on DEV Community by Emad Elsaid (@emad__elsaid).</description>
    <link>https://dev.to/emad__elsaid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F93051%2F55640e3c-b3a9-44ea-89ff-af7d922370f8.jpg</url>
      <title>DEV Community: Emad Elsaid</title>
      <link>https://dev.to/emad__elsaid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emad__elsaid"/>
    <language>en</language>
    <item>
      <title>Introducing XLog: A Static Site Generator Built for Knowledge Bases</title>
      <dc:creator>Emad Elsaid</dc:creator>
      <pubDate>Thu, 07 May 2026 13:18:10 +0000</pubDate>
      <link>https://dev.to/emad__elsaid/introducing-xlog-a-static-site-generator-built-for-knowledge-bases-3pb5</link>
      <guid>https://dev.to/emad__elsaid/introducing-xlog-a-static-site-generator-built-for-knowledge-bases-3pb5</guid>
      <description>&lt;p&gt;After years of trying different tools for my personal wiki, I built XLog - a static site generator specifically designed for knowledge bases, digital gardens, and personal wikis. Here's why it exists and what makes it different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most static site generators (Hugo, Jekyll, 11ty) are built for blogs and marketing sites. They're great at what they do, but they're not optimized for interconnected knowledge bases.&lt;/p&gt;

&lt;p&gt;Cloud tools (Notion, Obsidian Publish) solve the knowledge base problem but lock you into their platforms. Your notes become dependent on their infrastructure, their pricing, their features.&lt;/p&gt;

&lt;p&gt;I wanted something that combined the best of both worlds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt; like static generators (your data, your files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge-base features&lt;/strong&gt; like cloud tools (backlinks, search, organization)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is XLog?
&lt;/h2&gt;

&lt;p&gt;XLog is a fast, Git-native framework for building knowledge bases. It's written in Go and designed specifically for interconnected note-taking, not general websites.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatic Backlinks&lt;/strong&gt; - Mention a page name (&lt;code&gt;Page Name&lt;/code&gt;) and XLog creates bidirectional links automatically. No manual link management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desktop Editor Workflow&lt;/strong&gt; - Use Vim, VS Code, Emacs, or any text editor. Edit markdown locally with live preview in your browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git-Native&lt;/strong&gt; - Everything is markdown files in folders. Full version control, sync with Git, no database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;37 Built-In Extensions&lt;/strong&gt; - Hashtags, search, todos, photos, and more. Knowledge-base features out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Preview&lt;/strong&gt; - Save in your editor, instantly see changes in browser. No build step during writing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install (30 seconds)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/emad-elsaid/xlog/cmd/xlog@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create Your First Note
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-wiki
&lt;span class="nb"&gt;cd &lt;/span&gt;my-wiki
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"# Welcome to My Wiki"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.md
xlog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Open Browser
&lt;/h3&gt;

&lt;p&gt;Visit &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; and see your note rendered.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Edit
&lt;/h3&gt;

&lt;p&gt;Click "Edit" - opens the markdown file in your configured text editor. Make changes, save, and the browser updates instantly.&lt;/p&gt;

&lt;p&gt;That's it. No complex configuration, no theme setup, no build process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Desktop Editors?
&lt;/h2&gt;

&lt;p&gt;XLog intentionally doesn't include a browser-based editor. Instead, you edit in Vim, VS Code, Emacs, or whatever you prefer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Editor freedom&lt;/strong&gt; - Use the tools you already know&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful editing&lt;/strong&gt; - Vim macros, VS Code extensions, Emacs org-mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline-first&lt;/strong&gt; - Edit without internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git integration&lt;/strong&gt; - Built into your editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The "Edit" button in XLog opens your desktop editor. You're editing local markdown files, just with a live preview in your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic Backlinks in Action
&lt;/h2&gt;

&lt;p&gt;This is XLog's killer feature. Write naturally and connections emerge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Machine Learning Notes&lt;/span&gt;

I'm learning about Neural Networks and Decision Trees.

Both relate to Supervised Learning.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;XLog automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates clickable links to those pages if exists (Neural Networks, Decision Trees)&lt;/li&gt;
&lt;li&gt;Shows on "Neural Networks" that this page links to it&lt;/li&gt;
&lt;li&gt;Builds a knowledge graph of relationships&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No manual link creation. No broken links when you rename files. Just write and connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Digital Gardens, Not Blogs
&lt;/h2&gt;

&lt;p&gt;XLog is optimized for digital gardens - interconnected, evolving notes rather than chronological blog posts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal wikis&lt;/li&gt;
&lt;li&gt;Research notes with bidirectional links&lt;/li&gt;
&lt;li&gt;Digital gardens (learning in public)&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;li&gt;Zettelkasten-style note-taking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not good for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing websites&lt;/li&gt;
&lt;li&gt;E-commerce&lt;/li&gt;
&lt;li&gt;Multi-author publications&lt;/li&gt;
&lt;li&gt;Complex themes and layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building an interconnected knowledge base, XLog is perfect. If you need a general website, use Hugo or Jekyll.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;XLog&lt;/th&gt;
&lt;th&gt;Hugo/Jekyll&lt;/th&gt;
&lt;th&gt;Obsidian&lt;/th&gt;
&lt;th&gt;Notion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Editing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desktop editor&lt;/td&gt;
&lt;td&gt;Desktop editor&lt;/td&gt;
&lt;td&gt;Desktop app&lt;/td&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backlinks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local markdown&lt;/td&gt;
&lt;td&gt;Local markdown&lt;/td&gt;
&lt;td&gt;Local markdown&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static HTML&lt;/td&gt;
&lt;td&gt;Static HTML&lt;/td&gt;
&lt;td&gt;Paid publish&lt;/td&gt;
&lt;td&gt;Cloud only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast (Go)&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Depends on network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, open-source&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free (publish paid)&lt;/td&gt;
&lt;td&gt;Freemium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;XLog sits between pure static generators (Hugo) and cloud tools (Notion), offering knowledge-base features with full data ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who It's For
&lt;/h2&gt;

&lt;p&gt;XLog is for developers and technical users who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Prefer markdown over proprietary formats&lt;/li&gt;
&lt;li&gt;✅ Want Git version control for notes&lt;/li&gt;
&lt;li&gt;✅ Need automatic backlinks and hashtags&lt;/li&gt;
&lt;li&gt;✅ Like using their own text editor&lt;/li&gt;
&lt;li&gt;✅ Value local-first, no vendor lock-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;XLog is &lt;strong&gt;not&lt;/strong&gt; for users who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Need real-time browser collaboration&lt;/li&gt;
&lt;li&gt;❌ Want WYSIWYG editing&lt;/li&gt;
&lt;li&gt;❌ Require complex themes and CMS features&lt;/li&gt;
&lt;li&gt;❌ Prefer all-in-one browser tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Usage
&lt;/h2&gt;

&lt;p&gt;I use XLog for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal wiki&lt;/strong&gt; - 2000+ interconnected notes on programming, books, ideas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project documentation&lt;/strong&gt; - Technical docs with automatic backlinks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning journal&lt;/strong&gt; - Daily notes linked to concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The XLog documentation itself is built with XLog. Every page is interconnected, concepts link naturally, and the knowledge graph reveals relationships I didn't consciously create.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/emad-elsaid/xlog/blob/master/docs/Installation.md" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emad-elsaid/xlog/blob/master/docs/Workflow.md" rel="noopener noreferrer"&gt;Workflow Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emad-elsaid/xlog/blob/master/docs/Backlinks.md" rel="noopener noreferrer"&gt;Backlinks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emad-elsaid/xlog/blob/master/docs/Why-XLog.md" rel="noopener noreferrer"&gt;Why XLog?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/emad-elsaid/xlog" rel="noopener noreferrer"&gt;https://github.com/emad-elsaid/xlog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stars welcome! ⭐&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick start:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/emad-elsaid/xlog/cmd/xlog@latest
&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-notes &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-notes
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"# Hello World"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.md
xlog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; and start building your knowledge base.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy
&lt;/h2&gt;

&lt;p&gt;XLog is built on three principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Filesystem-based&lt;/strong&gt; - Your notes are portable markdown files, not locked in a database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git-native&lt;/strong&gt; - Version control is part of the workflow, not an afterthought&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor-agnostic&lt;/strong&gt; - Use the tools you want, not what we force on you&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I built XLog because I wanted a knowledge base tool that respects these principles while providing automatic backlinks and live preview. If you share these values, give XLog a try.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback Welcome
&lt;/h2&gt;

&lt;p&gt;XLog is actively developed and open to feedback. If you try it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open issues on GitHub for bugs or feature requests&lt;/li&gt;
&lt;li&gt;Star the repo if you find it useful&lt;/li&gt;
&lt;li&gt;Share your knowledge base experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm building XLog for people who value local-first, Git-native knowledge management. If that's you, welcome!&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/emad-elsaid/xlog" rel="noopener noreferrer"&gt;https://github.com/emad-elsaid/xlog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://github.com/emad-elsaid/xlog/tree/master/docs" rel="noopener noreferrer"&gt;https://github.com/emad-elsaid/xlog/tree/master/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://xlog.emadelsaid.com" rel="noopener noreferrer"&gt;https://xlog.emadelsaid.com&lt;/a&gt; (this documentation is built with XLog)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sound approach for a p2p social network which falls back to current web</title>
      <dc:creator>Emad Elsaid</dc:creator>
      <pubDate>Tue, 16 Feb 2021 10:11:02 +0000</pubDate>
      <link>https://dev.to/emad__elsaid/sound-approach-for-a-p2p-social-network-which-falls-back-to-current-web-1f6m</link>
      <guid>https://dev.to/emad__elsaid/sound-approach-for-a-p2p-social-network-which-falls-back-to-current-web-1f6m</guid>
      <description>&lt;p&gt;Following the &lt;a href="https://www.emadelsaid.com/followup-on-peer-to-peer-social-media-network-solution/"&gt;last 2 posts&lt;/a&gt; and other videos in the past weeks. The following&lt;br&gt;
will continue on the same track of a peer to peer social network.&lt;/p&gt;

&lt;p&gt;I'll build the idea as layers over each other so:&lt;/p&gt;

&lt;h1&gt;
  
  
  First: Data format
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I will write my notes, recipes and any activity I want as JSON file on my filesystem.&lt;/li&gt;
&lt;li&gt;To have a common schema I'll use schema.org specifications to present my
activities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Second: Protecting my data
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I will create a openPGP key pair for signing and a sub key for encryption&lt;/li&gt;
&lt;li&gt;I will sign and encrypt my files with the keys so only me can read it and make
sure no body else edits it.&lt;/li&gt;
&lt;li&gt;File are now formatted in openPGP format on disk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Third: Exchanging my data
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;To exchange a note with my friend&lt;/li&gt;
&lt;li&gt;My friend will upload his public key to a keyserver&lt;/li&gt;
&lt;li&gt;I will get the key and verify the signature in another channel&lt;/li&gt;
&lt;li&gt;I will add him as a receiver to the file I want to share&lt;/li&gt;
&lt;li&gt;I will send the file to my friend in an email or chat message or any other
channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Forth: Organizing my files
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;To separate files that are created by me from my friends I will create a
subdirectory for each keypair named after the key short form.&lt;/li&gt;
&lt;li&gt;Now I can see all files shared by one friend in one directory&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Fifth: Browsing my files
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I can build a CLI tool or a UI to create schema.org files signed/encrypted by
my key and also for a friend&lt;/li&gt;
&lt;li&gt;I can extend the UI to show the files content in a user friendly presentation
ordered by creation time latest first&lt;/li&gt;
&lt;li&gt;Now I have a timeline of my activities and my friends&lt;/li&gt;
&lt;li&gt;Now I can filter the files with a subdirectory which makes it my friend
timeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Sixth: Syncing with friends
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I can extend the client UI to join a kademlia network that connect me to my friends&lt;/li&gt;
&lt;li&gt;I can make the client UI send the missing files to my friend and delete the
files I deleted locally&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Seventh: Social interactions
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Liking/disliking and other interactions can be also schema.org files&lt;/li&gt;
&lt;li&gt;That will make them ordinary files which has save privacy and exchange
mechanism as normal activities&lt;/li&gt;
&lt;li&gt;The UI can choose how to display the social interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Eightieth: Falling back to the web
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;website are using schema.org for SEO&lt;/li&gt;
&lt;li&gt;my client UI can read the webpage and extract schema.org parts and render them
like any other post&lt;/li&gt;
&lt;li&gt;I can subscribe to a website which will make the client crawl it regularily
and extract the schema.org parts and save it to a separate subdirectory for
this website.&lt;/li&gt;
&lt;li&gt;Having the peers interact together over HTTP will make it easier to use the
same code for crawling the websites.&lt;/li&gt;
&lt;li&gt;Having the peers exchange schema.org format will make the code reusable.&lt;/li&gt;
&lt;li&gt;My client can have another interface that render my public activities as HTML
pages with schema.org microformats in the same page and a HTTP proxy server
can sync regularily with the client and serve my social feed over HTTP&lt;/li&gt;
&lt;li&gt;Having the activity as a JSON file without encryption means it's a public data
so anyone on the internet can download the file and read it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Ninth: Sharing content
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A file I exchanged with a friend is encrypted for him and other receipients&lt;/li&gt;
&lt;li&gt;My friend can create schema.org shareAction that reference my file address as
the "object" attribute value.&lt;/li&gt;
&lt;li&gt;He can exchange this file with his friends&lt;/li&gt;
&lt;li&gt;His friends will retrieve the file from me if they're one of the recepients&lt;/li&gt;
&lt;li&gt;My client will refuse to transfer the file if the user requesting it is not
one of the recepients.&lt;/li&gt;
&lt;li&gt;Even if my friends transferred the file to them without my permission the file
can't be decrypted by their client.&lt;/li&gt;
&lt;li&gt;If my friend added his friends as recepients to the file and transferred it to
them it is technically possible but it will be breaking my trust in him.
similar to taking a screenshot of private messages. technically possible but
a social violation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>p2p</category>
      <category>socialnetwork</category>
      <category>schemaorg</category>
    </item>
    <item>
      <title>On modern web applications stability</title>
      <dc:creator>Emad Elsaid</dc:creator>
      <pubDate>Mon, 28 Sep 2020 13:40:19 +0000</pubDate>
      <link>https://dev.to/emad__elsaid/on-modern-web-applications-stability-18ak</link>
      <guid>https://dev.to/emad__elsaid/on-modern-web-applications-stability-18ak</guid>
      <description>&lt;p&gt;I don't like how modern web applications are built. Many of the web applications&lt;br&gt;
are too unstable, That you can't imagine having the system running without a&lt;br&gt;
team supporting it. The fact that we try to automate manual processes then the&lt;br&gt;
automation needs manual intervention defies the purpose. Some companies has an&lt;br&gt;
army of developers if they were to do the business by hand they would make a&lt;br&gt;
better job than the programmed system. There are many reasons for this&lt;br&gt;
situation. One of the reasons is the excessive use of third party dependencies.&lt;/p&gt;

&lt;p&gt;Lets take a look on a basic modern web based system, There are several layers&lt;br&gt;
on software running on the machine, starting from firmware to your business&lt;br&gt;
logic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c5LlU5wQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_212438.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c5LlU5wQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_212438.jpg" alt="IMG_20200915_212438.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't think this is very helpful to understand the gravity of the situation.&lt;br&gt;
There are many actors that are not considered in this picture. Layers are also&lt;br&gt;
missing because they are implicit in other layers. Lets expand these hidden&lt;br&gt;
layers and actors. It will help us understand better why that small Nodejs or&lt;br&gt;
RubyOnRails application we wrote isn't just one layer in this picture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rHaPkd5v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_214548.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rHaPkd5v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_214548.jpg" alt="IMG_20200915_214548.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the layers we added this time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System core utilities&lt;/li&gt;
&lt;li&gt;Other processes your application depends on like "memcached, Redis, MySQL,
Postgres...etc"&lt;/li&gt;
&lt;li&gt;Third party code your application depends on an ORM, Template engine,
pagination library, a library that &lt;a href="https://www.theregister.com/2016/03/23/npm_left_pad_chaos/"&gt;pads your string with
spaces&lt;/a&gt; just
because.&lt;/li&gt;
&lt;li&gt;Server applications that sits in front of your code handling HTTP and response
compression...etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each of these layers there is &lt;strong&gt;at least&lt;/strong&gt; one team responsible for&lt;br&gt;
maintaining it.&lt;/p&gt;

&lt;p&gt;Again, We missed other layers and people in this picture. Most of the&lt;br&gt;
applications are using external SAAS providers for logs or monitoring or bug&lt;br&gt;
reporting or provide parts of the system functionality that can take more time&lt;br&gt;
to build by the company team. lets add them to the picture along with their&lt;br&gt;
teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tR7jvf9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_221047.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tR7jvf9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_221047.jpg" alt="IMG_20200915_221047.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This picture is for one application, I won't expand it to a whole system with&lt;br&gt;
different services and programs that is the reality of all companies.&lt;br&gt;
Lets stick to one application for the sake of simplicity.&lt;/p&gt;

&lt;p&gt;So here is the first point I want to make: With every service you use you're not&lt;br&gt;
just a user, This service is now part of your application, You are held&lt;br&gt;
responsible for it's behavior and misbehaving. You will inherit bugs in their&lt;br&gt;
system. When this service team is affected by COVID-19 and get reduced to the&lt;br&gt;
point where they can't fix issues you will be affected too. When They get slower&lt;br&gt;
your application will get slower too. When their service is down your&lt;br&gt;
application will experience malfunction too, Your system and theirs is now&lt;br&gt;
connected. So add external services integration cautiously. By adding an&lt;br&gt;
external system you're putting your trust in this service team and their ability&lt;br&gt;
in delivering what the service is promising now &lt;strong&gt;and&lt;/strong&gt; in the future. This is not&lt;br&gt;
an easy decision and it should be treated as such.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r0MkY9G8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_224907.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r0MkY9G8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_224907.jpg" alt="IMG_20200915_224907.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now lets move to the direct dependencies of your application. If you're using&lt;br&gt;
any modern programming language it'll have a way to package code into reusable&lt;br&gt;
format that could be reused by other applications. one package can use code from&lt;br&gt;
other packages, these packages can use other packages and so on like a tree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K615XLqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_231326.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K615XLqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.emadelsaid.com/images/IMG_20200915_231326.jpg" alt="IMG_20200915_231326.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With every package in this tree we depend on the code inside this package and&lt;br&gt;
the team that maintains it. A freshly generated rails project depends on 74&lt;br&gt;
packages for ruby and &lt;code&gt;Yarn list&lt;/code&gt; that lists JavaScript dependencies output 3102&lt;br&gt;
lines, that's 3176 packages with teams maintaining them and bugs and new&lt;br&gt;
versions all the time.&lt;/p&gt;

&lt;p&gt;This is wrong for many reasons. I will list some of them here for the sake of&lt;br&gt;
clarity.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have put your trust in at least 3176 other developers. You have never met
them, never talked to them, there are no guarantee they will continue to
maintain this package. There are no guarantee they won't put code in their
package to show &lt;a href="https://www.zdnet.com/article/npm-bans-terminal-ads/"&gt;ads in your
terminal&lt;/a&gt; or &lt;a href="https://www.trendmicro.com/vinfo/dk/security/news/cybercrime-and-digital-threats/hacker-infects-node-js-package-to-steal-from-bitcoin-wallets"&gt;code that
steals your bitcoin wallets
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You are not really using all of this code. When someone is writing an open
source package it will suffer sooner or later from &lt;a href="https://en.wikipedia.org/wiki/Feature_creep"&gt;feature
creeping&lt;/a&gt; You are probably using
couple features of this package and don't need the rest, but you wanted the
banana and got the whole forest now.&lt;/li&gt;
&lt;li&gt;With every package update you're inventing unnecessary work for yourself. New
versions of packages are released all the time. Updating your project to &lt;strong&gt;get
the latest bug fixes and features&lt;/strong&gt; is usually what people do. Most of the
time because of feature creeping these versions changes are not relevant to
you at all, but you won't know until you read the change log. If it's relevant
to your project you'll need to do an update. if something is deprecated or
changed you'll need to change your code. So suddenly someone somewhere is
telling you to change your code. That's part of the control you have over your
code handed over to someone you never talked to or knew.&lt;/li&gt;
&lt;li&gt;When your programming language has a new release you can't update unless all of
your dependencies are up to date. For ruby 2.7.0 for example some language syntax is
now deprecated and shows warning when you run your project. So to fix that you
either fix it in the package and open a PR with the change or wait for the
maintainer to update it.&lt;/li&gt;
&lt;li&gt;When you encounter a bug in a dependency you will have to understand this
package code, fork, branch, fix rinse and repeat. That requires a some
cooperation from the library maintainer which is most of the time isn't
possible because most of the open source projects are voluntarily maintained.&lt;/li&gt;
&lt;li&gt;Developing new features or modifying existing features are ordre of magnitude
harder. You'll need to dig into the documentation of the dependencies looking
for support for this little feature you want to add. That is if there is any
documentation at all for that part of the code. Otherwise you'll have to dig
in to the library code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the second point I want to make: Using external library implies that you&lt;br&gt;
trust the maintainer and you also inherit his decisions about using other&lt;br&gt;
libraries and so forth. This decision should be weighed based on the benefit of&lt;br&gt;
the library and how many of it's features you're going to use and other factors&lt;br&gt;
like the maturity and how responsive is the maintainer, please don't use GitHub&lt;br&gt;
stars as a factor in your decision it's misleading. And if the part you use from&lt;br&gt;
the library isn't too big I recommend using the library to save some time and&lt;br&gt;
effort upfront but make sure you get rid of it and implement the part you need.&lt;br&gt;
An example of that is a pagination library like rails "Kaminari" if you're using&lt;br&gt;
it to save you some time then sure. But keep on your todo list a task to remove&lt;br&gt;
it and implement the feature yourself. An example of libraries that's hard to&lt;br&gt;
get rid of it "OpenCV" This is something that reimplementing the part you need&lt;br&gt;
probably will be a huge task so it can stay. You'll need to use your best&lt;br&gt;
judgment to decide between these 2 sides of the spectrum.&lt;/p&gt;

&lt;p&gt;I like to think of what I do as building an automated system, I would like this&lt;br&gt;
system to run by itself, keep itself clean and healthy, doesn't need manual&lt;br&gt;
intervention. If the whole team disappeared out of existence I would like that&lt;br&gt;
system to work for a very long time without any supervision.&lt;/p&gt;

&lt;p&gt;More code means more bugs for me to fix, by extension more code that I didn't write&lt;br&gt;
means more bugs that I probably can't solve. This is dangerous and shouldn't be&lt;br&gt;
taken lightly. Extending your code with external libraries or systems can cut&lt;br&gt;
down effort hence the cost of development. But when this is taken lightly it&lt;br&gt;
backfires badly.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
