<?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: Tomas Pluharik</title>
    <description>The latest articles on DEV Community by Tomas Pluharik (@tpluharik).</description>
    <link>https://dev.to/tpluharik</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%2F4088464%2Ff98cd608-14f4-4bce-9eec-d5efe0ecfacf.png</url>
      <title>DEV Community: Tomas Pluharik</title>
      <link>https://dev.to/tpluharik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tpluharik"/>
    <language>en</language>
    <item>
      <title>Protecting local AI work with incremental cloud backups in TuxInDrive 0.26.57</title>
      <dc:creator>Tomas Pluharik</dc:creator>
      <pubDate>Sun, 27 Sep 2026 18:18:49 +0000</pubDate>
      <link>https://dev.to/tpluharik/protecting-local-ai-work-with-incremental-cloud-backups-in-tuxindrive-02657-4j1i</link>
      <guid>https://dev.to/tpluharik/protecting-local-ai-work-with-incremental-cloud-backups-in-tuxindrive-02657-4j1i</guid>
      <description>&lt;p&gt;AI-assisted work increasingly depends on local state that does not live in a normal project repository: conversations, prompts, memories, skills, commands, and tool configuration.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://github.com/tpluharik/Tuxindrive" rel="noopener noreferrer"&gt;TuxInDrive&lt;/a&gt;, an open-source multi-cloud synchronization client. Version 0.26.57 adds automatic cloud backups for locally installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex&lt;/li&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;li&gt;Gemini CLI&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;Continue&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;TuxInDrive detects supported local data folders and creates scheduled, upload-only jobs in a cloud account you already control. The first backup starts immediately; later runs use the normal scheduler and can be paused like other jobs.&lt;/p&gt;

&lt;p&gt;Backups are incremental. Unchanged files are not uploaded again, and the job displays its current completion percentage while running. Replaced or deleted cloud versions are retained for seven days, then older history is pruned after a successful run so storage consumption cannot grow indefinitely.&lt;/p&gt;

&lt;p&gt;If TuxInDrive closes during an upload, the job records an interrupted state. Choosing &lt;strong&gt;Sync now&lt;/strong&gt; safely continues the incremental upload and skips content already present in the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credential boundary
&lt;/h2&gt;

&lt;p&gt;These are local-file connectors, not AI-account integrations. They do not sign in to Codex, Claude, Gemini, Cursor, or Continue, and they cannot export browser-only conversation history.&lt;/p&gt;

&lt;p&gt;Known authentication files, private keys, environment files, caches, logs, sockets, locks, and temporary runtime data are excluded. Because third-party extensions may use custom secret filenames, users should still review the generated exclusions before enabling a backup.&lt;/p&gt;

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

&lt;p&gt;TuxInDrive 0.26.57 is available for Linux, Windows, macOS, and Android:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tpluharik/Tuxindrive/releases/tag/v0.26.57" rel="noopener noreferrer"&gt;Download TuxInDrive 0.26.57&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source. Feedback on additional local AI tools, exclusion rules, and restore workflows is welcome.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>How I removed polling from a Linux laptop power manager</title>
      <dc:creator>Tomas Pluharik</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:35:35 +0000</pubDate>
      <link>https://dev.to/tpluharik/how-i-removed-polling-from-a-linux-laptop-power-manager-53d6</link>
      <guid>https://dev.to/tpluharik/how-i-removed-polling-from-a-linux-laptop-power-manager-53d6</guid>
      <description>&lt;p&gt;Power-management software has an awkward requirement: it should not become part of the power problem.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/tpluharik/powersifu" rel="noopener noreferrer"&gt;PowerSifu&lt;/a&gt;, an MIT-licensed GTK tray application for Ubuntu and Debian laptops. It switches &lt;code&gt;power-profiles-daemon&lt;/code&gt; profiles when AC power changes, applies optional profile-specific brightness, runs weekly schedules, and can gracefully stop selected user applications when a profile activates.&lt;/p&gt;

&lt;p&gt;The first implementation worked, but its monitoring design was too eager. Version 0.3.5 is the result of reworking it around system events instead of repeated polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first design
&lt;/h2&gt;

&lt;p&gt;The original monitor woke every five seconds. It checked whether the laptop was on AC power, asked for the active power profile, compared the result with the saved policy, and acted if anything had changed.&lt;/p&gt;

&lt;p&gt;That approach is easy to understand and usually reliable. It is also a poor fit for a utility whose purpose is to reduce unnecessary laptop activity. Even when absolutely nothing changes, a polling loop still wakes up, performs work, and often launches helper processes.&lt;/p&gt;

&lt;p&gt;PowerSifu also used &lt;code&gt;powerprofilesctl&lt;/code&gt; repeatedly. Besides the process-launch overhead, this exposed the app to a shutdown crash in the Python-based command on a newer Ubuntu environment. Moving the operation into the long-running process solved both problems at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listening instead of asking
&lt;/h2&gt;

&lt;p&gt;Linux already has services that know when these properties change. UPower exposes the power-source state and &lt;code&gt;power-profiles-daemon&lt;/code&gt; exposes the active profile. Both are available over D-Bus.&lt;/p&gt;

&lt;p&gt;PowerSifu now creates persistent proxies for those services and subscribes to property-change notifications. A transition from AC to battery causes an immediate callback. A profile change does the same. When the laptop sits untouched, the monitor has nothing to poll.&lt;/p&gt;

&lt;p&gt;Keeping the proxies alive is important. Recreating a proxy for every read would still repeat service discovery and connection work. The current design creates the service objects once, reuses them for reads and writes, and de-duplicates notifications before applying policy.&lt;/p&gt;

&lt;p&gt;The profile write path moved to the &lt;code&gt;power-profiles-daemon&lt;/code&gt; system D-Bus interface as well. There is no repeated command-line process between the application and the service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Events still need a recovery path
&lt;/h2&gt;

&lt;p&gt;An event-driven design should not assume that every desktop session and service behaves perfectly forever. A service can restart, a signal can be missed during reconnection, or an older environment may not expose an expected notification.&lt;/p&gt;

&lt;p&gt;For that reason, PowerSifu retains a 60-second reconciliation check. This is not the primary monitor. It is a slow safety net that compares the real system state with the last observed state and repairs any discrepancy.&lt;/p&gt;

&lt;p&gt;The distinction matters: normal behavior is immediate and event-driven, while recovery remains bounded and predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedules should sleep too
&lt;/h2&gt;

&lt;p&gt;Weekly schedules originally shared the frequent monitoring loop. They only need minute-level precision, so checking every few seconds was unnecessary.&lt;/p&gt;

&lt;p&gt;The scheduler now calculates the next wall-clock minute boundary, sleeps until that boundary, and evaluates enabled entries once. If the user has not configured any schedule, the schedule timer is disabled completely.&lt;/p&gt;

&lt;p&gt;This also makes the behavior easier to test. The tests can verify alignment, once-per-minute execution, and the no-schedule sleep state independently from AC and profile events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brightness without fighting the desktop
&lt;/h2&gt;

&lt;p&gt;Profile-specific brightness presented a different problem. Writing directly to a backlight device can change the panel while leaving GNOME's Quick Settings slider at its old position. That gives the user two conflicting views of the same setting.&lt;/p&gt;

&lt;p&gt;On GNOME, PowerSifu therefore changes the desktop's own global brightness control and keeps the visible slider synchronized. Mutter and &lt;code&gt;brightnessctl&lt;/code&gt; remain fallbacks for environments where that route is unavailable. External monitors are left to their own controls because they often require DDC/CI or vendor-specific handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the security boundary small
&lt;/h2&gt;

&lt;p&gt;PowerSifu does not install a custom privileged daemon. Profile and brightness changes use the desktop and existing system services. Installing an official update is the one action that requests operating-system authentication. Before that request, the app verifies the download size and SHA-256 digest along with the Debian package name, version, and architecture.&lt;/p&gt;

&lt;p&gt;Application rules are intentionally limited. They accept exact process names, match only processes owned by the current user, and send &lt;code&gt;SIGTERM&lt;/code&gt; so the application can exit cleanly. There is no arbitrary command field and no root-process termination.&lt;/p&gt;

&lt;p&gt;The app has no account, analytics, or telemetry. The update checker contacts the official GitHub Releases API only when the user selects &lt;strong&gt;Check for updates&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 0.3.5
&lt;/h2&gt;

&lt;p&gt;The practical changes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UPower and profile property events replace the five-second polling loop.&lt;/li&gt;
&lt;li&gt;Persistent D-Bus proxies are reused for profile reads and writes.&lt;/li&gt;
&lt;li&gt;Duplicate notifications are filtered before policy is applied.&lt;/li&gt;
&lt;li&gt;A 60-second reconciliation check covers missed or unavailable signals.&lt;/li&gt;
&lt;li&gt;Schedule checks align to minute boundaries and stop when unused.&lt;/li&gt;
&lt;li&gt;Regression tests cover proxy reuse, event de-duplication, and schedule timing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am deliberately not claiming a universal battery-life percentage. That depends heavily on the laptop, kernel, desktop, workload, and existing services. The engineering goal here was narrower and measurable in the design: eliminate repeated subprocesses and unnecessary five-second wakeups while preserving fast reactions and recovery.&lt;/p&gt;

&lt;p&gt;PowerSifu 0.3.5 is available as a standalone &lt;code&gt;.deb&lt;/code&gt;, with source, tests, architecture notes, and release documentation on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tpluharik/powersifu" rel="noopener noreferrer"&gt;Project repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tpluharik/powersifu/releases/latest" rel="noopener noreferrer"&gt;Latest release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would appreciate reports from different Ubuntu and Debian versions, laptop models, and desktop environments. I am also interested in feedback about packaging for distributions beyond the current &lt;code&gt;.deb&lt;/code&gt; target.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>python</category>
      <category>performance</category>
    </item>
    <item>
      <title>TuxInDrive: sincronização multicloud open source com foco em Linux</title>
      <dc:creator>Tomas Pluharik</dc:creator>
      <pubDate>Thu, 27 Aug 2026 13:45:36 +0000</pubDate>
      <link>https://dev.to/tpluharik/tuxindrive-sincronizacao-multicloud-open-source-com-foco-em-linux-ngf</link>
      <guid>https://dev.to/tpluharik/tuxindrive-sincronizacao-multicloud-open-source-com-foco-em-linux-ngf</guid>
      <description>&lt;p&gt;Olá! Sou o desenvolvedor do &lt;strong&gt;TuxInDrive&lt;/strong&gt;, um cliente gráfico de sincronização multicloud de código aberto, pensado primeiro para Linux.&lt;/p&gt;

&lt;p&gt;A proposta é reunir em uma única interface recursos que normalmente exigem várias ferramentas ou configuração manual:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sincronização bidirecional e seletiva;&lt;/li&gt;
&lt;li&gt;arquivos sob demanda;&lt;/li&gt;
&lt;li&gt;histórico de versões e tratamento de conflitos;&lt;/li&gt;
&lt;li&gt;busca e pré-visualização de arquivos sincronizados;&lt;/li&gt;
&lt;li&gt;controle global de largura de banda;&lt;/li&gt;
&lt;li&gt;suporte a diferentes serviços de nuvem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O projeto continua em desenvolvimento ativo. Estou procurando pessoas interessadas em testar diferentes distribuições e provedores de nuvem, além de colaboradores para código, documentação e traduções.&lt;/p&gt;

&lt;p&gt;Projeto, documentação e downloads: &lt;a href="https://github.com/tpluharik/Tuxindrive" rel="noopener noreferrer"&gt;github.com/tpluharik/Tuxindrive&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback sobre confiabilidade, experiência de uso e empacotamento para Linux é especialmente bem-vindo.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Transparência: sou o desenvolvedor do projeto.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>linux</category>
      <category>productivity</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>TuxInDrive 0.26.30: a visual comparison of Linux sync alternatives</title>
      <dc:creator>Tomas Pluharik</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:22:41 +0000</pubDate>
      <link>https://dev.to/tpluharik/tuxindrive-02630-a-visual-comparison-of-linux-sync-alternatives-28nk</link>
      <guid>https://dev.to/tpluharik/tuxindrive-02630-a-visual-comparison-of-linux-sync-alternatives-28nk</guid>
      <description>&lt;p&gt;I am the maintainer of &lt;a href="https://github.com/tpluharik/TuxInDrive" rel="noopener noreferrer"&gt;TuxInDrive&lt;/a&gt;, an MIT-licensed, Linux-first multi-cloud synchronization client. I made this comparison to show where the project fits among provider clients, command-line tools, self-hosted platforms and peer-sync applications.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uvzhvynzjxug6kan2fe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uvzhvynzjxug6kan2fe.png" alt="TuxInDrive competitive matrix" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another sync client?
&lt;/h2&gt;

&lt;p&gt;Linux users often have to combine several tools: one for cloud accounts, another for files-on-demand, scripts for safety checks, and a separate peer-sync application. TuxInDrive aims to put these workflows behind one interface while retaining explicit safety controls.&lt;/p&gt;

&lt;p&gt;Version 0.26.30 includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Drive, OneDrive, Dropbox, Box, pCloud, MEGA, Proton Drive, Nextcloud, S3, WebDAV, SFTP and GitHub support&lt;/li&gt;
&lt;li&gt;two-way, upload-only and download-only synchronization&lt;/li&gt;
&lt;li&gt;files-on-demand with offline pinning&lt;/li&gt;
&lt;li&gt;selective rules by path, extension, size and age&lt;/li&gt;
&lt;li&gt;a pre-transfer change preview and mass-change protection&lt;/li&gt;
&lt;li&gt;local version history, recovery and visual conflict resolution&lt;/li&gt;
&lt;li&gt;one global bandwidth controller shared by sync, streaming, scans and updates&lt;/li&gt;
&lt;li&gt;owner-approved LAN and encrypted peer collaboration&lt;/li&gt;
&lt;li&gt;Linux, Windows, macOS and Android builds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to read the matrix
&lt;/h2&gt;

&lt;p&gt;The matrix is not a performance benchmark. A green mark means the capability is documented and generally available. Amber means it is limited to certain platforms, providers or command-line workflows. Red means I could not verify the capability in the regular product.&lt;/p&gt;

&lt;p&gt;The sources are the official documentation for each project. If a rating is outdated or too strict, please open an issue with the relevant documentation link and I will correct it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it or help improve it
&lt;/h2&gt;

&lt;p&gt;The project is still looking for testers across different providers and operating systems. Bug reports, documentation corrections, security review and code contributions are welcome.&lt;/p&gt;

&lt;p&gt;Repository and downloads: &lt;a href="https://github.com/tpluharik/TuxInDrive" rel="noopener noreferrer"&gt;github.com/tpluharik/TuxInDrive&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>linux</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I built TuxInDrive: one open-source sync client for multiple clouds</title>
      <dc:creator>Tomas Pluharik</dc:creator>
      <pubDate>Fri, 21 Aug 2026 14:38:35 +0000</pubDate>
      <link>https://dev.to/tpluharik/why-i-built-tuxindrive-one-open-source-sync-client-for-multiple-clouds-2cnp</link>
      <guid>https://dev.to/tpluharik/why-i-built-tuxindrive-one-open-source-sync-client-for-multiple-clouds-2cnp</guid>
      <description>&lt;p&gt;Linux cloud synchronization is still surprisingly fragmented. One provider may have a native client, another needs a command-line tool, and a third requires a collection of scripts.&lt;/p&gt;

&lt;p&gt;I started &lt;strong&gt;TuxInDrive&lt;/strong&gt; to provide one interface for managing several cloud services while keeping Linux as a first-class platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it supports
&lt;/h2&gt;

&lt;p&gt;TuxInDrive currently works with Google Drive, Microsoft OneDrive, Dropbox, Box, pCloud, MEGA, Proton Drive, Nextcloud and GitHub repositories.&lt;/p&gt;

&lt;p&gt;Depending on the provider, it offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-way and two-way synchronization&lt;/li&gt;
&lt;li&gt;Files-on-demand&lt;/li&gt;
&lt;li&gt;Conflict handling and version recovery&lt;/li&gt;
&lt;li&gt;Safety previews before potentially destructive operations&lt;/li&gt;
&lt;li&gt;Integrity verification&lt;/li&gt;
&lt;li&gt;Global bandwidth and network controls&lt;/li&gt;
&lt;li&gt;Encrypted peer sharing&lt;/li&gt;
&lt;li&gt;An optional self-hosted coordination server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Linux is the primary platform. Builds are also available for Windows, macOS and Android.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I need help
&lt;/h2&gt;

&lt;p&gt;The project is usable, but still young. I would especially appreciate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing with different providers and distributions&lt;/li&gt;
&lt;li&gt;Reproducible bug reports&lt;/li&gt;
&lt;li&gt;Feedback on installation and documentation&lt;/li&gt;
&lt;li&gt;Security and networking reviews&lt;/li&gt;
&lt;li&gt;UI and accessibility feedback&lt;/li&gt;
&lt;li&gt;Code contributions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please begin with non-critical test data and maintain an independent backup while evaluating synchronization software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development transparency
&lt;/h2&gt;

&lt;p&gt;AI coding assistants have been used during development. Architecture and release decisions are reviewed by the maintainer, and automated tests are run before releases. Contributions and independent review are welcome.&lt;/p&gt;

&lt;p&gt;Repository, documentation and releases:&lt;/p&gt;

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

</description>
      <category>showdev</category>
      <category>linux</category>
      <category>opensource</category>
      <category>contributorswanted</category>
    </item>
  </channel>
</rss>
