DEV Community: Andrew Erlikh The latest articles on DEV Community by Andrew Erlikh (@aceberg). https://dev.to/aceberg 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 DEV Community: Andrew Erlikh https://dev.to/aceberg en I made BookTr: side-by-side translate app Andrew Erlikh Sat, 01 Mar 2025 15:11:59 +0000 https://dev.to/aceberg/i-made-booktr-side-by-side-translate-app-26k8 https://dev.to/aceberg/i-made-booktr-side-by-side-translate-app-26k8 <p><a href="proxy.php?url=https://github.com/aceberg/BookTr" rel="noopener noreferrer">BookTr</a> is a tool for reading texts in foreign languages. Features:</p> <ul> <li>Uses <a href="proxy.php?url=https://github.com/LibreTranslate/LibreTranslate" rel="noopener noreferrer">LibreTranslate API</a>, but other APIs can be added later</li> <li> <strong>Side-by-side</strong> translation, <strong>aligned paragraphs</strong> </li> <li>Can <strong>save</strong> translations in <code>json</code> format</li> <li> <strong>Select</strong> word to see its translation, <strong>double click</strong> to translate every word in a sentence</li> <li>Fully <strong>Self-Hosted</strong>, can work <strong>offline</strong> </li> </ul> <p><a href="proxy.php?url=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"><img src="proxy.php?url=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"></a></p> <h2> Reasons for creating BookTr </h2> <p>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.</p> <p>So, I decided to create my own)).</p> <p>I am open to suggestions about adding other translation APIs, the only limit is - no paid ones. Only free online or self-hosted.</p> <h2> Quick start (Docker) </h2> <p>First, run <strong>LibreTranslate</strong> 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 <strong>BookTr</strong>.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>docker run <span class="nt">--name</span> ltr <span class="se">\</span> <span class="nt">-p</span> 5000:5000 <span class="se">\</span> libretranslate/libretranslate </code></pre> </div> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>docker run <span class="nt">--name</span> BookTr <span class="se">\</span> <span class="nt">-e</span> <span class="s2">"TZ=</span><span class="nv">$YOURTIMEZONE</span><span class="s2">"</span> <span class="se">\ </span> <span class="c"># your TZ here</span> <span class="nt">-e</span> <span class="s2">"LTRPATH=http://</span><span class="nv">$YOURADDRESS</span><span class="s2">:5000"</span> <span class="se">\ </span> <span class="c"># LibreTranslate URL</span> <span class="nt">-v</span> ~/.dockerdata/BookTr:/data/BookTr <span class="se">\ </span> <span class="nt">-p</span> 8856:8856 <span class="se">\</span> aceberg/booktr </code></pre> </div> <p>Or use <a href="proxy.php?url=https://github.com/aceberg/BookTr/blob/main/docker-compose.yml" rel="noopener noreferrer">docker-compose.yml</a> </p> showdev react typescript go AnyAppStart Andrew Erlikh Sat, 11 Jan 2025 16:26:21 +0000 https://dev.to/aceberg/anyappstart-1pk9 https://dev.to/aceberg/anyappstart-1pk9 <p>I created <a href="proxy.php?url=https://github.com/aceberg/AnyAppStart" rel="noopener noreferrer">AnyAppStart</a> - control panel to <code>Start</code>/<code>Stop</code>/<code>Restart</code>/<code>View Logs</code> for Docker, Systemd, VMs or anything else (with user scripts). Written in <code>Go</code> and <code>React</code>. Features:</p> <ul> <li>User can add any types (like LXC or WakeOnLAN)</li> <li>Control remote machines via SSH</li> <li>Config in <code>yaml</code> files, no DB</li> <li>Simple API</li> </ul> <p><a href="proxy.php?url=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"><img src="proxy.php?url=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"></a></p> <h2> Reasons for creating AnyAppStart </h2> <p>My use cases:</p> <ul> <li>Resource heavy but rarely used apps. Start them only when necessary</li> <li>Environments for development, learning and experimenting. I do not need them all running at the same time</li> <li>Being able to control local and remote apps from one place, no matter what type (Docker, Systemd, VM, bash script)</li> </ul> <h2> Installation </h2> <p>There is Docker image <a href="proxy.php?url=https://github.com/aceberg/AnyAppStart?tab=readme-ov-file#installation" rel="noopener noreferrer">available</a>, but inside the container only Docker Type will work, which kinda defeats the purpose of this app. So installing binary is recommended. </p> <p>All binary packages can be found in the <a href="proxy.php?url=https://github.com/aceberg/AnyAppStart/releases/latest" rel="noopener noreferrer">latest</a> release. There are <code>.deb</code>, <code>.rpm</code>, <code>.apk</code> (Alpine Linux) and <code>.tar.gz</code> files. </p> <p>Supported architectures: <code>amd64</code>, <code>i386</code>, <code>arm_v5</code>, <code>arm_v6</code>, <code>arm_v7</code>, <code>arm64</code>. </p> <p>For <code>amd64</code> there is a <code>deb</code> repo <a href="proxy.php?url=https://github.com/aceberg/ppa" rel="noopener noreferrer">available</a></p> showdev react typescript DiaryMD - markdown editor with Tabs, WorkSpaces and Blog Andrew Erlikh Fri, 22 Nov 2024 11:14:56 +0000 https://dev.to/aceberg/diarymd-markdown-editor-with-tabs-workspaces-and-blog-2b6p https://dev.to/aceberg/diarymd-markdown-editor-with-tabs-workspaces-and-blog-2b6p <p>Markdown editor written in <code>Go</code> and <code>SolidJS</code>:</p> <ul> <li>Fully configurable Themes</li> <li>Tabs</li> <li>WorkSpaces</li> <li>Simple Blog</li> <li>Full screen mode</li> <li>Works with a given directory (could be a <code>git</code> repo). No DB needed</li> </ul> <h2> Reasons for creating DiaryMD </h2> <p>I've got a lot of different types of texts I want to manage in a single app and store in different <code>git</code> 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.</p> <p>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 <a href="proxy.php?url=https://github.com/Ionaru/easy-markdown-editor" rel="noopener noreferrer">EasyMDE</a> editor, but can be used with any kind of text files.</p> <h2> Installation </h2> <p>DiaryMD supports most of popular architectures and operation sustems.</p> <ul> <li><a href="proxy.php?url=https://github.com/aceberg/DiaryMD#quick-start-docker" rel="noopener noreferrer">Docker</a></li> <li><a href="proxy.php?url=https://github.com/aceberg/DiaryMD/blob/main/docker-compose.yml" rel="noopener noreferrer">docker-compose</a></li> <li><a href="proxy.php?url=https://github.com/aceberg/DiaryMD/blob/main/docker-compose-auth.yml" rel="noopener noreferrer">docker-compose-auth</a></li> <li><a href="proxy.php?url=https://github.com/aceberg/DiaryMD/releases" rel="noopener noreferrer">Binaries</a></li> </ul> showdev go solidjs markdown Wormhole Proxy (Firefox Add-on) - single-list proxy manager Andrew Erlikh Tue, 17 Sep 2024 19:12:53 +0000 https://dev.to/aceberg/wormhole-proxy-firefox-add-on-single-list-proxy-manager-3c75 https://dev.to/aceberg/wormhole-proxy-firefox-add-on-single-list-proxy-manager-3c75 <p>I created a simple Open Source Proxy Manager for non-tech users: <a href="proxy.php?url=https://addons.mozilla.org/en-US/firefox/addon/wormhole-proxy/" rel="noopener noreferrer">Wormhole Proxy</a></p> <p><strong>Why?</strong></p> <p>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.</p> <p><a href="proxy.php?url=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"><img src="proxy.php?url=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"></a></p> <p><strong>Features:</strong></p> <ul> <li> Sync config to Firefox</li> <li> Local import and export</li> <li> Local backup</li> <li> <code>Add this page</code> button</li> </ul> <p>Github: <a href="proxy.php?url=https://github.com/aceberg/WormholeProxy" rel="noopener noreferrer">https://github.com/aceberg/WormholeProxy</a></p> showdev firefox extensions proxy WatchYourLAN 2.0 - lightweight network IP scanner Andrew Erlikh Tue, 03 Sep 2024 14:08:04 +0000 https://dev.to/aceberg/watchyourlan-20-lightweight-network-ip-scanner-p8c https://dev.to/aceberg/watchyourlan-20-lightweight-network-ip-scanner-p8c <h2> Main features of <a href="proxy.php?url=https://github.com/aceberg/WatchYourLAN" rel="noopener noreferrer">WatchYourLAN</a> </h2> <ul> <li>Send notification when new host is found</li> <li>Monitor hosts online/offline history</li> <li>Keep a list of all hosts in the network</li> <li>Send data to <code>InfluxDB2</code> to make a <code>Grafana</code> dashboard</li> </ul> <h2> What's new in <code>v2</code>? </h2> <ul> <li>Basic <code>API</code> </li> <li>Export to <code>InfluxDB2</code> </li> <li>Choice between <code>SQLite</code> and <code>PostgreSQL</code> database</li> <li>User can pass arguments directly to <code>arp-scan</code> </li> <li>Better <code>UI</code> with <code>JS</code> </li> <li>Human-friendly <code>History</code> display</li> </ul> <h2> Quick start </h2> <p>Full installation guide is available in the <a href="proxy.php?url=https://github.com/aceberg/WatchYourLAN" rel="noopener noreferrer">README</a> file. The easiest way to try it:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>docker run <span class="nt">--name</span> wyl <span class="se">\</span> <span class="nt">-e</span> <span class="s2">"IFACES=</span><span class="nv">$YOURIFACE</span><span class="s2">"</span> <span class="se">\</span> <span class="nt">-e</span> <span class="s2">"TZ=</span><span class="nv">$YOURTIMEZONE</span><span class="s2">"</span> <span class="se">\</span> <span class="nt">--network</span><span class="o">=</span><span class="s2">"host"</span> <span class="se">\</span> <span class="nt">-v</span> <span class="nv">$DOCKERDATAPATH</span>/wyl:/data/WatchYourLAN <span class="se">\</span> aceberg/watchyourlan:v2 </code></pre> </div> <p>Web GUI should be at <a href="proxy.php?url=http://localhost:8840" rel="noopener noreferrer">http://localhost:8840</a></p> showdev go network WatchYourPorts - self-hosted ports inventory Andrew Erlikh Fri, 05 Jul 2024 10:57:20 +0000 https://dev.to/aceberg/watchyourports-self-hosted-ports-inventory-55ek https://dev.to/aceberg/watchyourports-self-hosted-ports-inventory-55ek <p>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.</p> <p><strong>Why</strong></p> <p><em>Why not just use Portainer or other Docker tool?</em> </p> <ul> <li>Not all apps are hosted in <code>Docker</code>. Some things must be run as <code>systemd</code> services.</li> <li>Port may be exposed in <code>Docker</code>, but blocked by firewall.</li> <li>There may be ports exposed to the world, you are not aware of.</li> </ul> <p><em>So, the purposes of WatchYourPorts are:</em></p> <ol> <li>Inventory</li> <li>Security </li> <li>Monitoring</li> </ol> <p>Monitoring is the last one, because it's not the main purpose of this app. There are already tools for that. <code>WatchYourPorts</code> can do simple port scan on timer and export data to <code>InfluxDB2/Grafana</code>.</p> <p><a href="proxy.php?url=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"><img src="proxy.php?url=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"></a></p> <p><strong>Details</strong></p> <ul> <li>No DB, all config is stored in two <code>yaml</code> files.</li> <li>All configuration can be done through <code>ENV</code> variables, <code>yaml</code> or <code>GUI</code>.</li> <li> <code>Docker</code> images for <code>arm/v6</code>,<code>arm/v7</code>,<code>arm/arm64</code>.</li> <li>Binary <a href="proxy.php?url=https://github.com/aceberg/WatchYourPorts/releases" rel="noopener noreferrer">releases</a> for many platforms.</li> <li>Export to <code>InfluxDB2</code>, which allows building a <code>Grafana</code> dashboard.</li> <li>Simple <a href="proxy.php?url=https://github.com/aceberg/watchyourports#api" rel="noopener noreferrer">API</a> to get data from <code>WatchYourPorts</code>.</li> </ul> <p><strong>How</strong><br> Full installation guide is available in the <a href="proxy.php?url=https://github.com/aceberg/WatchYourPorts" rel="noopener noreferrer">README</a> file. The easiest way to try it:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>docker run <span class="nt">--name</span> wyp <span class="se">\</span> <span class="nt">-e</span> <span class="s2">"TZ=</span><span class="nv">$YourTimeZone</span><span class="s2">"</span> <span class="se">\</span> <span class="nt">-v</span> ~/.dockerdata/WatchYourPorts:/data/WatchYourPorts <span class="se">\</span> <span class="nt">-p</span> 8853:8853 <span class="se">\</span> aceberg/watchyourports </code></pre> </div> showdev go network git-syr - Sync Your Repos Andrew Erlikh Fri, 23 Dec 2022 07:40:54 +0000 https://dev.to/aceberg/git-syr-sync-your-repos-312e https://dev.to/aceberg/git-syr-sync-your-repos-312e <p>Pull or push your git repos regularly. For dotfiles backups or note-taking in a git repo.</p> <h2> Why? </h2> <p>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.</p> <h2> What it does? </h2> <p><code>git-syr</code> has separate config for each repository. It indicates whether the repo should be pulled, committed and pushed or both every N seconds (minutes, hours).<br> It can run in CLI-only mod or with web GUI.</p> <h2> Example </h2> <p><code>repos.yaml</code>:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight plaintext"><code>- 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" </code></pre> </div> <h2> Try it </h2> <p><a href="proxy.php?url=https://github.com/aceberg/git-syr">https://github.com/aceberg/git-syr</a></p> showdev go git