<!DOCTYPE html>
<html lang="en-us">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <title>semicomplete</title>
  <meta property="og:title" content="semicomplete" />
  <meta name="twitter:title" content="semicomplete" />
  <meta name="author" content="Jordan Sissel"/>
  <meta property="og:site_name" content="semicomplete" />
  <meta property="og:url" content="https://semicomplete.com/" />
  <meta property="og:type" content="website" />
  <meta name="twitter:card" content="summary" />
  <meta name="generator" content="Hugo 0.142.0">
  <link href="/index.xml" rel="alternate" type="application/rss+xml" title="semicomplete" />
  <link href="/index.xml" rel="feed" type="application/rss+xml" title="semicomplete" />

  <link rel="stylesheet" href="/css/style.css" media="all" />
  <link rel="stylesheet" href="/css/syntax.css" media="all" />
  <link rel="stylesheet" href="/css/custom.css" media="all" />

  <script src="/js/script.js"></script>
  <script src="/js/custom.js"></script>
  <script defer src="/js/fontawesome.js"></script>
</head>

<body>

<header class="site-header">
  <nav class="site-navi">
    <h1 class="site-title"><a href="/">semicomplete</a></h1>
    <ul class="site-navi-items">
      <li class="site-navi-item-categories"><a href="/categories/" title="Categories">Categories</a></li>
      <li class="site-navi-item-tags"><a href="/tags/" title="Tags">Tags</a></li>
      <li class="site-navi-item-archives"><a href="/archives/" title="Archives">Archives</a></li>
      <li class="site-navi-item-about"><a href="/about/" title="About">About</a></li>
    </ul>
  </nav>
</header>
<hr class="site-header-bottom">

  <div class="main" role="main">
    <section class="list home-list">
      <article class="article">
        <a href="/blog/xdotool-and-exploring-wayland-fragmentation/" class="article-titles">
          <h2 class="article-title">Exploring the Fragmentation of Wayland, an xdotool adventure</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>15 November, 2025</time></li>
        </ul>
        <div class="article-content">
          <p>In 2007, I was spending a my norther-hemisphere summer experimenting with UI automation. Born of those efforts, xdotool came into being when <a href="https://github.com/jordansissel/xdotool/commit/ccae4e3b75551608dde6ba3b9e2aa0264f7a4ac5">I separated it from another project</a>. The goal was modest - write some scripts that execute common keyboard, mouse, and window management tasks.</p>
<p>The first commit had only a few basic commands - basic mouse and keyboard actions, plus a few window management actions like movement, focus, and searching. Xdotool sprouted new features as time rolled on. Today, the project is 18 years old, and still going!</p>
        </div>
        <div class="article-readmore"><a href="/blog/xdotool-and-exploring-wayland-fragmentation/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/in-which-lastpass-gifts-us-a-sisyphean-task/" class="article-titles">
          <h2 class="article-title">In which LastPass gifts us a Sisyphean task</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>4 February, 2023</time></li>
        </ul>
        <div class="article-content">
          <p>With recent news of LastPass having a <a href="https://techcrunch.com/2022/12/22/lastpass-customer-password-vaults-stolen/">significant security breach and also handling the public response poorly</a>, there&rsquo;s been <a href="https://www.wired.com/story/lastpass-breach-vaults-password-managers/">calls to ditch LastPass</a>.</p>
<p>From LastPass&rsquo; <a href="https://blog.lastpass.com/2022/12/notice-of-recent-security-incident/">blog post</a>:</p>
<blockquote>
<p>The threat actor was also able to copy a backup of customer vault data from the encrypted storage container</p>
</blockquote>
<p>This is encouragement to migrate. Bitwarden and 1Password seem like reasonable alternatives, at least for now, until fate comes for them as well.</p>
<p>Because the LastPass breach creates a threat that customer password vaults were copied, it means that any migration isn&rsquo;t complete without changing passwords.</p>
        </div>
        <div class="article-readmore"><a href="/blog/in-which-lastpass-gifts-us-a-sisyphean-task/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/instead-of-npm-install-global/" class="article-titles">
          <h2 class="article-title">Instead of `npm install -g`...</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>9 December, 2022</time></li>
        </ul>
        <div class="article-content">
          <p>We have some Sonos speakers at home, and I&rsquo;d like my kids to be able to choose music when/where they like. The iOS Sonos app is somewhat labyrinthian, so I think, can I make a simple version of this? I figured a simple-ish web interface with buttons for their favorite albums and playlists. Could be fun?</p>
<p>I&rsquo;ve been doing light web development since the late 90s, and I love learning new stuff, so I&rsquo;ll pick something newer to use. With my eager eyes set on a goal to make a silly web app, I began reading through the <a href="https://ionicframework.com/docs/vue/your-first-app">Ionic+Vue tutorial</a>. Then I got very delayed by a small side quest. Hello! With ADHD, side quests are my entire life. :)</p>
        </div>
        <div class="article-readmore"><a href="/blog/instead-of-npm-install-global/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/geekery/finding-changes-since-last-release/" class="article-titles">
          <h2 class="article-title">GitHub: Finding changes since last release</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>9 November, 2022</time></li>
          <li class="article-meta-tags">
            <a href="/tags/project-management/">
              <i class="fas fa-tag"></i>
              project management
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/github/">
              <i class="fas fa-tag"></i>
              github
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <h1 id="time-for-release">Time for release!</h1>
<p>It&rsquo;s an exciting time. Or, it should be. I want to do a release of fpm! However, there&rsquo;s some preparation I need to do before I can publish.</p>
<p>I need to make sure the changelog file is updated and accurate, and that means I need to know all of the changes made since the previous release. I don&rsquo;t mean the code changes, though. I mean what behaviors were changed? Who contributed to the change? Is a given change related to one or more open issues?</p>
        </div>
        <div class="article-readmore"><a href="/blog/geekery/finding-changes-since-last-release/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/migrating-flickr-to-smugmug/" class="article-titles">
          <h2 class="article-title">Moving from Flickr to SmugMug</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>10 May, 2022</time></li>
          <li class="article-meta-categories">
            <a href="/categories/hacks/">
              <i class="fas fa-folder"></i>
              hacks
            </a>&nbsp;
          </li>
          <li class="article-meta-categories">
            <a href="/categories/photography/">
              <i class="fas fa-folder"></i>
              photography
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/smugmug/">
              <i class="fas fa-tag"></i>
              smugmug
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/flickr/">
              <i class="fas fa-tag"></i>
              flickr
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/json/">
              <i class="fas fa-tag"></i>
              json
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/photography/">
              <i class="fas fa-tag"></i>
              photography
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <p>[ This post is a work in progress as I work towards solutions ]</p>
<p>I received an email from Flickr on May 9.</p>
<blockquote>
<p>Subject: Your Flickr account is in violation of our free account limits.</p>
<p>You have more than 50 non-public photos on your free account.</p>
</blockquote>
<p>They gave me 8 days to resolve it &ndash; with the threat of deleting photos.
It&rsquo;s been a long time since I&rsquo;ve used Flickr, but I don&rsquo;t want to lose the content I had uploaded.</p>
        </div>
        <div class="article-readmore"><a href="/blog/migrating-flickr-to-smugmug/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/geekery/genie-gps1200ic-home-assistant/" class="article-titles">
          <h2 class="article-title">Genie GPS1200IC automation with ESP8266</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>3 May, 2021</time></li>
          <li class="article-meta-categories">
            <a href="/categories/home-automation/">
              <i class="fas fa-folder"></i>
              home automation
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/esphome/">
              <i class="fas fa-tag"></i>
              esphome
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/esp8266/">
              <i class="fas fa-tag"></i>
              esp8266
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <p>My garage has two doors. I&rsquo;d like to be able to say &ldquo;Open the garage door&rdquo; to Siri.</p>
<p>To get there, I&rsquo;m going to try using Home Assistant and ESPHome.
First, though, I need to know how to tell the garage door to operate.</p>
<p>Both door openers are Genie GPS1200IC. Based on some brief research, these appear to have been made between 1996-2000.</p>
<h2 id="hack-a-remote">Hack a remote?</h2>
<p>My first attempt was to buy a remote and hook a microcontroller to it.
I bought a Genie GITR-3 remote. This remote has 3 buttons.
The plan was to wire an ESP8266 to the buttons of this remote.</p>
        </div>
        <div class="article-readmore"><a href="/blog/geekery/genie-gps1200ic-home-assistant/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/home-office-automation/" class="article-titles">
          <h2 class="article-title">Home Office Automation</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>14 April, 2018</time></li>
        </ul>
        <div class="article-content">
          <p>I built a little digital Rube-Goldberg device for my office. When I turn my desk power switch on, a little microcontroller brings my workstation and stereo online.</p>
<p>My desk has a keyboard and monitor, but no computer. The computer lives in the closet a few feet away. Also in this closet is my stereo which drives audio to for the office. This makes my desk cleaner and quieter, but makes it hard to hit the power buttons.</p>
        </div>
        <div class="article-readmore"><a href="/blog/home-office-automation/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/projects/xdotool/" class="article-titles">
          <h2 class="article-title"> xdotool  -  fake keyboard/mouse input, window management, and more 
</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>24 April, 2015</time></li>
          <li class="article-meta-categories">
            <a href="/categories/projects/">
              <i class="fas fa-folder"></i>
              projects
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <h1 id="what-is-xdotool">What is xdotool?</h1>
<p>This tool lets you simulate keyboard input and mouse activity, move and
resize windows, etc. It does this using X11&rsquo;s XTEST extension and other
Xlib functions.</p>
<p>Additionally, you can search for windows and move, resize, hide, and modify
window properties like the title. If your window manager supports it, you
can use xdotool to switch desktops, move windows between desktops, and
change the number of
desktops.</p>
<h1 id="mailing-list">Mailing List</h1>
<p>The xdotool users mailing list is: <a href="mailto:xdotool-users@googlegroups.com"><a href="mailto:xdotool-users@googlegroups.com">xdotool-users@googlegroups.com</a></a></p>
        </div>
        <div class="article-readmore"><a href="/projects/xdotool/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/growing-logstash-value/" class="article-titles">
          <h2 class="article-title">Growing logstash&#39;s value</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>29 July, 2012</time></li>
          <li class="article-meta-tags">
            <a href="/tags/logstash/">
              <i class="fas fa-tag"></i>
              logstash
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <p>I spent a while today thinking about nerdy stuff - logstash, etc. I want to
grow logstash in terms of performance, use case, deployment instances, happy
users, and community.</p>
<p>While musing about on my mental roadmap of logstash, I found most things boil
down to costs and returns on investment, even with open source software.
Money, time, energy, and patience are all costs. Just because something
doesn&rsquo;t cost any money doesn&rsquo;t mean it won&rsquo;t consume any time or energy.</p>
        </div>
        <div class="article-readmore"><a href="/blog/growing-logstash-value/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
      <article class="article">
        <a href="/blog/geekery/puppet-nodeless-configuration/" class="article-titles">
          <h2 class="article-title">Puppet &#34;pure fact-driven&#34; nodeless configuration
</h2>
          
        </a>
        <ul class="article-meta">
          <li class="article-meta-date"><time>27 November, 2010</time></li>
          <li class="article-meta-categories">
            <a href="/categories/old/">
              <i class="fas fa-folder"></i>
              old
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/puppet/">
              <i class="fas fa-tag"></i>
              puppet
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/nodeless/">
              <i class="fas fa-tag"></i>
              nodeless
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/nodes/">
              <i class="fas fa-tag"></i>
              nodes
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/classifier/">
              <i class="fas fa-tag"></i>
              classifier
            </a>&nbsp;
          </li>
          <li class="article-meta-tags">
            <a href="/tags/truth/">
              <i class="fas fa-tag"></i>
              truth
            </a>&nbsp;
          </li>
        </ul>
        <div class="article-content">
          <p>Truth should guide your configuration management tools.</p>
<p>Truth in this case is: what machines you have, properties of those machines,
roles for those machines, etc. For example &ldquo;foo-1.a.example.com is a webserver&rdquo;
is a piece of truth. Where and how you store truth is up to you and out of
scope for this post.</p>
<p>My goal is to have truth steer everything about my infrastructure. Roles, jobs,
and even long-term one-offs get put into the truth source (like a machine role,
etc). That way, if the machine with a one-off dies, I can just add that
machine role to another system and puppet will configure it - no pain and no
fire to fight.</p>
        </div>
        <div class="article-readmore"><a href="/blog/geekery/puppet-nodeless-configuration/">Read more...</a></div>
        <div class="article-floatclear"></div>
      </article>
    </section>
    
    <ul class="pagination pagination-default">
      <li class="page-item disabled">
        <a aria-disabled="true" aria-label="First" class="page-link" role="button" tabindex="-1"><span aria-hidden="true">&laquo;&laquo;</span></a>
      </li>
      <li class="page-item disabled">
        <a aria-disabled="true" aria-label="Previous" class="page-link" role="button" tabindex="-1"><span aria-hidden="true">&laquo;</span></a>
      </li>
      <li class="page-item active">
        <a aria-current="page" aria-label="Page 1" class="page-link" role="button">1</a>
      </li>
      <li class="page-item">
        <a href="/page/2/" aria-label="Page 2" class="page-link" role="button">2</a>
      </li>
      <li class="page-item">
        <a href="/page/2/" aria-label="Next" class="page-link" role="button"><span aria-hidden="true">&raquo;</span></a>
      </li>
      <li class="page-item">
        <a href="/page/2/" aria-label="Last" class="page-link" role="button"><span aria-hidden="true">&raquo;&raquo;</span></a>
      </li>
    </ul>
  </div>



<div class="site-footer">
  <div class="copyright">&copy; Copyright 2006-2022 Jordan Sissel - Content licensed as <a href='https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode'>CC BY-NC-SA</a></div>
  <ul class="site-footer-items">
    <li class="site-footer-item-rsslink">
      <a href="/index.xml" type="application/rss+xml" target="_blank" title="RSS">
        <i class="fas fa-rss"></i>
      </a>
    </li>
    <li class="site-footer-item-about"><a href="/about/" title="About">About</a></li>
  </ul>
  <div class="powerdby">
    Powered by <a href="https://gohugo.io/">Hugo</a> and <a href="https://github.com/taikii/whiteplain">Whiteplain</a>
  </div>
</div>


</body>
</html>
