From the depths of the potato core 🥔⚙️

Main topics

#android   → Android without the bloat: Shizuku, Obtainium, OS fixes, automation
#docker    → Containers that don't fall apart: orchestration, backups, optimization
#git       → Version control without lumps: from submodules to GitHub CLI
#gpt       → AI in infrastructure: smart assistants, automation, experiments
#linux     → Systems that just work: NixOS, ARM, recovery, fine-tuning
#mesh      → Own network without Internet: LoRa, Meshtastic, Reticulum, privacy
#openwrt   → Routers with character: filtering, WireGuard, monitoring
#windows   → Hybrid solutions: WSL, OpenSSH, ecosystem integration

🥔 A potato is not just a vegetable. It’s a state of mind.
And good code is not just work. It’s art.

Follow us: Discord | Telegram | Matrix | Steam | RSS

GitHub CLI: Bulk Delete Old Issues

Long-running projects accumulate outdated issues: bugs for old versions, features that are no longer relevant, test tickets. Manual deletion is slow and tedious. This script automatically finds and deletes (or marks) old issues by specified labels. 💡 Script uses dry-run by default - shows what would be deleted, without actual deletion. 📦 Script: delete-issues.sh Full code #!/bin/bash # Delete old GitHub Issues by labels and date # Usage: ./delete-issues.sh [--execute] set -euo pipefail # === CONFIG === REPO="owner/repo" # Repository in owner/repo format LABELS='label1,label2,label3' # Labels to filter (comma-separated) CUTOFF="2025-12-31T23:59:59Z" # Delete issues created BEFORE this date DRY_RUN=true # true = preview only, false = actually delete # Parse arguments if [[ "${1:-}" == "--execute" ]]; then DRY_RUN=false echo "⚠️ Mode: ACTUAL DELETION" else echo "ℹ️ Mode: DRY RUN (nothing will be deleted)" fi echo "🔍 Searching issues in $REPO with labels: $LABELS, created before $CUTOFF" echo "---" # Fetch and filter issues gh issue list --repo "$REPO" --state all --limit 1000 \ --json number,title,createdAt,labels,url | \ jq -r --arg labels "$LABELS" --arg cutoff "$CUTOFF" ' ($labels | split(",")) as $label_array | .[] | select(.createdAt < $cutoff) | select(.labels | map(.name) | any(. as $l | $label_array | index($l))) | "\(.number)|\(.title)|\(.url)" ' | \ while IFS='|' read -r number title url; do if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY RUN] ##$number - $title" echo " $url" else echo "🗑 Deleting ##$number - $title" gh issue delete "$REPO" "$number" --yes sleep 1 # Small pause to avoid rate limits fi done echo "---" echo "✅ Done" Install dependencies # GitHub CLI # Windows (winget): winget install GitHub.cli # Linux (Ubuntu/Debian): sudo apt install gh # macOS (Homebrew): brew install gh # Authenticate gh auth login # jq (JSON processor) # Windows (winget): winget install jq.jq # Linux: sudo apt install jq # macOS: brew install jq Run # Make script executable chmod +x delete-issues.sh # DRY RUN (safe mode - preview only) ./delete-issues.sh # ACTUAL DELETION (add --execute flag) ./delete-issues.sh --execute 🔍 How it works Step-by-step breakdown Step Command What it does 1 gh issue list --json ... Fetches issues as JSON with fields: number, title, date, labels, URL 2 jq -r ... Filters: date < cutoff AND has at least one of specified labels 3 while read ... Processes each matching issue 4 gh issue delete Deletes issue (only if DRY_RUN=false) jq filter logic ($labels | split(",")) as $label_array | # Split label string into array .[] | # For each issue select(.createdAt < $cutoff) | # Only if created before cutoff select( .labels | map(.name) | # Get list of label names any(. as $l | $label_array | index($l)) # Check if any matches our labels ) | "\(.number)|\(.title)|\(.url)" # Format output Why this way: ...

17 Mar 2026 · 5 min · 880 words · Potato Energy Team, ponfertato

Docker: Scheduled Automatic Shutdown

For home servers and test environments, resource saving is important: containers can be stopped and system powered off during nights or off-hours. This guide describes a safe method with state preservation and automatic recovery. 💡 Method suits OrangePI, Raspberry Pi, old PCs, and any systems where power efficiency matters. 📦 Container shutdown script Create script # File: /usr/local/bin/stop_containers_and_shutdown.sh cat > /usr/local/bin/stop_containers_and_shutdown.sh << 'EOF' #!/bin/bash # # Script saves running container IDs, # stops them, and initiates system shutdown. # CONTAINERS_FILE="/etc/active_containers.txt" echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" echo "Starting container shutdown and system power-off script" # Get list of running containers (by ID) RUNNING_CONTAINERS=$(docker ps -q) if [ -n "${RUNNING_CONTAINERS}" ]; then echo "Saving running containers to ${CONTAINERS_FILE}" echo "${RUNNING_CONTAINERS}" > "${CONTAINERS_FILE}" docker stop ${RUNNING_CONTAINERS} echo "Containers stopped." else echo "No running containers." [ -f "${CONTAINERS_FILE}" ] && rm -f "${CONTAINERS_FILE}" fi sleep 10 echo "Shutting down system." /sbin/shutdown -h now EOF Make executable chmod +x /usr/local/bin/stop_containers_and_shutdown.sh How it works Step Description docker ps -q Gets IDs of all running containers > /etc/active_containers.txt Saves list for recovery docker stop Gracefully stops containers (SIGTERM) sleep 10 Allows time for operations to complete shutdown -h now Powers off the system Why this way: ...

17 Mar 2026 · 4 min · 848 words · Potato Energy Team, ponfertato

Docker Volumes: Backup & Migration

Docker Volumes store data independently from containers but require separate approach for backup. This guide describes universal methods for working with volumes using popular services as examples. 💡 Replace volume names with your own. Methods work with any containers. 📦 Backup volumes Via docker-volume-backup (recommended) docker run --rm \ -v portainer_data:/backup/portainer_data \ -v postgres_data:/backup/postgres_data \ -v redis_data:/backup/redis_data \ -v /opt/docker/backup:/archive \ --entrypoint backup \ offen/docker-volume-backup:v2 Parameters: Parameter Description -v <volume>:/backup/<name> Map volume to backup directory -v /opt/docker/backup:/archive Where to save archive on host --entrypoint backup Run backup mode --rm Remove container after completion Why this method: ...

16 Mar 2026 · 4 min · 665 words · Potato Energy Team, ponfertato

Git Submodules: Cheat Sheet

A submodule is a reference to another Git repository inside your project. Useful when you need to include an external library or shared code, but keep it in a separate repo. 💡 A submodule stores not the code, but a reference to a specific commit of the external repo. Add a submodule # Add a repo as a submodule to a specific path git submodule add <URL> <path/to/place> # Example git submodule add https://github.com/luizdepra/hugo-coder.git themes/hugo-coder # Commit changes git commit -m "Add submodule: themes/hugo-coder" git push After this, your project will have: ...

16 Mar 2026 · 2 min · 391 words · Potato Energy Team, ponfertato

Git: Installation & Setup

Git is a version control system. It tracks code changes, enables team collaboration, and lets you undo mistakes. 💡 Install once, use for years. Installation Windows Option 1: Official installer (recommended) Download from git-scm.com Run installer, keep defaults Important: On “Adjusting your PATH” step, select Git from the command line and also from 3rd-party software Option 2: Via Winget (PowerShell) winget install Git.Git Option 3: Via Chocolatey choco install git -y Linux Ubuntu / Debian sudo apt update sudo apt install git -y Fedora / RHEL ...

16 Mar 2026 · 3 min · 516 words · Potato Energy Team, ponfertato

GPT4Free in 2026: A complete guide to free access to GPT-5, DeepSeek and Gemini

GPT4Free (g4f) is a free tool that gives you access to powerful AI models: GPT-4/5, Claude, Gemini, DeepSeek. It works by reverse-engineering public APIs. ⚠️ Note: For educational and testing purposes only. May violate some services’ ToS. Install in 2 minutes Requirements Any computer with internet Python 3.10+ (check “Add to PATH” during install) One command pip install -U g4f[all] Done. Library is ready. Run it Option 1: Web UI (chat in your browser) python -m g4f.cli gui --port 8080 Open in browser: http://localhost:8080/chat/ ...

16 Mar 2026 · 2 min · 350 words · Potato Energy Team, ponfertato

OpenSSH on Windows: Server Setup

OpenSSH is a tool for secure remote access via the SSH protocol. It encrypts all traffic, supports key-based authentication, and works on Windows, Linux, and macOS. 💡 After setup, you can connect to your Windows PC like a Linux server: ssh user@192.168.1.100 Requirements OS: Windows 10 (1809+), Windows 11, Windows Server 2019/2022 Privileges: Administrator Network: Access to port 22 (local or remote) Installation (3 ways) Option 1: PowerShell (recommended) # Run as Administrator # Install OpenSSH server Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # Verify installation Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' Option 2: DISM (alternative) dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0 Option 3: Via Settings (GUI) Settings → Apps → Optional features “Add a feature” → find “OpenSSH Server” → Install Configure the service # Run as Administrator # Enable auto-start for sshd Set-Service -Name sshd -StartupType Automatic # Start the service Start-Service sshd # Check status Get-Service sshd # Verify port 22 is listening netstat -ano | findstr :22 Firewall # Check for OpenSSH rule Get-NetFirewallRule -Name *OpenSSH-Server* | Select Name, Enabled # If missing, create it New-NetFirewallRule -Name sshd ` -DisplayName 'OpenSSH Server' ` -Enabled True ` -Direction Inbound ` -Protocol TCP ` -LocalPort 22 ` -Action Allow ` -Profile Any Test connection # From the same PC ssh localhost # From another device on the network ssh <your_username>@<Windows_IP> # Example: ssh kirill@192.168.1.100 💡 First connection will ask to confirm the host key fingerprint - type yes. ...

16 Mar 2026 · 3 min · 483 words · Potato Energy Team, ponfertato