<?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: Andrew Erlikh</title>
    <description>The latest articles on DEV Community by Andrew Erlikh (@aceberg).</description>
    <link>https://dev.to/aceberg</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%2F989228%2F23618de7-6c06-4dda-84c1-5f4d9c5d6770.jpeg</url>
      <title>DEV Community: Andrew Erlikh</title>
      <link>https://dev.to/aceberg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aceberg"/>
    <language>en</language>
    <item>
      <title>I made BookTr: side-by-side translate app</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Sat, 01 Mar 2025 15:11:59 +0000</pubDate>
      <link>https://dev.to/aceberg/i-made-booktr-side-by-side-translate-app-26k8</link>
      <guid>https://dev.to/aceberg/i-made-booktr-side-by-side-translate-app-26k8</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/aceberg/BookTr" rel="noopener noreferrer"&gt;BookTr&lt;/a&gt; is a tool for reading texts in foreign languages. Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;a href="https://github.com/LibreTranslate/LibreTranslate" rel="noopener noreferrer"&gt;LibreTranslate API&lt;/a&gt;, but other APIs can be added later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side-by-side&lt;/strong&gt; translation, &lt;strong&gt;aligned paragraphs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can &lt;strong&gt;save&lt;/strong&gt; translations in &lt;code&gt;json&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select&lt;/strong&gt; word to see its translation, &lt;strong&gt;double click&lt;/strong&gt; to translate every word in a sentence&lt;/li&gt;
&lt;li&gt;Fully &lt;strong&gt;Self-Hosted&lt;/strong&gt;, can work &lt;strong&gt;offline&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4f79ywhtq7or8kvghd8.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%2Fh4f79ywhtq7or8kvghd8.png" alt="Screenshot" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reasons for creating BookTr
&lt;/h2&gt;

&lt;p&gt;The best way to learn a foreign language for me is by reading books in it. I tried doing it with Google Translate and other similar online tools, it's been frustrating: the interface is not suitable for long texts.&lt;/p&gt;

&lt;p&gt;So, I decided to create my own)).&lt;/p&gt;

&lt;p&gt;I am open to suggestions about adding other translation APIs, the only limit is - no paid ones. Only free online or self-hosted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start (Docker)
&lt;/h2&gt;

&lt;p&gt;First, run &lt;strong&gt;LibreTranslate&lt;/strong&gt; container. It will take some time (~20 minutes) and resources (~1Gb memory, 10+Gb disk). When you see it's web interface at port 5000, move on to installing &lt;strong&gt;BookTr&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;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; ltr &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 &lt;span class="se"&gt;\&lt;/span&gt;
  libretranslate/libretranslate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; BookTr &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"TZ=&lt;/span&gt;&lt;span class="nv"&gt;$YOURTIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;                 &lt;span class="c"&gt;# your TZ here&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"LTRPATH=http://&lt;/span&gt;&lt;span class="nv"&gt;$YOURADDRESS&lt;/span&gt;&lt;span class="s2"&gt;:5000"&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c"&gt;# LibreTranslate URL&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; ~/.dockerdata/BookTr:/data/BookTr  &lt;span class="se"&gt;\ &lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt; 8856:8856 &lt;span class="se"&gt;\&lt;/span&gt;
  aceberg/booktr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use &lt;a href="https://github.com/aceberg/BookTr/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;docker-compose.yml&lt;/a&gt; &lt;/p&gt;

</description>
      <category>showdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>go</category>
    </item>
    <item>
      <title>AnyAppStart</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Sat, 11 Jan 2025 16:26:21 +0000</pubDate>
      <link>https://dev.to/aceberg/anyappstart-1pk9</link>
      <guid>https://dev.to/aceberg/anyappstart-1pk9</guid>
      <description>&lt;p&gt;I created &lt;a href="https://github.com/aceberg/AnyAppStart" rel="noopener noreferrer"&gt;AnyAppStart&lt;/a&gt; - control panel to &lt;code&gt;Start&lt;/code&gt;/&lt;code&gt;Stop&lt;/code&gt;/&lt;code&gt;Restart&lt;/code&gt;/&lt;code&gt;View Logs&lt;/code&gt; for Docker, Systemd, VMs or anything else (with user scripts). Written in &lt;code&gt;Go&lt;/code&gt; and &lt;code&gt;React&lt;/code&gt;. Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User can add any types (like LXC or WakeOnLAN)&lt;/li&gt;
&lt;li&gt;Control remote machines via SSH&lt;/li&gt;
&lt;li&gt;Config in &lt;code&gt;yaml&lt;/code&gt; files, no DB&lt;/li&gt;
&lt;li&gt;Simple API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5uixpq8q0tuy0kginx5.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%2Ff5uixpq8q0tuy0kginx5.png" alt="Screenshot" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reasons for creating AnyAppStart
&lt;/h2&gt;

&lt;p&gt;My use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource heavy but rarely used apps. Start them only when necessary&lt;/li&gt;
&lt;li&gt;Environments for development, learning and experimenting. I do not need them all running at the same time&lt;/li&gt;
&lt;li&gt;Being able to control local and remote apps from one place, no matter what type (Docker, Systemd, VM, bash script)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;There is Docker image &lt;a href="https://github.com/aceberg/AnyAppStart?tab=readme-ov-file#installation" rel="noopener noreferrer"&gt;available&lt;/a&gt;, but inside the container only Docker Type will work, which kinda defeats the purpose of this app. So installing binary is recommended. &lt;/p&gt;

&lt;p&gt;All binary packages can be found in the &lt;a href="https://github.com/aceberg/AnyAppStart/releases/latest" rel="noopener noreferrer"&gt;latest&lt;/a&gt; release. There are &lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt;, &lt;code&gt;.apk&lt;/code&gt; (Alpine Linux) and &lt;code&gt;.tar.gz&lt;/code&gt; files.   &lt;/p&gt;

&lt;p&gt;Supported architectures: &lt;code&gt;amd64&lt;/code&gt;, &lt;code&gt;i386&lt;/code&gt;, &lt;code&gt;arm_v5&lt;/code&gt;, &lt;code&gt;arm_v6&lt;/code&gt;, &lt;code&gt;arm_v7&lt;/code&gt;, &lt;code&gt;arm64&lt;/code&gt;.   &lt;/p&gt;

&lt;p&gt;For &lt;code&gt;amd64&lt;/code&gt; there is a &lt;code&gt;deb&lt;/code&gt; repo &lt;a href="https://github.com/aceberg/ppa" rel="noopener noreferrer"&gt;available&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>DiaryMD - markdown editor with Tabs, WorkSpaces and Blog</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Fri, 22 Nov 2024 11:14:56 +0000</pubDate>
      <link>https://dev.to/aceberg/diarymd-markdown-editor-with-tabs-workspaces-and-blog-2b6p</link>
      <guid>https://dev.to/aceberg/diarymd-markdown-editor-with-tabs-workspaces-and-blog-2b6p</guid>
      <description>&lt;p&gt;Markdown editor written in &lt;code&gt;Go&lt;/code&gt; and &lt;code&gt;SolidJS&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully configurable Themes&lt;/li&gt;
&lt;li&gt;Tabs&lt;/li&gt;
&lt;li&gt;WorkSpaces&lt;/li&gt;
&lt;li&gt;Simple Blog&lt;/li&gt;
&lt;li&gt;Full screen mode&lt;/li&gt;
&lt;li&gt;Works with a given directory (could be a &lt;code&gt;git&lt;/code&gt; repo). No DB needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reasons for creating DiaryMD
&lt;/h2&gt;

&lt;p&gt;I've got a lot of different types of texts I want to manage in a single app and store in different &lt;code&gt;git&lt;/code&gt; repos (IT docs, Food recipes, Personal blog and even Fanfiction 😁 ). I tried to use IDE, but something like VSCode was definitely overkill. Also, I wanted an option to navigate through old texts in a blog format.&lt;/p&gt;

&lt;p&gt;That's why I created DiaryMD. It has unlimited WorkSpaces, each WorkSpace with it's own theme, repo and blog (optional). It supports Markdown formatting with &lt;a href="https://github.com/Ionaru/easy-markdown-editor" rel="noopener noreferrer"&gt;EasyMDE&lt;/a&gt; editor, but can be used with any kind of text files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;DiaryMD supports most of popular architectures and operation sustems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aceberg/DiaryMD#quick-start-docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aceberg/DiaryMD/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aceberg/DiaryMD/blob/main/docker-compose-auth.yml" rel="noopener noreferrer"&gt;docker-compose-auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aceberg/DiaryMD/releases" rel="noopener noreferrer"&gt;Binaries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>solidjs</category>
      <category>markdown</category>
    </item>
    <item>
      <title>Wormhole Proxy (Firefox Add-on) - single-list proxy manager</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Tue, 17 Sep 2024 19:12:53 +0000</pubDate>
      <link>https://dev.to/aceberg/wormhole-proxy-firefox-add-on-single-list-proxy-manager-3c75</link>
      <guid>https://dev.to/aceberg/wormhole-proxy-firefox-add-on-single-list-proxy-manager-3c75</guid>
      <description>&lt;p&gt;I created a simple Open Source Proxy Manager for non-tech users: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/wormhole-proxy/" rel="noopener noreferrer"&gt;Wormhole Proxy&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;As a sysadmin, I get quite a few complaints from non-tech users about popular proxy managers being too complicated, so they needed my help every time to add a new host etc. So, I decided to make a tool they can use themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ejyi9pg3cto3gx3zw1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ejyi9pg3cto3gx3zw1t.png" alt="Menu" width="362" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;    Sync config to Firefox&lt;/li&gt;
&lt;li&gt;    Local import and export&lt;/li&gt;
&lt;li&gt;    Local backup&lt;/li&gt;
&lt;li&gt;    &lt;code&gt;Add this page&lt;/code&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/aceberg/WormholeProxy" rel="noopener noreferrer"&gt;https://github.com/aceberg/WormholeProxy&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>firefox</category>
      <category>extensions</category>
      <category>proxy</category>
    </item>
    <item>
      <title>WatchYourLAN 2.0 - lightweight network IP scanner</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Tue, 03 Sep 2024 14:08:04 +0000</pubDate>
      <link>https://dev.to/aceberg/watchyourlan-20-lightweight-network-ip-scanner-p8c</link>
      <guid>https://dev.to/aceberg/watchyourlan-20-lightweight-network-ip-scanner-p8c</guid>
      <description>&lt;h2&gt;
  
  
  Main features of &lt;a href="https://github.com/aceberg/WatchYourLAN" rel="noopener noreferrer"&gt;WatchYourLAN&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Send notification when new host is found&lt;/li&gt;
&lt;li&gt;Monitor hosts online/offline history&lt;/li&gt;
&lt;li&gt;Keep a list of all hosts in the network&lt;/li&gt;
&lt;li&gt;Send data to &lt;code&gt;InfluxDB2&lt;/code&gt; to make a &lt;code&gt;Grafana&lt;/code&gt; dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's new in &lt;code&gt;v2&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic &lt;code&gt;API&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Export to &lt;code&gt;InfluxDB2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choice between &lt;code&gt;SQLite&lt;/code&gt; and &lt;code&gt;PostgreSQL&lt;/code&gt; database&lt;/li&gt;
&lt;li&gt;User can pass arguments directly to &lt;code&gt;arp-scan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Better &lt;code&gt;UI&lt;/code&gt; with &lt;code&gt;JS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Human-friendly &lt;code&gt;History&lt;/code&gt; display&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Full installation guide is available in the &lt;a href="https://github.com/aceberg/WatchYourLAN" rel="noopener noreferrer"&gt;README&lt;/a&gt; file. The easiest way to try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; wyl &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"IFACES=&lt;/span&gt;&lt;span class="nv"&gt;$YOURIFACE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"TZ=&lt;/span&gt;&lt;span class="nv"&gt;$YOURTIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"host"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$DOCKERDATAPATH&lt;/span&gt;/wyl:/data/WatchYourLAN &lt;span class="se"&gt;\&lt;/span&gt;
    aceberg/watchyourlan:v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Web GUI should be at &lt;a href="http://localhost:8840" rel="noopener noreferrer"&gt;http://localhost:8840&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>network</category>
    </item>
    <item>
      <title>WatchYourPorts - self-hosted ports inventory</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Fri, 05 Jul 2024 10:57:20 +0000</pubDate>
      <link>https://dev.to/aceberg/watchyourports-self-hosted-ports-inventory-55ek</link>
      <guid>https://dev.to/aceberg/watchyourports-self-hosted-ports-inventory-55ek</guid>
      <description>&lt;p&gt;I'm using a lot of self-hosted apps, both at work and in my homelab. Of course, I can't remember all ports taken by those apps. So, the idea of ports inventory seems reasonable.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Why not just use Portainer or other Docker tool?&lt;/em&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not all apps are hosted in &lt;code&gt;Docker&lt;/code&gt;. Some things must be run as &lt;code&gt;systemd&lt;/code&gt; services.&lt;/li&gt;
&lt;li&gt;Port may be exposed in &lt;code&gt;Docker&lt;/code&gt;, but blocked by firewall.&lt;/li&gt;
&lt;li&gt;There may be ports exposed to the world, you are not aware of.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;So, the purposes of WatchYourPorts are:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inventory&lt;/li&gt;
&lt;li&gt;Security &lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Monitoring is the last one, because it's not the main purpose of this app. There are already tools for that. &lt;code&gt;WatchYourPorts&lt;/code&gt; can do simple port scan on timer and export data to &lt;code&gt;InfluxDB2/Grafana&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Faceberg%2FWatchYourPorts%2Fmain%2Fassets%2FScreenshot2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Faceberg%2FWatchYourPorts%2Fmain%2Fassets%2FScreenshot2.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Details&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No DB, all config is stored in two &lt;code&gt;yaml&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;All configuration can be done through &lt;code&gt;ENV&lt;/code&gt; variables, &lt;code&gt;yaml&lt;/code&gt; or &lt;code&gt;GUI&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Docker&lt;/code&gt; images for &lt;code&gt;arm/v6&lt;/code&gt;,&lt;code&gt;arm/v7&lt;/code&gt;,&lt;code&gt;arm/arm64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Binary &lt;a href="https://github.com/aceberg/WatchYourPorts/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt; for many platforms.&lt;/li&gt;
&lt;li&gt;Export to &lt;code&gt;InfluxDB2&lt;/code&gt;, which allows building a &lt;code&gt;Grafana&lt;/code&gt; dashboard.&lt;/li&gt;
&lt;li&gt;Simple &lt;a href="https://github.com/aceberg/watchyourports#api" rel="noopener noreferrer"&gt;API&lt;/a&gt; to get data from &lt;code&gt;WatchYourPorts&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;&lt;br&gt;
Full installation guide is available in the &lt;a href="https://github.com/aceberg/WatchYourPorts" rel="noopener noreferrer"&gt;README&lt;/a&gt; file. The easiest way to try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; wyp &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"TZ=&lt;/span&gt;&lt;span class="nv"&gt;$YourTimeZone&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; ~/.dockerdata/WatchYourPorts:/data/WatchYourPorts &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-p&lt;/span&gt; 8853:8853 &lt;span class="se"&gt;\&lt;/span&gt;
aceberg/watchyourports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>showdev</category>
      <category>go</category>
      <category>network</category>
    </item>
    <item>
      <title>git-syr - Sync Your Repos</title>
      <dc:creator>Andrew Erlikh</dc:creator>
      <pubDate>Fri, 23 Dec 2022 07:40:54 +0000</pubDate>
      <link>https://dev.to/aceberg/git-syr-sync-your-repos-312e</link>
      <guid>https://dev.to/aceberg/git-syr-sync-your-repos-312e</guid>
      <description>&lt;p&gt;Pull or push your git repos regularly. For dotfiles backups or note-taking in a git repo.&lt;/p&gt;

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

&lt;p&gt;I used a simple cron script to sync my note-taking app for years, but it becomes complicated, when you have more than one repository to sync. So, I created this app with easy config and GUI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git-syr&lt;/code&gt; has separate config for each repository. It indicates whether the repo should be pulled, committed and pushed or both every N seconds (minutes, hours).&lt;br&gt;
It can run in CLI-only mod or with web GUI.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;repos.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Dotfiles
  path: /home/data/repo/dotfiles
  timeout: 4h
  pull: "no"
  push: "yes"

- name: MyNotes
  path: /home/data/repo/MyNotes
  timeout: 1m
  pull: "yes"
  push: "yes"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/aceberg/git-syr"&gt;https://github.com/aceberg/git-syr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>git</category>
    </item>
  </channel>
</rss>
