<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Scott Evans</title>
        <link>https://scott.ee</link>
        <description>Product designer and creative technologist</description>
        <lastBuildDate>Thu, 23 Nov 2023 19:58:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>nuxt.js</generator>
        <image>
            <title>Scott Evans</title>
            <url>https://scott.ee/og-card.png</url>
            <link>https://scott.ee</link>
        </image>
        <atom:link href="https://scott.ee/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[The Fediverse From Home]]></title>
            <link>https://scott.ee/project/self-hosting-the-fediverse</link>
            <guid>https://scott.ee/project/self-hosting-the-fediverse</guid>
            <pubDate>Thu, 10 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Host your own fediverse (Mastodon) server from your home Internet connection. Made possible with GotToSocial and Cloudflare.]]></description>
            <content:encoded><![CDATA[<p>This project details how I setup my self hosted <a href="https://en.wikipedia.org/wiki/Fediverse" rel="nofollow noopener noreferrer" target="_blank">Fediverse server</a> and connected it to the outside world from my home network. I will cover the why, my technology choices and some of the more technical details but won't give you too much of an onboarding as to what the Fediverse is and how it works. There are plenty of <a href="https://fediverse.party/en/fediverse/" rel="nofollow noopener noreferrer" target="_blank">great</a> <a href="https://axbom.com/fediverse/" rel="nofollow noopener noreferrer" target="_blank">sites</a> <a href="https://docs.joinmastodon.org/" rel="nofollow noopener noreferrer" target="_blank">that cover</a> <a href="https://gist.github.com/joyeusenoelle/74f6e6c0f349651349a0df9ae4582969" rel="nofollow noopener noreferrer" target="_blank">that already</a>.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/fediverse.jpg?w=1600&amp;strip=info" alt="Abstract low angle photo of intersecting metal cables. Used to signify a network" class="rss-image"></figure><h2 id="the-philosophy"><a href="#the-philosophy" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The philosophy</h2><p>The first choice you need to make is if you want to self host or not. Back in the early web days it was easier to trust platforms. Early Google provided advert free search and free to use email. Early Twitter made easy to connect with friends and communities, following a simple timeline of updates. These companies were focused on making a good product with real value.</p><p>As time went by the pressure for these businesses to turn a profit and please investors/shareholders led to a break of that trust. Advertising became more invasive, algorithms were created to manipulate your attention, conversation became divisive and a lack of sensible policy allowed hate speech and disinformation to spread. On Twitter you have probably witnessed your friends and family get quieter and quieter as they felt less comfortable in their surroundings. I certainly have.</p><p>As <a href="https://twitter.com/elonmusk/status/1589390597798125568" rel="nofollow noopener noreferrer" target="_blank">Elon is demonstrating</a>; sensible, fair and considered policy is hard. With each and every poor decision he is making, the Fediverse (and <a href="https://joinmastodon.org/" rel="nofollow noopener noreferrer" target="_blank">Mastodon</a> in particular) is seeing huge growth. The easiest way to get started is to jump on an existing server (owned by someone else), but to do so without considering the consequences of that choice is a mistake.</p><p>Once again you have to place your trust in a third party. Most server admins look fairly sane but as a history has shown us... things change. They may struggle with costs, moderation or pigeon hole you into discussing just a certain topic. This upheaval from Twitter is an opportunity to own your thoughts, on your own domain and on your own terms. A little extra effort now is worth the investment.</p><p>The strength of the Fediverse is decentralisation. No single server is any more important than another. If you come across a particularly nasty server, you (or your server admin) can stop your instance federating with it. Decentralisation makes the platform both easier to moderate and less prone to censorship. By running your own instance you gain that control, but when you are a guest on someone else's instance, it is their choice. What happens when two large instances decide to block each other?</p><p>By running your own server you will avoid these concerns and help strengthen the network for everyone.</p><h2 id="the-software"><a href="#the-software" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The software</h2><p>When I first looked at setting up a Fediverse server I naturally gravitated towards <a href="https://joinmastodon.org/" rel="nofollow noopener noreferrer" target="_blank">Mastodon</a>. It is by far the most popular and polished software, but it also has fairly demanding requirements. I wanted to start small with something I could easily host on a Rasbperry Pi (or low powered PC) from my home network.</p><p>Since setting up my <a href="/project/solar-hosting-raspberry-pi/">solar hosting project</a> I have grown very fond of the freedom that self hosting provides. It's nice to know where my electricity comes from and who has access to my servers and data (that will be me!).</p><p>I discovered a young project called <a href="https://github.com/superseriousbusiness/gotosocial" rel="nofollow noopener noreferrer" target="_blank">GoToSocial</a> (GtS) that is written in <a href="https://go.dev/" rel="nofollow noopener noreferrer" target="_blank">Go</a> and currently in alpha. It fits the requirement for something light and efficient:</p><blockquote><p>A single-user instance with about 100 followers/followees uses somewhere between 50 to 100MB of RAM. CPU usage is only intensive when handling media or processing lots of federation requests.</p><figcaption>— <cite><a href="https://docs.gotosocial.org/en/latest/installation_guide/" rel="nofollow noopener noreferrer" target="_blank">GoToSocial Docs</a></cite></figcaption></blockquote><p>GtS provide a <a href="https://docs.gotosocial.org/en/latest/installation_guide/docker/" rel="nofollow noopener noreferrer" target="_blank">multi-architecture Docker container</a> which is my preferred way to setup my <a href="/project/the-perfect-pi/">self-hosted services</a>.</p><p>To expose GtS to the web I am using <a href="https://www.cloudflare.com/en-gb/products/tunnel/" rel="nofollow noopener noreferrer" target="_blank">Cloudflare tunnels</a>. This means I do not need to open ports on my router and I get a little extra security from the Cloudflare network. Exposing alpha software to the web from my home network probably isn't that smart, so I appreciate Cloudflare's additional layer of protection. I also created a private Docker network for GtS so the container doesn't have access to my local network either. Running it this way (via Docker) keeps the code and network securely isolated.</p><p>You can use the <code>docker-compose.yaml</code> below to mirror my setup. You'll need to make sure <a href="https://developers.cloudflare.com/fundamentals/get-started/setup/" rel="nofollow noopener noreferrer" target="_blank">your domain is running via Cloudflare</a> and ensure that you have setup your tunnel in <a href="https://one.dash.cloudflare.com/" rel="nofollow noopener noreferrer" target="_blank">Cloudflare's Zero Trust control panel</a>. Then add your Cloudflare token (<code>export CF_FEDIVERSE_TOKEN=SECRET</code>) to your <code>.bashrc</code> so its available when running <code>docker-compose up</code>.</p><div class="nuxt-content-highlight"><pre class="language-text line-numbers"><code>version: "3.3"

services:
  gotosocial:
    image: superseriousbusiness/gotosocial:0.5.2
    container_name: gotosocial
    hostname: gotosocial
    env_file: ./.settings.env
    restart: always
    volumes:
      - ./data/db:/gotosocial/storage
    networks:
      fediverse:
        ipv4_address: 172.5.1.2

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    hostname: cloudflared
    command: tunnel --no-autoupdate run --token ${CF_FEDIVERSE_TOKEN}
    restart: always
    depends_on:
      - gotosocial
    networks:
      fediverse:
        ipv4_address: 172.5.1.3

  networks:
    fediverse:
      driver: bridge
      ipam:
        driver: default
        config:
          - subnet: 172.5.1.0/16
            gateway: 172.5.1.1
</code></pre></div><p>You will also need a <code>.settings.env</code> file in the same directory as the <code>docker-compose.yaml</code> above. This file contains your desired settings for GtS. I set the following options:</p><div class="nuxt-content-highlight"><pre class="language-text line-numbers"><code>GTS_HOST=toot.scott.ee
GTS_PORT=8080
GTS_APPLICATION_NAME=Scott
GTS_ACCOUNTS_ALLOW_CUSTOM_CSS=true

GTS_ACCOUNTS_REGISTRATION_OPEN=false
GTS_ACCOUNTS_REASON_REQUIRED=false
GTS_MEDIA_IMAGE_MAX_SIZE=10485760
GTS_STATUSES_MAX_CHARS=1000

GTS_DB_TYPE=sqlite
GTS_DB_ADDRESS=/gotosocial/storage/sqlite.db
GTS_LETSENCRYPT_ENABLED=false
</code></pre></div><p>This ensures the service is running from the correct domain and port. I also disable registration (this instance is just for me) and customise the post length and image size variables. I disable Let's Encrypt as the Cloudflare tunnel is encrypted and they handle SSL for you. A full list of available options can be found in the <a href="https://docs.gotosocial.org/en/latest/configuration/" rel="nofollow noopener noreferrer" target="_blank">documentation for GoToSocial</a>.</p><p>Creating your first user with a Docker hosted instance of GtS is a bit of a pain. Luckily it is <a href="https://docs.gotosocial.org/en/latest/installation_guide/docker/#create-your-first-user" rel="nofollow noopener noreferrer" target="_blank">well documented</a> with command line instructions you can copy and paste into your terminal. Once your user is created, make a note of the login credentials in your password manager.</p><p>Unlike Mastodon, GtS doesn't provide a front end/client experience. It is just a Fediverse compatible server (at least for now). That means you need to bring your own client. For the web they recommend <a href="https://github.com/nolanlawson/pinafore" rel="nofollow noopener noreferrer" target="_blank">Pinafore</a>, and for mobile <a href="https://tusky.app/" rel="nofollow noopener noreferrer" target="_blank">Tusky</a>. Both are open source and a pleasure to use. There are many more clients though and pretty much any of the <a href="https://joinmastodon.org/apps" rel="nofollow noopener noreferrer" target="_blank">Mastodon compatible clients</a> will work with GtS too. You can also use tools like <a href="https://crossposter.masto.donte.com.br/" rel="nofollow noopener noreferrer" target="_blank">Crossposter</a> to relay your tweets and toots in either direction. When setting up your client, you need to enter the URL of your server (toot.scott.ee in my case) and sign in using your username and password.</p><p>For administering your GtS server there is an admin settings section available at <code>example.com/admin</code> and user settings can be found at <code>example.com/user</code> — this includes custom CSS if you want to give your profile a lick of paint.</p><h2 id="wrapping-up"><a href="#wrapping-up" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Wrapping up</h2><p>I appreciate this guide is a little light in places so if you have any questions let me know (links in the footer). I also appreciate that self hosting isn't for everyone... however I do think it gets us closer to the type of Web that we want (and once had). What would the web look like if every home had a server and a decent internet connection?</p><p>The Fediverse is just one option for decentralised socialising. There are some very interesting projects that you may also find easier to get started with: <a href="https://scuttlebutt.nz/" rel="nofollow noopener noreferrer" target="_blank">Secure Scuttlebutt</a> - via <a href="https://www.manyver.se/" rel="nofollow noopener noreferrer" target="_blank">Manyverse</a> / <a href="https://www.planetary.social/" rel="nofollow noopener noreferrer" target="_blank">Planetary</a>, <a href="https://matrix.org/" rel="nofollow noopener noreferrer" target="_blank">Matrix</a> via <a href="https://element.io/get-started" rel="nofollow noopener noreferrer" target="_blank">Element</a>, <a href="https://github.com/nostr-protocol/nostr" rel="nofollow noopener noreferrer" target="_blank">nostr</a> (which I haven't got my head around yet) and <a href="/project/rss/">good old RSS</a> with blogs and commenting and all that great stuff.</p>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/fediverse.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[RSS Again]]></title>
            <link>https://scott.ee/project/rss</link>
            <guid>https://scott.ee/project/rss</guid>
            <pubDate>Sat, 12 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Using RSS in 2023 to keep up with your favourite sites and social networks. Made possible with Miniflux and other open source software.]]></description>
            <content:encoded><![CDATA[<p>I think the Internet is still mourning the closure of <a href="https://en.wikipedia.org/wiki/Google_Reader" rel="nofollow noopener noreferrer" target="_blank">Google Reader</a>. Google likes to shut things down, but Google Reader was well loved and well used. It didn't and still doesn't make sense.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/rss.jpg?w=1600&amp;strip=info" alt="Rows upon rows of books on shelves at the Stockholm Public Library" class="rss-image"></figure><p>I often wonder how much that one decision impacted digital life. It took a huge number of eyeballs away from blogs and pushed people towards social media. Now we all spend far too much time exposed to the algorithmic nightmare fuel that continues to mess with our minds and society.</p><p><a href="https://en.wikipedia.org/wiki/RSS" rel="nofollow noopener noreferrer" target="_blank">RSS</a> didn't die, it just went underground, and we can get it back to the good old days with a few open source tools. I have been tinkering with this setup on and off for a few years and it has been working really well. For a small time investment you get the benefit of fresh, interesting content that you choose to follow. No timelines, no ads, no tracking.</p><h2 id="miniflux"><a href="#miniflux" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Miniflux</h2><p>At the centre of it all sits <a href="https://miniflux.app/" rel="nofollow noopener noreferrer" target="_blank">Miniflux</a>. Miniflux describes itself as a minimalist and opinionated feed reader, but I think it is much more than that. It acts as an RSS server. It is also easy to install on low cost hardware like the <a href="/project/the-perfect-pi/">Raspberry Pi</a>. In fact, with Docker, it can be installed anywhere with a minimum amount of effort.</p><p>I host Miniflux locally on my network alongside 14 other Docker containers. You can see my <code>docker-compose.yaml</code> in my <a href="https://github.com/scottsweb/ham/blob/master/miniflux/docker-compose.yml" rel="nofollow noopener noreferrer" target="_blank">home automation repo</a>. Hosting it locally has one draw back — you need to be at home to access your feeds. My solution is to use a VPN to connect home to my local network if I want to check for updates on the road. You might fight it easier to host Miniflux on a cheap VPS instead or you can support development of the project and use the <a href="https://miniflux.app/hosting.html" rel="nofollow noopener noreferrer" target="_blank">hosted version</a> for $15 a year.</p><h2 id="clients"><a href="#clients" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Clients</h2><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/rss-clients.jpg?w=1600&amp;strip=info" alt="Screenshots of popular RSS clients" class="rss-image"></figure><p>If you have had a look the Miniflux website, you may have seen the UI and closed the tab. It's not the nicest looking or most intuitive piece of software. Don't feel disheartened though. There are many clients that talk and sync to your central Miniflux server. Here are some of my favourites:</p><ul><li><a href="https://play.google.com/store/apps/details?id=com.constantin.constaflux&amp;hl=en&amp;gl=US" rel="nofollow noopener noreferrer" target="_blank">ConstaFlux</a> — A tidy little reader for Android that uses material design</li><li><a href="https://reederapp.com/" rel="nofollow noopener noreferrer" target="_blank">Reeder</a> — For Mac/iOS. It's clean, well featured and supports custom gestures</li><li><a href="https://flathub.org/apps/details/com.gitlab.newsflash" rel="nofollow noopener noreferrer" target="_blank">NewsFlash</a> — For Linux. Built in Rust and works wonderfully with Gnome</li></ul><h2 id="follow-everything"><a href="#follow-everything" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Follow everything</h2><p>You can use RSS to keep up with all sorts of content, not just written text. I am testing moving my YouTube subscriptions to RSS to avoid Google's junk algorithms. For Twitter there is <a href="https://nitter.net/search?f=tweets&amp;q=scottsweb" rel="nofollow noopener noreferrer" target="_blank">Nitter</a> and Miniflux can support podcasts out of the box. I also recently found a great tool you can self host called <a href="https://github.com/RSS-Bridge/rss-bridge" rel="nofollow noopener noreferrer" target="_blank">RSS Bridge</a>. With RSS bridge I can get content from <a href="https://github.com/RSS-Bridge/rss-bridge/tree/master/bridges" rel="nofollow noopener noreferrer" target="_blank">many sites</a> including: Telegram, Reddit, Mastodon, <a href="/project/self-hosting-the-fediverse/">GoToSocial</a> and Wikipedia.</p><p>With all that in place, all that is left to do is make a nice drink, find somewhere comfortable and rediscover some <a href="https://branch.climateaction.tech/" rel="nofollow noopener noreferrer" target="_blank">interesting</a>, <a href="https://www.bellingcat.com/" rel="nofollow noopener noreferrer" target="_blank">investigative</a>, <a href="https://blog.longnow.org/" rel="nofollow noopener noreferrer" target="_blank">forward thinking</a> and <a href="https://waitbutwhy.com/" rel="nofollow noopener noreferrer" target="_blank">quirky</a> content to follow (oh, <a href="https://scott.ee/feed.xml" rel="nofollow noopener noreferrer" target="_blank">and me</a> 😉).</p>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/rss.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Solar Hosting]]></title>
            <link>https://scott.ee/project/solar-hosting-raspberry-pi</link>
            <guid>https://scott.ee/project/solar-hosting-raspberry-pi</guid>
            <pubDate>Sat, 18 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[A project to self host a website in Sweden using solar power, battery storage and a Raspberry Pi. Low tech homelab solution.]]></description>
            <content:encoded><![CDATA[<figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/solar-host-pi.jpg?w=1600&amp;strip=info" alt="Raspberry Pi sitting on a bright green battery with cables running out of frame" class="rss-image"></figure><p>This project is something I started tinkering on just over two years ago. It's not perfect, but I feel I have gotten it to a point where it is resilient enough to share.</p><p>It is easy to underestimate how much power is needed to sustain modern life and this experiment has given me a whole new appreciation for how power hungry even our smallest devices can be. I'll be updating this project over time as I find ways to further improve on the system and I would love to <a href="mailto:message@scott.ee">hear from you</a> if you have suggestions or ideas on what can be improved. I'm not an electrical engineer and have lots to learn.</p><h2 id="the-philosophy"><a href="#the-philosophy" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The philosophy</h2><p>When we moved to Sweden two years ago, I quickly realised that full time solar hosting wouldn't be possible. During our first winter here, we didn't see the sun for over five weeks (<a href="https://www.thelocal.se/20201209/stockholm-and-karlstad-havent-had-a-single-hour-of-sunlight-all-month/" rel="nofollow noopener noreferrer" target="_blank">it even made the news</a>). In contrast, during summer we can get a good twenty hours of daylight. Although it's not always sunny and certainly not always strong enough to charge something.</p><p>This means I needed to design my system for resilience and have a plan for my solar host going offline. I needed some kind of monitoring and potentially a backup host. Worst case, I wanted to show a simple page explaining why my site is offline from time to time.</p><p>Another challenge is that we currently live in an apartment without a balcony. When you look at <a href="http://solarprotocol.net/" rel="nofollow noopener noreferrer" target="_blank">other</a> well known <a href="https://solar.lowtechmagazine.com/about.html" rel="nofollow noopener noreferrer" target="_blank">solar hosting projects</a> they tend to be built around 12V systems, using large lead-acid batteries and huge solar panels. We don't have that sort of room and I would rather avoid lead-acid — it's not very sustainable and can be fairly dangerous.</p><p>Most single board computers generally require 5V, so a 12V system is perhaps overkill. You also lose energy in the conversion from 12V to 5V. With that in mind I decided to build my system around smaller components at 3.2V.</p><h2 id="the-hardware"><a href="#the-hardware" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The hardware</h2><p>You will need:</p><ul><li><a href="https://www.raspberrypi.com/products/raspberry-pi-zero-w/" rel="nofollow noopener noreferrer" target="_blank">A Raspberry Pi Zero W/H</a></li><li><a href="https://lifepo4wered.com/lifepo4wered-pi+.html" rel="nofollow noopener noreferrer" target="_blank">LiFePO4wered/Pi+ solar charger / HAT</a></li><li><a href="https://shop.gwl.eu/index.php?cl=details_disc&amp;anid=4011" rel="nofollow noopener noreferrer" target="_blank">20 Ah LiFePO4 Battery (1 cell)</a></li><li><a href="https://voltaicsystems.com/9-watt-panel/" rel="nofollow noopener noreferrer" target="_blank">9W 6V Solar panel</a> (probably needs to be bigger)</li><li><a href="https://www.uugear.com/product/raspikey-plug-and-play-emmc-module-for-raspberry-pi/" rel="nofollow noopener noreferrer" target="_blank">Raspikey eMMC module</a></li><li><a href="https://www.adafruit.com/product/3068" rel="nofollow noopener noreferrer" target="_blank">Some wire</a> and a <a href="https://www.adafruit.com/product/2788" rel="nofollow noopener noreferrer" target="_blank">connector</a> for the solar panel</li><li>31k resistor (value will depend on your solar panel)</li></ul><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/solar-host-components.jpg?w=1600&amp;strip=info" alt="All of the components described above laid out neatly on a warm wooden floor" class="rss-image"></figure><p>I also used a few washers and battery connectors when connecting everything together. For the most part everything is plug and play, but you will need to snap off the battery holder on the solar charger HAT and solder some additional wires; two that run to the battery and two that run to the solar panel connector. The solar charger also requires a resistor matched to your panel. This is covered in <a href="https://lifepo4wered.com/files/LiFePO4wered-Pi+-Product-Brief.pdf" rel="nofollow noopener noreferrer" target="_blank">the documentation</a> and is something I have tweaked a few times (more on that later).</p><p>If I was to start from scratch today, I would consider a <a href="https://shop.gwl.eu/LiFePO4-cells-3-2-V/ELERIX-Lithium-Cell-LiFePO4-3-2V-100Ah.html" rel="nofollow noopener noreferrer" target="_blank">bigger battery</a> and a <a href="https://voltaicsystems.com/20-watt-6-volt-solar-panel-etfe/" rel="nofollow noopener noreferrer" target="_blank">bigger 20 Watt panel</a>. Without the solar panel attached, the 20Ah battery I chose lasts for about 6.5 days, so 100Ah would give about one month of run time. The panel is OK, but once the battery is out, it can take a good week of sunlight for the system to boot again, so a bigger panel is probably going to be my next purchase.</p><h3 id="the-raspberry-pi-zero-wh"><a href="#the-raspberry-pi-zero-wh" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The Raspberry Pi Zero W/H</h3><p>I tested a few small computers to see which were most power efficient. Using a <a href="https://www.joom.com/sv/products/5ddf6f8736b54d010152cf0d" rel="nofollow noopener noreferrer" target="_blank">cheap USB power tester</a> I got the following results:</p><ul><li><a href="https://vocore.io/v2.html" rel="nofollow noopener noreferrer" target="_blank">VoCore 2</a>: 120mA — 200mA</li><li><a href="https://openwrt.org/toh/tp-link/tl-mr3020" rel="nofollow noopener noreferrer" target="_blank">TP-Link MR3020</a>: 125mA</li><li><a href="https://onion.io/omega2/" rel="nofollow noopener noreferrer" target="_blank">Omega2</a>: 210mA</li><li><a href="https://www.raspberrypi.com/products/raspberry-pi-zero-w/" rel="nofollow noopener noreferrer" target="_blank">Pi Zero W</a>: 80mA — 120mA depending on optimisations</li></ul><p>I also checked online to see what other tinkerers had seen in terms of power consumption. The original Pi Zero seemed to do well in most tests. It's also well supported in terms of <a href="/project/the-perfect-pi/">software</a> and you can optimise its power consumption by turning off features like <a href="https://di-marco.net/blog/it/2020-04-18-tips-disabling_bluetooth_on_raspberry_pi/" rel="nofollow noopener noreferrer" target="_blank">Bluetooth</a>, the <a href="https://www.jeffgeerling.com/blogs/jeff-geerling/raspberry-pi-zero-conserve-energy" rel="nofollow noopener noreferrer" target="_blank">HDMI circuitry</a> and <a href="https://www.jeffgeerling.com/blogs/jeff-geerling/controlling-pwr-act-leds-raspberry-pi" rel="nofollow noopener noreferrer" target="_blank">LEDs</a>.</p><p>Ideally I would have plugged a USB Ethernet adapter into the Pi Zero for a faster and more stable network connection, but the general consensus is that <a href="https://www.cnx-software.com/2021/12/09/raspberry-pi-zero-2-w-power-consumption/" rel="nofollow noopener noreferrer" target="_blank">WiFi requires less power</a> as it only draws power when in use. The other benefit of WiFi is that I can move the Pi around as the sun moves throughout the year.</p><h3 id="the-lifepo4weredpi-solar-charger--hat"><a href="#the-lifepo4weredpi-solar-charger--hat" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The LiFePO4wered/Pi+ solar charger / HAT</h3><p><a href="https://lifepo4wered.com/lifepo4wered-pi+.html" rel="nofollow noopener noreferrer" target="_blank">This little HAT</a> is what makes this project possible. They are made by a small team but are well designed and well supported. The LiFePO4wered/Pi+ has many smart features that make using the Pi off-grid possible. There are wake up timers, a real time clock that manages system time and an application watchdog that can monitor and reboot the system when your software crashes. While the Pi is off, the LiFePO4wered/Pi+ keeps track of time and monitors system voltages while consuming around <code>4 µA</code> — so the Pi can sit in standby for many years.</p><p>The HAT comes with a CLI tool that allows you to get the current health of the panel and battery. This allowed me to create a small <a href="#the-software">python utility</a> that writes a few stats to a JSON file which then gets consumed by this site. If you can see the battery to the left of this article, your visit was served by the solar Pi.</p><p>As mentioned earlier, you will need to solder a resistor to the HAT to optimise how your battery charges. From the <a href="https://lifepo4wered.com/files/LiFePO4wered-Pi+-Product-Brief.pdf" rel="nofollow noopener noreferrer" target="_blank">documentation</a>:</p><div class="nuxt-content-highlight"><pre class="language-text line-numbers"><code>The MPP resistor value can be calculated with the following formula:
RMPP = 51815 / (VMPP – 4.66)
</code></pre></div><p>I contacted the solar panel manufacturer and they said the <code>Vmmp</code> for my panel is <code>7.38V</code>. Therefore I needed a <code>19 kohm</code> resistor. Unfortunately this didn't really work out for me. It meant that I needed <code>7.38V</code> from the panel and it just wasn't happening that often. It also breaks USB charging (you only get <code>5V</code> from the Pi charger) which is less than ideal. At the moment I am testing a <code>31 kohm</code> resistor which sets the charge voltage to <code>6.33v</code>… so far this is working quite well and the solar panel is doing a much better job at charging the battery and running the Pi at the same time. I'm sure this is an area of improvement though.</p><h3 id="the-battery"><a href="#the-battery" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The battery</h3><p>As the name of the HAT suggests, it supports lithium iron phosphate batteries (<a href="https://en.wikipedia.org/wiki/Lithium_iron_phosphate" rel="nofollow noopener noreferrer" target="_blank">LiFePO4</a>). These batteries score well in terms of toxicity, safety and life cycle. This video does a pretty good job at selling the safety side of LFP:</p><div data-oembed="" class="remark-oembed-inline remark-oembed-you-tube"><a href="https://www.youtube.com/watch?v=Qzt9RZ0FQyM" data-oembed="" rel="noopener noreferrer nofollow" target="_blank" class="remark-oembed-anchor"><img src="https://i.ytimg.com/vi/Qzt9RZ0FQyM/hqdefault.jpg" title="Dangerous vs. Safe batteries, Explosion and fire test!" width="200" height="113" data-oembed="" class="remark-oembed-photo"></a><iframe width="200" height="113" src="https://www.youtube.com/embed/Qzt9RZ0FQyM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Dangerous vs. Safe batteries, Explosion and fire test!"></iframe></div><p>I am particularly impressed by how much <a href="https://www.greenenergytimes.org/2018/06/how-lithium-iron-phosphate-batteries-are-easier-on-the-environment/" rel="nofollow noopener noreferrer" target="_blank">better for the environment LiFePO4 batteries are</a>, with lifespans ten times longer than lead-acid batteries and a non-toxic chemistry.</p><h3 id="raspikey-emmc-module"><a href="#raspikey-emmc-module" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Raspikey eMMC module</h3><p>SD cards are not overly reliable (although they are getting better). I decided it would be better to use an <a href="https://www.uugear.com/product/raspikey-plug-and-play-emmc-module-for-raspberry-pi/" rel="nofollow noopener noreferrer" target="_blank">eMMC module</a> for longevity. The 16GB should be enough room for everything, but it really depends on how big the site you want to host is. I am secretly hoping that this hardware combination will last for a long time, if it does I have a similar project in mind for an off-grid time capsule.</p><h2 id="the-software"><a href="#the-software" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The software</h2><p>I've put a copy of the <a href="https://github.com/scottsweb/solar-host" rel="nofollow noopener noreferrer" target="_blank">custom code you need for this project on GitHub</a>, if you would rather start there.</p><p>Once you have the hardware in place, it's time to move on to the software setup. Start with a copy of <a href="https://www.raspberrypi.com/software/operating-systems/" rel="nofollow noopener noreferrer" target="_blank">Raspberry Pi OS Lite</a> - you want as little software as possible. You can use the <a href="https://www.raspberrypi.com/software/" rel="nofollow noopener noreferrer" target="_blank">Raspberry Pi imager</a> to setup WiFi, SSH, a fixed local IP address (for convenience) and a few other bits before putting the eMMC module in the Pi and booting. I also have a guide on my site for setting up the <a href="/project/the-perfect-pi/">perfect Raspberry Pi</a>. I followed most of the steps detailed there including the power saving tips like turning off HDMI and the LEDs, as well as setting up Docker.</p><p>You'll also want to install <a href="https://github.com/xorbit/LiFePO4wered-Pi" rel="nofollow noopener noreferrer" target="_blank">the software for the solar charger HAT</a> which gives you CLI access to control settings and query the state of the HAT. I tweaked the following settings:</p><ul><li><code>AUTO_BOOT</code> to <code>2</code>. <code>lifepo4wered-cli set AUTO_BOOT 2</code>. This ensures the Pi will boot back up when there is enough battery power to do so.</li><li><code>VBAT_BOOT</code> to <code>3325</code>. <code>lifepo4wered-cli set VBAT_BOOT 3325</code>. This is about 75% of the battery, so the Pi will boot once the battery hits this level.</li><li><code>LED_STATE</code> to <code>0x00</code>. <code>lifepo4wered-cli set LED_STATE 0x00</code>. To turn off the main power LED and save more energy.</li></ul><p>These settings can be saved to flash using the command <code>lifepo4wered-cli set CFG_WRITE 0x46</code>. I highly recommend <a href="https://lifepo4wered.com/files/LiFePO4wered-Pi+-Product-Brief.pdf" rel="nofollow noopener noreferrer" target="_blank">scanning the documentation</a> to see how customisable this board is. At some point I may setup the watchdog feature to reboot the Pi in case of a software crash.</p><p>After that I created a <a href="https://github.com/scottsweb/solar-host/blob/main/battmon/battmon.py" rel="nofollow noopener noreferrer" target="_blank">custom python script</a> that runs every 10 minutes. It gets started automatically <a href="https://www.dexterindustries.com/howto/run-a-program-on-your-raspberry-pi-at-startup/" rel="nofollow noopener noreferrer" target="_blank">at boot time</a> (see method 4: systemd and this <a href="https://github.com/scottsweb/solar-host/blob/main/battmon.service" rel="nofollow noopener noreferrer" target="_blank">service file</a>) and checks the current battery voltage. It then attempts to turn that into a battery percentage. It's not perfect as batteries tend to discharge in a non-linear fashion, but it does the job for now. There is also some code that translates that percentage into an LED output for a <a href="https://shop.pimoroni.com/products/led-shim?variant=3136952467466" rel="nofollow noopener noreferrer" target="_blank">PIMORONI LED Shim</a>. This is commented out for now in order to maximise run time. The python script populates a file called <code>solar.json</code> which sits in the web directory and contains the battery percentage, battery voltage, load, uptime and CPU temperature. This creates a crude API.</p><p>Installing Docker takes a bit of time on the Pi Zero but it's worth it. You can explore containerised software without messing up your OS. I use three containers to host my site, a <a href="https://github.com/joseluisq/static-web-server" rel="nofollow noopener noreferrer" target="_blank">lightweight static web server</a>, <a href="https://github.com/cloudflare/cloudflared" rel="nofollow noopener noreferrer" target="_blank">cloudflared</a> and <a href="https://github.com/containrrr/watchtower" rel="nofollow noopener noreferrer" target="_blank">watchtower</a>. Here is my <code>docker-compose.yaml</code>.</p><div class="nuxt-content-highlight"><pre class="language-text line-numbers"><code>version: "3.3"

services:
  web:
    image: joseluisq/static-web-server:latest
    container_name: web
    env_file: ./.settings.env
    ports:
      - 8080:80
    volumes:
      - ./web:/public:ro
    restart: unless-stopped
    command: -g info

  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    network_mode: host
    command: tunnel --no-autoupdate run --token ${CF_WEB_TOKEN}
    depends_on:
      - web
</code></pre></div><p>An example <code>.settings.env</code> file can be found <a href="https://github.com/scottsweb/solar-host" rel="nofollow noopener noreferrer" target="_blank">on GitHub</a> along with everything else you should need.</p><h3 id="cloudflared-and-self-hosting"><a href="#cloudflared-and-self-hosting" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Cloudflared and self hosting</h3><p>Self hosting has always been something I have shied away from. I just don't like the idea of opening up ports on my home router and letting outside traffic stream in. Cloudflare have a solution to this called <a href="https://www.cloudflare.com/en-gb/products/tunnel/" rel="nofollow noopener noreferrer" target="_blank">Cloudflare Tunnels</a>. It's a free service that creates a secure tunnel between your home network and <a href="https://blog.cloudflare.com/tag/sustainability/" rel="nofollow noopener noreferrer" target="_blank">Cloudflare's sustainable infrastructure</a>. You can then expose certain services on your network to your Cloudflare domains. I'm really impressed with this service and the ease at which it can be setup. You can setup most of it via an online control panel, then just install the <code>Cloudflared</code> software on the host or in a container. In my <code>docker-compose.yaml</code> file you will need to replace <code>${CF_WEB_TOKEN}</code> with your Cloudflare token from their web interface.</p><p>Using Cloudflare also brings other advantages like website caching, DDoS protection, a firewall and load balancing (which sounds useful). Cloudflare deserves a thank you or two for making all these fantastic things.</p><h3 id="static-web-server"><a href="#static-web-server" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Static web server</h3><p><a href="https://github.com/joseluisq/static-web-server" rel="nofollow noopener noreferrer" target="_blank">Static Web Server</a> (or SWS) is a very small and fast production-ready web server suitable to serve static web files. It is focused on lightness, ease of use, high performance and safety. It's perfectly suited to the memory and processor constrained Pi Zero.</p><p>This website is static (a bunch of HTML, CSS and JS files). It's built with <a href="https://nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">Nuxt.js</a> and <a href="https://content.nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">Nuxt content</a>, replacing the <a href="/project/headless-wordpress-api-nuxt-dat/">previous site</a> that used a decoupled WordPress backend. I haven't published this site to a public GitHub repo yet, but I plan to in future and i'll update this project when I do.</p><p>I created a new Vue component that checks the values in <code>solar.json</code> and then shows the battery value with a background colour and icon. There is a good chance you are seeing it on the left hand side of this page right now.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/solar-host-website.png?w=1280&amp;strip=info" alt="Screenshot of this website showing the battery icon at 73.5%" class="rss-image"></figure><p>The background colours change based on the battery percentage and I have output the other data in <code>solar.json</code> into the background too — I hope to make that a little more visually interesting in future.</p><p>This site has always responded to various environmental variables. The image quality is reduced if you visit from a <a href="https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/effectiveType" rel="nofollow noopener noreferrer" target="_blank">weak 2G/3G connection</a>. The images are compressed further if you turn on <a href="https://css-tricks.com/help-users-save-data/" rel="nofollow noopener noreferrer" target="_blank">Save-Data</a>. With battery data now easily accessible, I decided to make this another variable to respond to. It's most noticeable when the battery is <code>&lt; 35%</code> — the images will become grayscale and heavily compressed.</p><h3 id="watchtower"><a href="#watchtower" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Watchtower</h3><p>Updating a containerised app is simple with <a href="https://github.com/containrrr/watchtower" rel="nofollow noopener noreferrer" target="_blank">Watchtower</a>. Watchtower will pull down an updated image, gracefully shut down your existing container and restart it with the same options that were used when it was deployed initially. I have this running to ensure that my Docker containers stay up to date… mostly for security.</p><h3 id="security"><a href="#security" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Security</h3><p>Whilst Cloudflare does a good job at securing access to the Pi, I still took a few additional steps to improve security. This included:</p><ul><li><a href="https://www.seancarney.ca/2021/02/06/secure-your-raspberry-pi-by-enabling-automatic-software-updates/" rel="nofollow noopener noreferrer" target="_blank">Setting up auto-updates</a></li><li><a href="https://janw.me/raspberry-pi/only-allow-ssh-key-login-on-raspberry-pi/" rel="nofollow noopener noreferrer" target="_blank">Ensuring SSH login via key only</a></li><li><a href="https://linuxiac.com/raspberry-pi-firewall/" rel="nofollow noopener noreferrer" target="_blank">Setting up a firewall to open up very specific ports on the Pi</a></li></ul><p>This last thing I installed is <a href="https://github.com/azlux/log2ram" rel="nofollow noopener noreferrer" target="_blank">log2ram</a> to reduce writes to the disk. It's not really a security benefit but may help reduce power consumption and improve the longevity of the eMMC.</p><h2 id="designing-for-resilience"><a href="#designing-for-resilience" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Designing for resilience</h2><p>Like I mentioned at the start of this project, I needed to design this system with resilience in mind. That means finding a way to keep my site online when we may not see sun for several weeks.</p><p>We run <a href="https://www.home-assistant.io/" rel="nofollow noopener noreferrer" target="_blank">Home Assistant</a> on our home network (I need to write more about this, but for now you can browse <a href="https://github.com/scottsweb/ham" rel="nofollow noopener noreferrer" target="_blank">this repo on GitHub</a>). Home Assistant is fantastic piece of software and I use it to control and automate all sorts of things.</p><p>The first step is to monitor what the solar host is up to. I setup a Home Assistant sensor that checks the <code>solar.json</code> file and logs the battery state. Home Assistant gives us a nice UI for tracking the battery over time:</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/solar-host-home-assistant.png?w=1280&amp;strip=info" alt="Screenshot of Home Assistant showing battery percentage changing over a week" class="rss-image"></figure><p>I also setup some simple push notifications from Home Assistant to my phone to tell me when the the solar goes offline (the sensor switches to <code>Unavailable</code>) and online again (the sensor switches from <code>Unavailable</code> to a value).</p><p>The next step was to work out what to do when the solar host goes offline and there are quite a few potential options to explore:</p><ol><li>I could change my DNS as the Pi powers off, pointing my URL elsewhere (perhaps to a generic HTML page other solar hosts could use, explaining the site is offline, and when it might be back again).</li><li>I could set up a backup VPS or static host which serves a mirror of my site, perhaps on a different URL (but this seems wasteful).</li><li>I could explore Cloudflare's load balancing tools, splitting the traffic across the solar host and another self hosted computer (most likely another Pi).</li><li>I could just let my site go offline, after all it's a low traffic portfolio site.</li><li>I could power the site up and down on a schedule to make it more predictable and extend battery life.</li></ol><h3 id="a-little-magic"><a href="#a-little-magic" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>A little magic</h3><p>At the moment I am exploring solution 3 with a potential twist.</p><p>Cloudflare tunnels support load balancing, so setting up a secondary host running over the same tunnel and with a copy of my website allows Cloudflare to randomly send traffic to my solar Pi or to a secondary host. This is how it is setup today. Your visit will be randomly handled by one of two Pis: the solar Pi or a Pi Zero v2.</p><p>Our home electricity is on a renewables tariff and Sweden has one of the <a href="https://app.electricitymap.org/map" rel="nofollow noopener noreferrer" target="_blank">lowest carbon intensity grids</a> in the world, so I don't feel too bad about having a secondary Pi sipping around 130mA and acting as a backup host, however I am considering using our Home Assistant instance to improve things further.</p><p>With some small tweaks to the Home Assistant push notification automations I mentioned above, I can startup and shutdown the secondary host on demand. When the solar host is online and the battery is at a certain percentage, the secondary host can take a rest. Once the battery gets low though, Home Assistant will see that and get the secondary Pi back online, ready to serve some traffic. To me, that feels a little like magic.</p><script async="" defer="">const isDocumentReady = () =&gt; {
      if (document.readyState !== 'complete') {
        document.addEventListener('readystatechange', isDocumentReady);
        return false;
      }

      requestAnimationFrame(() =&gt; {
        
    document.querySelectorAll('div[data-oembed]').forEach((el) =&gt; {
      const template = el.querySelector('[data-oembed-template]').content.cloneNode(true);
      el.innerHTML = '';
      el.attachShadow({ mode: 'closed' }).appendChild(template);
    });

    document.querySelectorAll('img[data-oembed][data-src]').forEach((img) =&gt; {
      img.setAttribute('src', img.getAttribute('data-src'));
      img.removeAttribute('data-src');
    });

    document.querySelectorAll('[data-oembed]').forEach((el) =&gt; {
      el.removeAttribute('data-oembed');
    });
  ;
      });

      return true;
    };

    if (!isDocumentReady()) {
      document.addEventListener('readystatechange', isDocumentReady);
    }</script>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/solar-host-pi.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Jetpack SuperCache]]></title>
            <link>https://scott.ee/project/jetpack-supercache</link>
            <guid>https://scott.ee/project/jetpack-supercache</guid>
            <pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Design exploration to reimagine WP Super Cache]]></description>
            <content:encoded><![CDATA[<div class="grid project-overview grid" style="grid-gap:var(--rhythm)"><div class="v-container project-summary"><ul><li><strong>Role</strong>: Design lead</li><li><strong>Skills</strong>: Ideation, UI design, Prototyping, Product design</li></ul></div><div class="v-container project-introduction"><ul><li><strong>Tools</strong>: Figma</li><li><strong>Duration</strong>: Three weeks</li><li><strong>Iterations</strong>: Two</li></ul></div></div><p>With over 2 million installations, <a href="https://wordpress.org/plugins/wp-super-cache/" rel="nofollow noopener noreferrer" target="_blank">WP Super Cache</a> is one of the most popular open source caching plugins for WordPress. I like to think of it as one of the original static site generators.</p><p>This project was a short exploration to understand how WP Super Cache could be modernised and become part of the <a href="https://jetpack.com/" rel="nofollow noopener noreferrer" target="_blank">Jetpack suite</a> of products, alongside <a href="/project/jetpack-cloud/">Jetpack</a> and <a href="/project/jetpack-boost/">Jetpack Boost</a>. As an exploratory project, it was largely free from existing constraints and was used to kickstart further discussion about potential futures.</p><h2 id="challenges"><a href="#challenges" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Challenges</h2><p>Caching is complicated. Most popular WordPress caching plugins are jargon heavy with tonnes of inline documentation to try and ease the burden of configuration and management. WP Super Cache is no exception with pages of toggle switches, radio buttons and inputs used to tweak cache behaviour.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-existing-ui.png?w=1280&amp;strip=info" alt="Current WP Super Cache interface" class="rss-image"></figure><p>Whilst a technical interface makes sense for a certain subset of WP SuperCache users, our data suggested that the plugin is being used by a much broader range of people. It has the potential to be installed by any WordPress user looking to improve site performance.</p><h2 id="solutions"><a href="#solutions" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Solutions</h2><p>Optimising for first time use therefore felt like a good place to start. What can we do during the first use of the plugin to both explain the concepts of caching and the benefits of the plugin?</p><h3 id="a-soft-landing"><a href="#a-soft-landing" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>A soft landing</h3><div class="grid width-wide" style="--columns:3;grid-gap:var(--rhythm)"><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-onboarding-1.png?w=528&amp;strip=info" alt="Onboarding mockup step 1, titled: quick as a flash" class="rss-image"></div></div><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-onboarding-2.png?w=528&amp;strip=info" alt="Step 2, titled: found in space" class="rss-image"></div></div><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-onboarding-3.png?w=528&amp;strip=info" alt="Step 3, titled: Launching near you" class="rss-image"></div></div></div><p>When launching the plugin for the first time, you will enter an onboarding flow which is used to explain caching, why it matters and also the premium features that are available. This would be shown on first launch and could be expanded to include more cards as the product matures.</p><p>Your first use would also be guided by a “getting started” tutorial, explaining key features of the interface, how they work and most importantly, why you might need to use them.</p><div class="grid soft-background p-one rounded" style="--columns:2;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-tour-1.png?w=800&amp;strip=info" alt="Guided tour on settings screen" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-tour-2.png?w=800&amp;strip=info" alt="Guided tour highlights features of the plugin" class="rss-image"></div></div><h3 id="a-new-approach-to-settings"><a href="#a-new-approach-to-settings" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>A new approach to settings</h3><h4 id="making-caching-simpler"><a href="#making-caching-simpler" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Making caching simpler</h4><p>At its most basic, WP Super Cache is an on/off switch. The challenge becomes tailoring cache behaviour to your particular site requirements. The burden of configuration falls to the user in the existing UI. I believe the solution is to run a number of automated checks during cache activation, ensuring compatibility with other plugins and configuring sensible defaults.</p><div class="grid side-by-side" style="--columns:2;grid-gap:var(--rhythm)"><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-enabling-1.png?w=800&amp;strip=info" alt="New Jetpack SuperCache UI in activating state" class="rss-image"></div></div><p>The primary on/off tool becomes a big feature of the UI, and the status ring is used to indicate current plugin state and actions being taken.</p></div><div class="grid side-by-side" style="--columns:2;grid-gap:var(--rhythm)"><p>Simply activating caching should be enough for most users to get started and see strong performance improvements.</p><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-enabling-2.png?w=800&amp;strip=info" alt="Jetpack SuperCache UI with caching turned on" class="rss-image"></div></div></div><h4 id="audiences"><a href="#audiences" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Audiences</h4><p>Imagine for a moment that you wanted to create a homepage banner that was tailored to the operating system of the device visiting your sites homepage. On Windows it might say “Install the Windows .exe file”, on Mac “Download the .dmg” and on Android “visit the Play store to install the app”. Caching could easily break this functionality, as we now need different caches based on user agent or operating system.</p><p>Changing cache behaviour based on the visitor type (logged in vs logged out), URL, file, device and browser are pretty much all possible in the exiting plugin. They are unfortunately quite primitive. You cannot mix these categories or define specific circumstances in which caching can be turned off, or a new cache is defined. The settings are also loosely grouped under various tabs and sections.</p><div class="grid" style="--columns:2;grid-gap:var(--rhythm)"><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-tuning-1.png?w=800&amp;strip=info" alt="The new tuning and settings screen" class="rss-image"></div></div><div class="v-container mobile-mockup"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-tuning-2.png?w=800&amp;strip=info" alt="Screenshot showing how to define an audience" class="rss-image"></div></div></div><p>Audiences would allow you define these kinds of rules, targeting the specific visitors that require a separate cache. Most of the WP Super Cache interface could be simplified behind this concept, allowing for heavily reduced settings screens.</p><h3 id="demonstrating-value"><a href="#demonstrating-value" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Demonstrating value</h3><p>The existing WP Super Cache plugin is really just a huge collection of settings, once configured, there is very little need to revisit the plugin screens (set it and forget it). How do users know the plugin is working? How do we show value?</p><div class="grid width-wide" style="--columns:2;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-effectiveness.png?w=800&amp;strip=info" alt="Guided tour on settings screen" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-supercache-performance.png?w=800&amp;strip=info" alt="Guided tour highlights features of the plugin" class="rss-image"></div></div><p>I believe the solution will be to introduce statistics for both effectiveness and site performance. This gives users a reason to check back from time to time and is aligned with the approach taken in current Jetpack plugin.</p><blockquote><p>Woah this is really breaking new ground, and an excellent unbound exploration bringing fresh ideas. :)</p><figcaption>— Erin Casali, <cite><a href="https://intenseminimalism.com/" rel="nofollow noopener noreferrer" target="_blank">@folletto</a></cite></figcaption></blockquote><h2 id="prototyping"><a href="#prototyping" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Prototyping</h2><p>To help communicate these ideas with the wider Jetpack team I created a Figma prototype with a number key interactions and screens available to test. The prototype can be found below if you wish to test it yourself.</p><p><a href="https://www.figma.com/proto/0FYQWXeJFon6WewHNcrhk0/Jetpack-SuperCache?node-id=212%3A2020&amp;viewport=63%2C488%2C0.125&amp;scaling=scale-down" rel="nofollow noopener noreferrer" target="_blank" class="button">Try the prototype</a></p>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The Perfect (Raspberry) Pi]]></title>
            <link>https://scott.ee/project/the-perfect-pi</link>
            <guid>https://scott.ee/project/the-perfect-pi</guid>
            <pubDate>Sun, 15 Jul 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Documenting how to set-up Raspberry Pi's]]></description>
            <content:encoded><![CDATA[<p>I have been setting up lots of Raspberry Pis, mostly for use with my home automation projects. It is time to document how I setup and get the most out of these fantastic little machines.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/raspberry-pi.jpg?w=1600&amp;strip=info" alt="Close up of Raspberry Pi computer" class="rss-image"></figure><h2 id="grab-raspberry-pi-os-lite"><a href="#grab-raspberry-pi-os-lite" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Grab Raspberry Pi OS Lite</h2><p>Head over to <a href="https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit" rel="nofollow noopener noreferrer" target="_blank">raspberrypi.org</a> and download the latest copy of the Raspberry Pi OS (Lite). Every single Pi I have ever setup has been a headless machine so you don’t need the bloat of the desktop environment. <a href="https://etcher.io/" rel="nofollow noopener noreferrer" target="_blank">Etcher</a> is a great tool for flashing the downloaded image to your SD card. Whilst you have the SD card in your computer, create a <a href="https://www.raspberrypi.org/documentation/remote-access/ssh/" rel="nofollow noopener noreferrer" target="_blank">blank file</a> called <code>ssh</code> in the <code>boot</code> directory to enable <code>ssh</code> and consider adding <a href="https://www.raspberrypi.org/documentation/configuration/wireless/headless.md" rel="nofollow noopener noreferrer" target="_blank">wireless network information</a> if your Pi will be using WiFi.</p><h2 id="set-a-fixed-ip"><a href="#set-a-fixed-ip" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Set a fixed IP</h2><p>A fixed IP will make it easier to reliably <code>ssh</code> into the machine and browse to any services it may be running. I always set a static IP via my router. I find this a little quicker and simpler to do than on the Raspberry Pi itself and it makes the Pi more portable should I ever change my network, or take it elsewhere. Your router documentation should be able to guide you through the process.</p><h2 id="login-and-update"><a href="#login-and-update" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Login and update</h2><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">ssh</span> pi@192.168.1.10
</code></pre></div><p>Once you have set your static IP you can login via terminal with the <code>pi</code> username and the default password of <code>raspberry</code>. You can then update the default software stack using:</p><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">sudo</span> <span class="token function">apt-get</span> update
<span class="token function">sudo</span> <span class="token function">apt-get</span> upgrade
</code></pre></div><h2 id="raspi-config"><a href="#raspi-config" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Raspi-config</h2><p>This little utility will do a number of things. It will expand the file system, giving you access to the entire SD card, set a memorable hostname and lower the GPU memory to minimum (16mb). With the Pi running headless you shouldn’t really need any graphics memory and this gives you the maximum amount of RAM for your projects and code. Run the utility with <code>raspi-config</code>, key around to change the above settings. Once that is done you will need to reboot and login again.</p><p>After rebooting, it is worth checking your time and timezone with <code>dpkg-reconfigure tzdata</code>. It has a similar interface to <code>raspi-config</code> and should be easy to find your way around with the keyboard.</p><h2 id="add-a-new-user"><a href="#add-a-new-user" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Add a new user</h2><p>It is a good idea to create your own user account and trash the original pi user. This will keep your Pi nice and safe should you expose it to the internet or invite a hacker to stay in your house. Run the following commands in sequence replacing <code>&lt;name&gt;</code> with your chosen username.</p><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">sudo</span> <span class="token function">useradd</span> -m <span class="token operator">&lt;</span>name<span class="token operator">&gt;</span> -G <span class="token function">sudo</span>
<span class="token function">sudo</span> <span class="token function">passwd</span> <span class="token operator">&lt;</span>name<span class="token operator">&gt;</span>
<span class="token builtin class-name">exit</span>
<span class="token function">ssh</span> <span class="token operator">&lt;</span>name<span class="token operator">&gt;</span>@192.168.1.10
<span class="token function">sudo</span> adduser <span class="token operator">&lt;</span>name<span class="token operator">&gt;</span> video
<span class="token function">sudo</span> deluser -remove-home pi
</code></pre></div><p>These steps will:</p><ol><li>Create you new user and add it to the <code>sudo</code> group</li><li>Setup your password for your new user</li><li>Logout</li><li>Log back in again (remember to change the IP to that of your Pi)</li><li>Add your new user to the video group which fixes a few Raspberry Pi tools like checking CPU temp</li><li>Delete the original pi user and all files in the home directory (make sure you have backed up what you need there first)</li></ol><p>If you find you are unable to autocomplete (tab) commands in your terminal with your new user, it may be because you are using the wrong shell. You can fix this <a href="https://serverfault.com/a/99791" rel="nofollow noopener noreferrer" target="_blank">following the guide here</a>.</p><h2 id="install-git"><a href="#install-git" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Install Git</h2><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> git-core
</code></pre></div><p>I try to store most of my project code on <a href="https://github.com/scottsweb" rel="nofollow noopener noreferrer" target="_blank">GitHub</a> if possible and the <code>git-core</code> package will make it possible to push and pull code from the command line. Whilst you are messing around with Git, I recommend taking a look at the <a href="https://github.com/azlux/log2ram" rel="nofollow noopener noreferrer" target="_blank">log2ram project</a>. It will store all of your system logs in RAM which is useful for reducing SD card wear and prolonging the life of the card. I don’t use it on all my Pi projects but it can be useful on busy systems where you have some RAM to spare.</p><h2 id="speed-tweaks"><a href="#speed-tweaks" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Speed tweaks</h2><p>As well as the <a href="https://www.raspberrypi.org/documentation/configuration/config-txt/overclocking.md" rel="nofollow noopener noreferrer" target="_blank">usual processor overclocking</a> that you <em>can</em> do (I haven’t felt the need yet), you can also improve the performance of the SD card. To do so edit <code>boot/config.txt</code> and add <code>dtoverlay=sdhost,overclock_50=100</code> on a new line in the file. The overclock value will need to be adjusted to suit the SD card you are using. It is a fairly <a href="https://www.jeffgeerling.com/blog/2016/how-overclock-microsd-card-reader-on-raspberry-pi-3" rel="nofollow noopener noreferrer" target="_blank">involved process</a> to get the best value for your card but can make a real difference. <code>dmesg</code> is also useful for spotting issues. You should note that this change can cause issues with WiFi too if you are relying on that for your network connection.</p><h2 id="power-tweaks"><a href="#power-tweaks" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Power tweaks</h2><p>One of my favourite things about Raspberry Pis is how power efficient they are. It means you can leave them all the time without worrying about the environmental impact or huge energy bills. With a few additional tweaks you can save a few more milliamps. There are some great tips come from Jeff Geerling in these <a href="http://www.jeffgeerling.com/blogs/jeff-geerling/raspberry-pi-zero-conserve-energy" rel="nofollow noopener noreferrer" target="_blank">excellent</a> <a href="http://www.jeffgeerling.com/blogs/jeff-geerling/controlling-pwr-act-leds-raspberry-pi" rel="nofollow noopener noreferrer" target="_blank">posts</a> that are worth running through. My favourite tweak is disabling the HDMI circuitry by adding <code>/usr/bin/tvservice -o</code> to <code>/etc/rc.local</code>.</p><h2 id="docker"><a href="#docker" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Docker</h2><p><a href="https://www.docker.com/" rel="nofollow noopener noreferrer" target="_blank">Docker</a> is a containerisation software that allows you to isolate software applications. Containers are more lightweight than traditional virtual machines. I find Docker the best way to run services on the Raspberry Pi as it allows me to get the most out of the resources available and removes the need to for reformat the SD card every time my tinkering goes a bit too far. Install docker with the following command and then add your user to the docker group:</p><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">curl</span> -sSL https://get.docker.com <span class="token operator">|</span> <span class="token function">sh</span>
<span class="token function">sudo</span> <span class="token function">usermod</span> -aG docker <span class="token operator">&lt;</span>name<span class="token operator">&gt;</span>
</code></pre></div><p>Once again replace <code>&lt;name&gt;</code> with your chosen username. I recommend installing docker compose too. This will allow you to configure and start you containers reliably from <code>docker-compose.yml</code> config files.</p><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> python-pip
<span class="token function">sudo</span> pip <span class="token function">install</span> docker-compose
</code></pre></div><p>This last Docker trick is optional. Docker can use quite a bit of space on your SD card so if you have external storage (like a hard drive) it can sometimes be beneficial to move <a href="http://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory" rel="nofollow noopener noreferrer" target="_blank">dockers internals to a different storage location</a>. Edit the docker.service file (<code>sudo nano /lib/systemd/system/docker.service</code>) and modify the line starting with <code>ExecStart</code> to be:</p><div class="nuxt-content-highlight"><pre class="line-numbers language-text"><code>ExecStart=/usr/bin/dockerd -H fd:// -g /path/to/external/storage/
</code></pre></div><p>The path should be to your external storage. You can then restart Docker and check the change has saved by running:</p><div class="nuxt-content-highlight"><pre class="line-numbers language-bash"><code><span class="token function">sudo</span> systemctl daemon-reload
<span class="token function">sudo</span> systemctl restart docker
docker info <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"loop file\|Dir"</span>
</code></pre></div><p>Updating Docker in future may require you to make this change again. You will know if it needs doing as your containers and images will disappear after an update.</p><h2 id="ssh"><a href="#ssh" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>SSH</h2><p>Almost done. These next few steps will configure SSH, allow for a simpler login (SSH via public key) and mount an external server using <code>sshfs</code>. First generate some keys with <code>ssh-keygen -b 2048 -t rsa</code> and add public keys from your other computers to: <code>.ssh/authorized_keys</code>. <code>sshfs</code> should be installed with <code>sudo apt-get install sshfs</code>. Once installed you can mount your external server by editing <code>/etc/fstab</code> and adding:</p><div class="nuxt-content-highlight"><pre class="line-numbers language-text"><code>&lt;name&gt;@192.168.1.11:/media/data/ /media/path/ fuse.sshfs _netdev,nonempty,allow_other,IdentityFile=/home/&lt;name&gt;/.ssh/id_rsa,reconnect,ServerAliveInterval=45,ServerAliveCountMax=2 0 0
</code></pre></div><p>Make sure you set the relevant paths, IP addresses and usernames in the fstab entry above. Test it <a href="https://serverfault.com/questions/174181/how-do-you-validate-fstab-without-rebooting" rel="nofollow noopener noreferrer" target="_blank">without a reboot</a> by typing <code>sudo mount -a</code>.</p><p>With all that completed you are now set with the perfect slice of Pi. Time to get hacking on your projects!</p><h2 id="optional-extras"><a href="#optional-extras" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Optional extras</h2><ul><li>Tweak <a href="https://www.bitpi.co/2015/02/11/how-to-change-raspberry-pis-swapfile-size-on-rasbian/" rel="nofollow noopener noreferrer" target="_blank">your swap</a> if RAM is tight (works well with <a href="https://www.raspberrypi.org/products/compute-module-3/" rel="nofollow noopener noreferrer" target="_blank">compute modules</a>)</li><li><a href="http://blog.dustinkirkland.com/2011/02/long-overdue-introduction-ecryptfs.html" rel="nofollow noopener noreferrer" target="_blank">Encrypt your home folder</a></li><li><a href="http://longsteve.com/wiki/index.php?title=USB_Hard_Drive_Encryption_on_a_Raspberry_Pi" rel="nofollow noopener noreferrer" target="_blank">Encrypt an external drive</a></li><li><a href="https://wiki.ubuntu.com/MountWindowsSharesPermanently" rel="nofollow noopener noreferrer" target="_blank">Mount a samba/Windows share</a></li><li>Adjust the <a href="http://www.embeddedpi.com/documentation/installing-linux-os/cm3-speed-thermal-os-configuration-options" rel="nofollow noopener noreferrer" target="_blank">thermal properties of the CPU</a></li></ul>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/raspberry-pi.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Decoupled WordPress with Nuxt.js and Dat]]></title>
            <link>https://scott.ee/project/headless-wordpress-api-nuxt-dat</link>
            <guid>https://scott.ee/project/headless-wordpress-api-nuxt-dat</guid>
            <pubDate>Thu, 07 Jun 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Experimenting with decoupled WordPress. Using the WordPress API, Nuxt.js and decentralisation with DAT and Beaker.]]></description>
            <content:encoded><![CDATA[<p>I have been tinkering with the WordPress API to better understand what is involved with creating a decoupled theme. As with all good projects I started by setting myself a few goals.</p><h2 id="project-goals"><a href="#project-goals" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Project goals</h2><ul><li><strong>Learn</strong>. I work with React most days so I wanted to try something else to better understand modern web development, not just a particular framework</li><li><strong>Speed</strong>. I wanted a site that is fast, lightweight and better for the planet</li><li><strong>Resilient</strong>. A site can handle LOTS of traffic and is also available via the P2P web</li><li><strong>Low cost</strong>. Less than £15 a month to host and maintain</li><li><strong>Privacy built in</strong>. No trackers, externally hosted JavaScript or fonts</li></ul><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/decoupled-wordpress-nuxt.png?w=1280&amp;strip=info" alt="Logos for WordPress, Nuxt.js and Dat" class="rss-image"></figure><h2 id="nuxtjs"><a href="#nuxtjs" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Nuxt.js</h2><p>At the heart of the experiment is the <a href="https://nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">Nuxt.js</a> framework. Nuxt is a framework for creating universal <a href="https://vuejs.org/" rel="nofollow noopener noreferrer" target="_blank">Vue.js</a> applications and in many ways it feels like working on a WordPress theme. It has a folder for your pages/templates, a hook API, support for plugins and components (or template parts if your thinking WordPress). Nuxt follows a philosophy of convention over configuration, drop Vue components in their respective folders and Nuxt will bind everything together.</p><p>This fairly rigid structure is important to the framework as it allows it to operate in three distinct modes:</p><ul><li>Single page application (SPA) — Run as a regular Vue web app</li><li>Server Side Rendered (SSR) — For each request, pre-render the application on the server and send that back to the client</li><li>Static (Generated) — Pre-render the application once during build, and then serve it as an SPA</li></ul><p>I was personally interested in the static (generated) and SPA modes which would allow me to host the interface in isolation to WordPress and without the need for Node.js hosting. This would allow me to make use of some of the free static hosting options out there like <a href="https://pages.github.com/" rel="nofollow noopener noreferrer" target="_blank">GitHub pages</a> or <a href="https://href.li/?http://surge.sh/" rel="nofollow noopener noreferrer" target="_blank">surge.sh</a>.</p><p>Out of the box Nuxt supports routing (<a href="https://router.vuejs.org/" rel="nofollow noopener noreferrer" target="_blank">vue router</a>), a store (<a href="https://vuex.vuejs.org/" rel="nofollow noopener noreferrer" target="_blank">vuex</a>), filters (core vue 2) and meta data (<a href="https://github.com/declandewet/vue-meta" rel="nofollow noopener noreferrer" target="_blank">vue-meta</a>). I added some additional plugins for progressive web app (<a href="https://github.com/nuxt-community/pwa-module" rel="nofollow noopener noreferrer" target="_blank">PWA</a>) features, <a href="http://velocityjs.org/" rel="nofollow noopener noreferrer" target="_blank">animation</a>, <a href="https://github.com/hilongjw/vue-lazyload" rel="nofollow noopener noreferrer" target="_blank">lazy loading</a>, <a href="https://github.com/Vivify-Ideas/vue-shortcuts" rel="nofollow noopener noreferrer" target="_blank">keyboard</a> navigation, <a href="https://github.com/nuxt-community/sitemap-module" rel="nofollow noopener noreferrer" target="_blank">sitemap generation</a> and <a href="https://axios.nuxtjs.org/" rel="nofollow noopener noreferrer" target="_blank">axios</a>.</p><p>After some experimentation I discovered that Nuxt didn’t quite work as I expected to. A statically generated version of the site only loads statically for the initial page load, the app is then bootstrapped and runs client side, making API requests back to the WordPress API. This is probably fine in most circumstances but I wanted to have a version of the site served over <a href="https://datproject.org/" rel="nofollow noopener noreferrer" target="_blank">Dat</a> (<a href="https://beakerbrowser.com/" rel="nofollow noopener noreferrer" target="_blank">the peer to peer web</a>) and would rather that it didn’t need the API. I was looking for a truly static site.</p><p>Luckily Nuxt has some hooks which allowed me to cache a local copy of the API responses as JSON during the build process. When deployed, the app will then query itself rather than the WordPress API. You can see some of the logic <a href="https://github.com/scottsweb/v1.scott.ee/blob/master/modules/generate.js" rel="nofollow noopener noreferrer" target="_blank">here</a> and <a href="https://github.com/scottsweb/v1.scott.ee/blob/master/plugins/axios.js" rel="nofollow noopener noreferrer" target="_blank">here</a>.</p><h2 id="wordpress"><a href="#wordpress" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>WordPress</h2><p>The WordPress side didn’t need a great deal of tinkering. I moved the site to api.scott.ee and set a redirect on that to the main site. I then introduced a couple of filters for supporting lazy loaded images and enabled <a href="https://jetpack.com/support/image-cdn/" rel="nofollow noopener noreferrer" target="_blank">photon in Jetpack</a> so images are served from a CDN. Images are the only thing that are not part of the generated build of the site.</p><p>WordPress should see very little traffic (if any) and only ever be hit when I want to write some new content or during the site build/generate process when the API is fetched and cached.</p><h2 id="performance"><a href="#performance" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Performance</h2><p>Nuxt takes care of a great deal of the app bundling, minification and optimisation for you. Add the PWA module and you can get a decent <a href="https://developers.google.com/web/tools/lighthouse/" rel="nofollow noopener noreferrer" target="_blank">Lighthouse</a> score right out the box. I also recommend installing the <a href="https://github.com/nuxt-community/webpackmonitor-module" rel="nofollow noopener noreferrer" target="_blank">Nuxt webpack monitor module</a> which allows you to inspect the size of your bundles which can be useful when you start to make use of third party add ons. Running <code>yarn nuxt build --webpackmonitor --analyze</code> will launch an interactive breakdown of how your site is put together.</p><p>The next thing to implement was lazy loading. Lazy loading ensures that images are not wasting bandwidth by loading unnecessarily. Using Jetpack’s photon CDN I can request a much smaller version of the original image to act as a loading image while the original, full size image, is fetched. I use CSS filters to blur the loading image slightly and make it greyscale. The result is rather neat.</p><p>My final trick for images is to detect low bandwidth (2G/3G) visitors and those with the <a href="https://support.google.com/chrome/?p=data_saver_off" rel="nofollow noopener noreferrer" target="_blank">data saver option enabled</a> in their browser. In <a href="https://github.com/scottsweb/v1.scott.ee/blob/master/plugins/lazyload.js#L18-L40" rel="nofollow noopener noreferrer" target="_blank">these scenarios</a> the image quality is reduced to 50% and the resolution divided by four.</p><p>As you page around the site a request for the next page is made in the background of the current page to help speed things up too.</p><h2 id="infrastructure"><a href="#infrastructure" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Infrastructure</h2><p>I had grand plans for this. My aim was to use Cloudflare’s load balancing feature to split the site hosting between Netlify and GitHub pages. That way if either service went down, the site would stay up. Cloudflare would also act as a third backup / cache if things got really messy. I struggled to get the load balancing health checks to work and the load balancing feature came in at a whopping cost of $5 a month so I decided to park that idea for now.</p><p>After some speed testing I decided to keep things simple. It turns out that GitHub pages are one of the fastest places to put your code and Cloudfare only seemed to make it slower (albeit just a little bit):</p><div class="nuxt-content-highlight"><pre class="language-text line-numbers"><code>netlify: sweden (no cloudflare)

First test: 2.04s 88/100
Second test: 1.79s 88/100
Third test: 1.69s 88/100

netlify: sweden (cloudflare)

First test: 3.17s 94/100
Second test: 2.20s 94/100
Third test: 3.17s 94/100

github: sweden (no cloudflare)

First test: 540ms 88/100
Second test: 200ms 88/100
Third test: 236ms 88/100

github: sweden (cloudflare)

First test: 786ms 94/100
Second test: 312ms 94/100
Third test: 277ms 94/100
</code></pre></div><h2 id="dat"><a href="#dat" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Dat</h2><p>Dat describes itself as:</p><blockquote><p>A p2p hypermedia protocol. It provides public-key-addressed file archives which can be synced securely and browsed on-demand.</p></blockquote><p>In short, you can host your website using peer to peer technology and it is super exciting. Everyone that visits a site is also potentially a host of the site.</p><p>In order to visit the Dat version of my site you can use the Beaker browser. Using Dat DNS allows the site to be found at: dat://scott.ee/. There is currently one mirror/peer that is always online at hashbase.io and one of my next projects will be to set a Raspberry Pi to the task of providing another mirror. I would love to see some other mirrors pop up too if you feel like adding it to your library.</p><p>Using Nuxt to statically generate the site makes pushing to Dat a much simpler task, I am not really sure how WordPress will adapt to the peer to peer web as things currently stand.</p><h2 id="the-results"><a href="#the-results" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>The Results</h2><p>So how did I do with my goals?</p><p><em><strong>Learn</strong>. I work with React most days so I wanted to try something else to better understand modern web development, not just a particular framework</em></p><p>Completed. I am fairly comfortable with the basics of Vue now and learnt a great deal about Nuxt as well.</p><p><em><strong>Speed</strong>. I wanted a site that is fast, lightweight and better for the planet</em></p><p>Pretty good, the load time hovers around 300ms and the page size at around 130kb without images. The lighthouse scores are fairly decent too with the lowest score being 73 for progressive web app features (this is mostly because I have disabled the service worker while I get up to speed with how they work).</p><p>It turns out that a friend and colleague at work has also been experimenting with making WordPress more planet friendly at the same time. I highly recommend taking a read of his post on serving WordPress in just 7kb! quite the achievement and it shows there is probably a great deal room for improvement here.</p><p><em><strong>Resilient</strong>. A site can handle LOTS of traffic and to be redundant via the peer to peer web</em></p><p>Moderate. Without the load balancing there is a single point of failure. Having the Dat version ticks the box for the P2P web although I would like to consider seeding the site on other protocols as well.</p><p><em><strong>Low cost</strong>. Less than £15 a month to host and maintain</em></p><p>Complete. Cost is £0.</p><p><em><strong>Privacy built in</strong>. No trackers, externally hosted JavaScript or fonts</em></p><p>Complete. No need for GDPR compliance 🙂</p><h2 id="what-next"><a href="#what-next" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>What Next?</h2><p>I treated this a purely a technical exercise rather than a design one but it provides the foundations for something much more interesting. My plans include:</p><ul><li>Gutenberg support</li><li>Sustainable hosting. Performance is one part of the battle</li><li>Store preservation between sessions which may be a better approach than the locally cached API during build</li><li>Service worker support. I would like to get the Lighthouse score to 100 and find some other performance gains</li><li>An automated build and deploy script that only builds the difference in content</li></ul><p>If you are interested in the code you can find on GitHub:</p><p><a href="https://github.com/scottsweb/v1.scott.ee." rel="nofollow noopener noreferrer" target="_blank" class="button">View the code on GitHub</a></p>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Jetpack Search]]></title>
            <link>https://scott.ee/project/jetpack-search</link>
            <guid>https://scott.ee/project/jetpack-search</guid>
            <pubDate>Tue, 07 Apr 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Bringing instant and relevant site search to WordPress]]></description>
            <content:encoded><![CDATA[<div class="grid project-overview grid" style="grid-gap:var(--rhythm)"><div class="v-container project-summary"><ul><li><strong>Role</strong>: Design lead</li><li><strong>Skills</strong>: UX research, UI design, Prototyping, Testing</li></ul></div><div class="v-container project-introduction"><ul><li><strong>Tools</strong>: Figma, WordPress, React</li><li><strong>Duration</strong>: Four months</li><li><strong>Iterations</strong>: Four</li></ul></div></div><p>Search has typically been a challenge with WordPress, especially for larger sites with extensive content archives. <a href="https://jetpack.com/upgrade/search/" rel="nofollow noopener noreferrer" target="_blank">Jetpack Search</a> was created as a simple way to bring the power of <a href="https://www.elastic.co/" rel="nofollow noopener noreferrer" target="_blank">Elasticsearch</a> to WordPress.</p><p>Jetpack Search was originally only available as part of the higher tier Jetpack plans. In early 2020, we embarked on a project to create a standalone product that brought improvements to speed, ranking, indexing and theme compatibility.</p><div class="grid width-wide" style="--columns:3;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-filter.gif?w=528&amp;strip=info" alt="Animated demo of search filtering" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-devices.gif?w=528&amp;strip=info" alt="Animated demo of search working on mobile and desktop devices" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-instant.gif?w=528&amp;strip=info" alt="Animated demo of instant search" class="rss-image"></div></div><h2 id="research"><a href="#research" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Research</h2><p>The research for this project was fairly extensive. We explored competing products, <a href="https://jetpackresearch.typeform.com/to/RjnEkg" rel="nofollow noopener noreferrer" target="_blank">surveyed existing Jetpack Search customers</a> and performed short internal interaction tests to fine tune behaviour of the product.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-survey.png?w=1280&amp;strip=info" alt="Email and survey results" class="rss-image"></figure><p>The research helped us prioritise our roadmap and identify the following features as our main areas of focus:</p><ul><li>Relevance (8.5)</li><li>Search speed (8.4)</li><li>Facets (7.5)</li><li>Prioritising search results (7.2)</li><li>Ability to customise the look and feel of results without code (6.7)</li></ul><h2 id="challenges"><a href="#challenges" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Challenges</h2><p>Ensuring theme compatibility was our biggest challenge. There are hundreds of thousands of commercial themes to accommodate and bespoke themes too. We set out to find a solution that was theme agnostic, a balance between a opinionated design and something that inherits the look and feel of your chosen theme and brand.</p><p>We also wanted to ensure:</p><ul><li>Instant search lived up to its name, providing results as you type</li><li>We could support large data sets with filters and faceting options</li><li>Search worked on all devices, from desktop to mobile</li><li>Searches were linkable and search engine friendly</li><li>Customers could purchase and immediately use Jetpack Search</li></ul><div class="v-container width-full background-subtle"><div><!----><img src="/images/jetpack-search-user-flow.svg" alt="User journey for Jetpack Search setup and purchase" class="rss-image"></div></div><p>Refining the user journey allowed us to reduce the time from initial purchase through to working product. This created its own set of unique challenges — the most difficult was determining the point at which we were able to begin indexing the site. Ideally the index will have processed at least the last few weeks of content, ensuring that the customer can test the product after purchase. An incomplete index would potentially make the product look broken, so we needed a way to highlight index progress if it was still ongoing by the time the customer returned to their site.</p><h2 id="solutions"><a href="#solutions" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Solutions</h2><p>We solved theme compatibility issues by creating a search overlay. The overlay would inherit some theme styles such as typography and link colours, but also impose much needed restrictions on layout and behaviour. This allows us to deliver features of the product like faceted results and search as you type without having to worry how a theme has been created.</p><div class="v-container width-wide browser-mockup"><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-ui.png?w=1600&amp;strip=info" alt="Jetpack Search overlay on a website showing results for chocolate" class="rss-image"></figure></div><p>Within the WordPress administration interface we also created some new UI elements to communicate the index progress and also plan usage. Jetpack Search is billed per record, so it is important customers understand at which point they are likely to be moved to the next billing tier.</p><div class="v-container width-wide soft-background p-one rounded"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-settings.png?w=1600&amp;strip=info" alt="Jetpack Search settings in WP Admin" class="rss-image"></div></div><h2 id="prototyping"><a href="#prototyping" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Prototyping</h2><p>There were two key interactions that we wanted to refine in order to make the product feel instant and responsive.</p><p>The first was how the search experience was triggered. Most WordPress themes already have a search field somewhere on the site which gave us multiple options for how the search overlay is triggered; either on focus or after the initial query..</p><p>The second thing we wanted to test was the impact of search as you type. Whilst Google have normalised this, we wanted to understand how it impacted the perceived speed of the product and also test our APIs to ensure they are nice and responsive.</p><p>I developed a <a href="https://gist.github.com/scottsweb/e95e5819d6c4192779dfa010b20a6dbb" rel="nofollow noopener noreferrer" target="_blank">one file plugin for WordPress</a> that allowed us to test ideas quickly in the most popular 20 WordPress themes. We used the plugin to test these specific interactions with customers before having to invest in their development.</p><div class="grid width-wide soft-background p-one rounded" style="--columns:2;grid-gap:var(--rhythm)"><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-onclick.gif?w=800&amp;strip=info" alt="Animation demonstrating search on click" class="rss-image"></figure><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-search-onfocus.gif?w=800&amp;strip=info" alt="Animation demonstrating search on focus" class="rss-image"></figure></div><h2 id="results"><a href="#results" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Results</h2><blockquote><p>I like having a search experience that is sortable, filterable, and feels like it's integrated natively into the site. Jetpack Search does all of this, but most importantly, it returns great results without heavy configuration.</p><figcaption>— Chris Coyier, <cite><a href="https://css-tricks.com/">CSS Tricks</a></cite></figcaption></blockquote><p>Spinning search into a separate product has worked out well. The lower cost tiers proved really popular with customers just looking to improve search and that didn't need many of the other Jetpack tools and features. New purchasers have been increasing steadily (~45% MoM each month since launch).</p><p>This isn't the end of the journey for Jetpack Search. We have already began collecting feedback for further refinements to the product including search analytics and greater control over what content is pushed to the search index.</p><p><a href="https://css-tricks.com/" rel="nofollow noopener noreferrer" target="_blank" class="button">Try Jetpack Search on CSS Tricks</a></p>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Unsplash]]></title>
            <link>https://scott.ee/project/unsplash</link>
            <guid>https://scott.ee/project/unsplash</guid>
            <pubDate>Fri, 01 May 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Archiving analogue photography for the people]]></description>
            <content:encoded><![CDATA[<p>Over the last 15 years Gemma and I have collected and inherited numerous old cameras and have been shooting analogue film photography on <a href="https://stayandroam.blog/" rel="nofollow noopener noreferrer" target="_blank">our adventures and holidays</a>.</p><p>While packing to move to Sweden, we realised we had hundreds of rolls of negatives and boxes of prints that we had not done a great deal with. Some films were full of random experiments, others taken on expired and untrustworthy film. Some captured something beautiful and others went straight to the bin. Those that survived were put into boxes and shipped to Stockholm.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/unsplash-camera.jpg?w=1600&amp;strip=info" alt="Rollei sitting on a windowsill" class="rss-image"></figure><h2 id="let-the-archiving-commence"><a href="#let-the-archiving-commence" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Let the archiving commence</h2><p>The Covid-19 pandemic proved the opportune time to start doing something with them. We fired up our scanners and began uploading our favourites to <a href="https://unsplash.com/" rel="nofollow noopener noreferrer" target="_blank">Unsplash</a>. Founded in 2013 as a Tumblr blog, Unsplash has grown into an industry-leading visual community. Despite their sometimes confusing approach to licensing, it remains one of the most active and supportive photography communities.</p><div class="grid width-full" style="--columns:4;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-boat.jpg?w=400&amp;strip=info" alt="Photograph of docked boat" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-climate-poster.jpg?w=400&amp;strip=info" alt="System change not climate change poster against wall" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-forest.jpg?w=400&amp;strip=info" alt="Wooden boards leading into forest" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-stockholm-gronalund.jpg?w=400&amp;strip=info" alt="Stockholm's Grönalund theme park" class="rss-image"></div></div><div class="grid width-full" style="--columns:2;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-bike.jpg?w=800&amp;strip=info" alt="Photograph of docked boat" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/unsplash-texture.jpg?w=800&amp;strip=info" alt="System change not climate change poster against wall" class="rss-image"></div></div><p>These are just a handful of my favourites, you will find the rest on <a href="https://unsplash.com/@scottsweb" rel="nofollow noopener noreferrer" target="_blank">mine</a> and <a href="https://unsplash.com/@stayandroam" rel="nofollow noopener noreferrer" target="_blank">Gemma's</a> Unsplash profiles.</p><p><a href="https://unsplash.com/@scottsweb" rel="nofollow noopener noreferrer" target="_blank" class="button">View my film photos on Unsplash</a></p>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Jetpack Cloud]]></title>
            <link>https://scott.ee/project/jetpack-cloud</link>
            <guid>https://scott.ee/project/jetpack-cloud</guid>
            <pubDate>Sat, 16 Mar 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Redefining Jetpack as a security focused product]]></description>
            <content:encoded><![CDATA[<div class="grid project-overview grid" style="grid-gap:var(--rhythm)"><div class="v-container project-summary"><ul><li><strong>Role</strong>: Design lead</li><li><strong>Skills</strong>: UI design, Prototyping, Testing, User Interviews, Animation</li></ul></div><div class="v-container project-introduction"><ul><li><strong>Tools</strong>: Figma, Anime.js, Calypso</li><li><strong>Duration</strong>: Six months</li><li><strong>Iterations</strong>: Fifteen</li></ul></div></div><p><a href="https://wordpress.org/plugins/jetpack/" rel="nofollow noopener noreferrer" target="_blank">Jetpack</a> is a open source WordPress plugin for self-hosted WordPress users. Jetpack provides stats, email subscriptions, backups, malware scanning, anti-spam, and more. Its wide range of features makes it extremely popular with over 5 million active installs.</p><figure><!----><!----><!----><img src="/images/jetpack-cloud-logo.svg" alt="Jetpack logo on green background" class="rss-image"></figure><h2 id="challenges"><a href="#challenges" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Challenges</h2><p>In 2019 market research indicated that security and malware remained the top concerns for WordPress users. Jetpack had backups, login protection, anti-spam and malware scanning, but they were relatively hidden among all the other features of the product. Given the high demand for these features we decided to refocus Jetpack on security.</p><h3 id="audience"><a href="#audience" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Audience</h3><p>The audience for Jetpack is as broad as its feature set. The key audiences are the end users; the website builders and development agencies that are integrating Jetpack features into their sites and builds. But Jetpack also has partnerships with hosting agencies and relationships with other internal Automattic teams too. This project was aimed towards our end users, but would deliver benefits to hosting partners who can leverage Jetpack security products in their own platforms.</p><h3 id="scan-and-backup"><a href="#scan-and-backup" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Scan and backup</h3><p>Two teams were formed; one for backup and the other for scan. My team focused on delivering a new UI for Jetpack Scan and my roles included UI design, copywriting and prototype development. We defined the following goals:</p><ul><li>To provide the best customer experience for Jetpack Scan</li><li>To make the Jetpack Cloud a security focused customer experience</li><li>To provide an API and destination for customers of Jetpack hosting partners</li><li>To retire the legacy Automattic security plugin, <a href="https://vaultpress.com/" rel="nofollow noopener noreferrer" target="_blank">VaultPress</a></li><li>To reduce security related support inquiries</li></ul><h2 id="solutions"><a href="#solutions" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Solutions</h2><p>The Jetpack Cloud is built on top of the <a href="https://wpcalypso.wordpress.com/devdocs/design" rel="nofollow noopener noreferrer" target="_blank">Calypso framework</a>. This allowed us to move much quicker, inheriting the existing component library.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-ui.png?w=1280&amp;strip=info" alt="Jetpack Scan desktop and mobile UI" class="rss-image"></figure><p>The first release of the UI was reduced to all that was necessary. A scan will begin instantly once your purchase is complete. You are then presented with scan results (if there are any) and history of previous actions taken.</p><p>We used animation to help communicate state within the product. It also added a little bit of interest to the UI which is sometimes blocked by long running tasks. These are available on <a href="https://codepen.io/scottsweb" rel="nofollow noopener noreferrer" target="_blank">CodePen</a> if you wish to see them larger.</p><div class="grid width-wide" style="--columns:4;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-running.gif?w=400&amp;strip=info" alt="Animation showing scan running" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-ok.gif?w=400&amp;strip=info" alt="Animated of scan OK" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-help.gif?w=400&amp;strip=info" alt="Animated help icon" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-error.gif?w=400&amp;strip=info" alt="Animated error icon" class="rss-image"></div></div><h2 id="refinements"><a href="#refinements" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Refinements</h2><p>Shortly after launch we were seeing a high failure rate with customers attempting to save their hosting credentials. Having hosting credentials on file allows us to perform one click fixes of known security threats and also improves the reliability of our backups product. Our data indicated:</p><ul><li><strong>54%</strong> of all failures were caused by entering incorrect credentials</li><li><strong>22%</strong> of failures occurred on a single host</li></ul><p>We created two new mini projects, one to create automated credential sharing with the the largest host and the other to improve the credentials form and flow.</p><div class="grid width-wide side-by-side" style="--columns:2;grid-gap:var(--rhythm)"><div><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-original-credentials-form.png?w=800&amp;strip=info" alt="Original simple form" class="rss-image"></div><p>The original form was quite primitive. It provided little support on where to find the information you need and didn't guide you through the process. It also didn't provide guidance when errors did occur with just a single generic error message.</p></div><p>The following image shows the updated flow for the new form. The form was broken into four parts:</p><ol><li><strong>Host selection</strong>: We provide a list to of common hosts but also make a best guess as to what your current host is and put it at the top.</li><li><strong>Credentials form</strong>: The form responds to the type of credential selected and the inline documentation provides hints and a link to your chosen host and related documentation.</li><li><strong>Credential verification</strong>: The credentials are tested in a stepped fashion in order to show the user at what point the failure occurs. This makes it easier to understand the error and adjust accordingly.</li><li><strong>Confirmation</strong>: If everything looks good, you save your credentials.</li></ol><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/jetpack-scan-credentials-blueprint.png?w=1600&amp;strip=info" alt="Updated form user flow" class="rss-image"></figure><p>The form went through twelve design iterations as we refined the flow and ensured we handled all edge cases. Within just a few weeks of releasing the updated form we were seeing around a 30% reduction in failures.</p><h2 id="results"><a href="#results" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Results</h2><p>Since launch, Jetpack Scan has become the third most popular Jetpack product and has been one of the best performing products in 2021. We are investing heavily in improving the underlying scan system, making it better at both detecting and fixing errors. Our customers appreciate the simplicity and peace of mind.</p><blockquote><p>My website is my home for everything I do, so it’s important that it's always online for all of my readers and listeners. Jetpack handles my site security and backups, so I can stay focused on keeping a 4-hour workweek.</p><figcaption>— Tim Ferriss, <cite><a href="https://fourhourworkweek.com/" rel="nofollow noopener noreferrer" target="_blank">4-hour workweek</a></cite></figcaption></blockquote><p>Two major hosts are looking to integrate our backups and scans products into their WordPress hosting plans and we will hopefully see the first of those launch in the near future.</p><p>We are hoping to recreate some of the successes we have seen by breaking Jetpack into more focused solutions. This will hopefully be better value and provide greater clarity around the Jetpack product family for our customers.</p><p><a href="https://jetpack.com/features/security/" rel="nofollow noopener noreferrer" target="_blank" class="button">Learn more about Jetpack Security</a></p>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Watz]]></title>
            <link>https://scott.ee/project/watz</link>
            <guid>https://scott.ee/project/watz</guid>
            <pubDate>Sun, 15 Jul 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Open source energy monitor built upon a Particle Photon]]></description>
            <content:encoded><![CDATA[<p>I believe it was some time in 2016 when the UK set out plans install smart energy meters in all UK homes.</p><p>At first glance it seemed like a good idea. It would remove the need to report meter readings manually each month and allow home owners to see (in realtime) their energy consumption. Hopefully that would lead them to adjust their usage, saving both energy and money.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/watz-prototype.jpg?w=1600&amp;strip=info" alt="Prototype circuitry for Watz energy monitor" class="rss-image"></figure><p>It raised two concerns for me. The first is that the data would not be available locally. The meters report energy use to the supplier and there is no requirement for them to provide an API or access to the data they are collecting. Being able to see energy use over time would be a great way to spot trends and decide if we would be better suited to a different energy tariff.</p><p>My second concern was privacy. You can tell a great deal about a home and the people who live there from their energy use. You can determine what time they wake up, what time they make dinner, see if anyone is home and how efficient their fridge is. I would rather be in control of where that data goes.</p><p>By 2018 it was clear that we wouldn't be getting a smart meter any time soon and so I set about creating my own that would require zero modifications of our meter.</p><p>My solution is called Watz.</p><p>Watz is a WiFi smart meter built around a <a href="https://store.particle.io/collections/wifi/products/photon" rel="nofollow noopener noreferrer" target="_blank">Particle Photon</a>. It mounts to the LED on your electricity meter and measures the number of pulses in a given time period (sometimes referred to as a pulse counter). This is used to generate almost real time power information.</p><div class="v-container browser-mockup"><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/watz-emoncms.png?w=1600&amp;strip=info" alt="Screenshot of graphs showing energy use in Emoncms" class="rss-image"></figure></div><p>The data is periodically pushed to the Particle cloud and can be subscribed to via server-sent events. To make the data a little more accessible I used <a href="https://nodered.org/" rel="nofollow noopener noreferrer" target="_blank">Node-RED</a> to subscribe to the events and push the data to the open source <a href="https://github.com/emoncms/emoncms" rel="nofollow noopener noreferrer" target="_blank">Emoncms</a>. Emoncms is a platform designed to track energy consumption.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/watz-live.jpg?w=1600&amp;strip=info" alt="Energy meter in cupboard with wires and blue tack" class="rss-image"></figure><p>Our meter sat outside by our front door so I ended up using a fairly large battery and a small solar panel to keep the device topped up with power. This meant I had to reduce the frequency of data being pushed to ten minutes as firing up the Wifi connection proved rather expensive in terms of power.</p><p>The firmware, component list, circuit diagram and code can be found on my GitHub account if you would like to build your own.</p><p><a href="https://github.com/scottsweb/watz" rel="nofollow noopener noreferrer" target="_blank" class="button">View the project on GitHub</a></p>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/watz-prototype.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The WordPress of Things]]></title>
            <link>https://scott.ee/project/wordpress-of-things</link>
            <guid>https://scott.ee/project/wordpress-of-things</guid>
            <pubDate>Tue, 24 Mar 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[Connecting WordPress and the Internet of things]]></description>
            <content:encoded><![CDATA[<p>I gave my first ever WordCamp talk on Sunday as part of <a href="/project/wordcamp-london/">WordCamp London 2015</a>. I was booked in for a short lightning talk slot on the design track and decided to share some of the experimentation I have been doing with WordPress and the <a href="https://www.particle.io/" rel="nofollow noopener noreferrer" target="_blank">Particle Core</a>.</p><p>The Particle Core is an Arduino-compatible, Wi-Fi enabled, cloud-powered development platform that makes creating internet-connected hardware a quick and simple. Most importantly it is open hardware and software — sharing the WordPress philosophy.</p><p>My slides are below and I have also added a few of the GitHub links to various experimentations and tools mentioned throughout the talk. If you have any questions ping me <a href="https://twitter.com/scottsweb" rel="nofollow noopener noreferrer" target="_blank">on twitter</a>.</p><div data-oembed="" class="remark-oembed-inline remark-oembed-speaker-deck"><iframe id="talk_frame_292940" src="//speakerdeck.com/player/e7ab1771cbd64bbe87c4681a654cfe55" width="710" height="532" frameborder="0" allowtransparency="true" allowfullscreen="" class="speakerdeck-iframe" style="aspect-ratio:710/532;border:0;padding:0;margin:0;background:0 0"></iframe></div><ul><li><a href="https://github.com/scottsweb/nimbus" rel="nofollow noopener noreferrer" target="_blank">Nimbus</a> — A Spark Core Weather Station</li><li><a href="https://github.com/scottsweb/sparky" rel="nofollow noopener noreferrer" target="_blank">Sparky</a> — Shortcodes for your Particle Core</li><li><a href="https://ifttt.com/" rel="nofollow noopener noreferrer" target="_blank">IFTTT</a> — Easy way to connect all the things</li><li><a href="https://github.com/scottsweb/ham" rel="nofollow noopener noreferrer" target="_blank">Ham</a> — Home Automation Machine</li></ul><p>A video of the talk is now <a href="https://wordpress.tv/2015/05/31/dave-redfern-lance-willett-julio-potier-scott-evans-lightning-talks-design/" rel="nofollow noopener noreferrer" target="_blank">available on WordPress.tv</a>.</p><script async="" defer="">const isDocumentReady = () =&gt; {
      if (document.readyState !== 'complete') {
        document.addEventListener('readystatechange', isDocumentReady);
        return false;
      }

      requestAnimationFrame(() =&gt; {
        
    document.querySelectorAll('div[data-oembed]').forEach((el) =&gt; {
      const template = el.querySelector('[data-oembed-template]').content.cloneNode(true);
      el.innerHTML = '';
      el.attachShadow({ mode: 'closed' }).appendChild(template);
    });

    document.querySelectorAll('img[data-oembed][data-src]').forEach((img) =&gt; {
      img.setAttribute('src', img.getAttribute('data-src'));
      img.removeAttribute('data-src');
    });

    document.querySelectorAll('[data-oembed]').forEach((el) =&gt; {
      el.removeAttribute('data-oembed');
    });
  ;
      });

      return true;
    };

    if (!isDocumentReady()) {
      document.addEventListener('readystatechange', isDocumentReady);
    }</script>]]></content:encoded>
            <enclosure url="https://scott.ee/og-card.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[WordCamp London]]></title>
            <link>https://scott.ee/project/wordcamp-london</link>
            <guid>https://scott.ee/project/wordcamp-london</guid>
            <pubDate>Thu, 01 Jan 2015 00:00:00 GMT</pubDate>
            <description><![CDATA[Design for the UK's largest WordPress conference]]></description>
            <content:encoded><![CDATA[<div class="grid project-overview grid" style="grid-gap:var(--rhythm)"><div class="v-container project-summary"><ul><li><strong>Role</strong>: Design lead</li><li><strong>Skills</strong>: Ideation, Branding, Graphic design, Swag design</li></ul></div><div class="v-container project-introduction"><ul><li><strong>Tools</strong>: Creative Suite, WordPress</li><li><strong>Duration</strong>: Six months (part time)</li><li><strong>Iterations</strong>: Five</li></ul></div></div><p><a href="https://central.wordcamp.org/" rel="nofollow noopener noreferrer" target="_blank">WordCamps</a> are conferences dedicated to everything WordPress. <a href="https://london.wordcamp.org/2015/" rel="nofollow noopener noreferrer" target="_blank">WordCamp London 2015</a> was a 3 day conference held at London Metropolitan University from 20th – 22nd March. As with all WordCamps, it was organised by volunteers who are passionate about WordPress and the WordPress community.</p><p>Whilst I have designed for and volunteered at a number of WordCamps, this stands out as my all time favourite.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-collage.jpg?w=1600&amp;strip=info" alt="London graphic in punk style" class="rss-image"></figure><h2 id="punk-rocks"><a href="#punk-rocks" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Punk rocks</h2><p>For WordCamp London the organising team were keen to find a theme for overall conference design. I created a number of mood boards that covered things we considered to be typically “London” and developed ideas from that.</p><p>There was one idea that stood out and having grown up on a diet of punk rock, it felt like a natural fit. WordCamp London 2015 would be based on the punk rock subculture of the 70's. It would give us a conference that is fun, bright and distinct.</p><div size-s="" size-m="" size-l="" class="grid width-full" style="--columns:4;grid-gap:0"><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-1.jpg?w=400&amp;strip=info" alt="Registration desk at WordCamp London" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-2.jpg?w=400&amp;strip=info" alt="Panel discussion at WordCamp London" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-3.jpg?w=400&amp;strip=info" alt="Computer screen and WordCamp London attendee" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-4.jpg?w=400&amp;strip=info" alt="Wapuu mascot and London calling stickers" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-5.jpg?w=400&amp;strip=info" alt="Jenny Wong working at a laptop during WordCamp London" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-6.jpg?w=400&amp;strip=info" alt="Hundreds of Wapuunk stickers" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-7.jpg?w=400&amp;strip=info" alt="Two WordCamp Londo posters on the wall" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-8.jpg?w=400&amp;strip=info" alt="Crowd during contributor day at WordCamp London" class="rss-image"></div></div><h2 id="adopting-wapuu"><a href="#adopting-wapuu" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Adopting Wapuu</h2><p>The WordPress mascot <a href="https://wapu.us/wapuu-history-origin/" rel="nofollow noopener noreferrer" target="_blank">Wapuu</a> was born out of the Japanese WordPress community. Whilst the mascot had been used in Japan since 2011, very few WordCamps outside of Japan were adopting the mascot. For WordCamp London we wanted to change that.</p><figure><!----><!----><!----><img src="/images/wordcamp-london-wapuunk.svg" alt="Wapuu mascot charachter dressed as a punk" class="rss-image"></figure><p>Meet Wapuunk! The only Wapuu with DM boots, a mowhawk and safety pin piecing. The little mascot I designed became the <a href="https://wptavern.com/scott-evans-on-designing-the-punk-wapuu-for-wordcamp-london-2015" rel="nofollow noopener noreferrer" target="_blank">star of the show</a> and was made available to purchase via the <a href="https://mercantile.wordpress.org/product/wapuunk-t-shirt/" rel="nofollow noopener noreferrer" target="_blank">WordPress swag store</a> shortly after the event. The money raised from the sales has been used to support the WordPress foundation.</p><p>Wapuu is completely open source, the source code can be <a href="https://github.com/jawordpressorg/wapuu" rel="nofollow noopener noreferrer" target="_blank">found on GitHub</a> along with the original <a href="http://jawordpressorg.github.io/wapuu/" rel="nofollow noopener noreferrer" target="_blank">Wapuu gallery</a>.</p><h2 id="swag"><a href="#swag" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Swag</h2><p>All good WordCamps provide a unique piece of swag to remember the event, normally in the form of a t-shirt. We had some t-shirts made, but given the event was taking place on the tail end of a British winter, we decided we needed a little something extra. The result was a scarf, featuring Wapuunk of course.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/wordcamp-london-scarf.jpg?w=1600&amp;strip=info" alt="Wapuu mascot embroided on pink and black scarf" class="rss-image"></figure><blockquote><p>Huge props to @scottsweb for the best WordCamp branding &amp; swag I've seen to date. Amazing work, Scott &lt;3 #wcldn</p><figcaption>— Petya Raykovsk, <cite><a href="https://twitter.com/petyeah/status/579952989844201473" rel="nofollow noopener noreferrer" target="_blank">@petyeah</a></cite></figcaption></blockquote><div data-oembed="" class="remark-oembed-inline remark-oembed-twitter"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Wordcamp London was fun &amp; as a 10 yr WP user, I was especially glad to get a pink-mohawked WP laptop sticker <a href="https://twitter.com/hashtag/wcldn?src=hash&amp;ref_src=twsrc%5Etfw">#wcldn</a> <a href="http://t.co/tVgDdumVXq">pic.twitter.com/tVgDdumVXq</a></p>— Bruce Lawson (@brucel) <a href="https://twitter.com/brucel/status/579978868502712320?ref_src=twsrc%5Etfw">March 23, 2015</a></blockquote><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><p>We also made digital swag for those that couldn't attend the event in person. You can download posters and wallpapers from the event website, all under a creative commons licence.</p><p><a href="https://london.wordcamp.org/2015/wapuunk-wallpapers-and-more/" rel="nofollow noopener noreferrer" target="_blank" class="button">Grab some digital swag</a></p><script async="" defer="">const isDocumentReady = () =&gt; {
      if (document.readyState !== 'complete') {
        document.addEventListener('readystatechange', isDocumentReady);
        return false;
      }

      requestAnimationFrame(() =&gt; {
        
    document.querySelectorAll('div[data-oembed]').forEach((el) =&gt; {
      const template = el.querySelector('[data-oembed-template]').content.cloneNode(true);
      el.innerHTML = '';
      el.attachShadow({ mode: 'closed' }).appendChild(template);
    });

    document.querySelectorAll('img[data-oembed][data-src]').forEach((img) =&gt; {
      img.setAttribute('src', img.getAttribute('data-src'));
      img.removeAttribute('data-src');
    });

    document.querySelectorAll('[data-oembed]').forEach((el) =&gt; {
      el.removeAttribute('data-oembed');
    });
  ;
      });

      return true;
    };

    if (!isDocumentReady()) {
      document.addEventListener('readystatechange', isDocumentReady);
    }</script>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/wordcamp-london-collage.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[toggle]]></title>
            <link>https://scott.ee/project/toggle</link>
            <guid>https://scott.ee/project/toggle</guid>
            <pubDate>Fri, 16 Aug 2013 00:00:00 GMT</pubDate>
            <description><![CDATA[Handmade technology cases for precious gadgets]]></description>
            <content:encoded><![CDATA[<div class="grid project-overview grid" style="grid-gap:var(--rhythm)"><div class="v-container project-summary"><ul><li><strong>Role</strong>: Website design</li><li><strong>Skills</strong>: UI design, Development, Branding, Illustration</li></ul></div><div class="v-container project-introduction"><ul><li><strong>Tools</strong>: Creative Suite, WordPress</li><li><strong>Duration</strong>: Two months</li><li><strong>Iterations</strong>: Three</li></ul></div></div><p>toggle was a boutique gadget case company. Each case a handmade labour of love, designed to protect your precious gadgets, with a little extra personality.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/toggle-case.jpg?w=1600&amp;strip=info" alt="Grey knitted case for iPhone with large wooden toggle" class="rss-image"></figure><p>The company was created to offer an alternative to the mass produced, environmentally destructive, synthetic cases that had flooded the market since the release of the first iPhone. The bet was that if people were going to be spending thousands of pounds on smartphones and laptops, they would want to give them a little extra love and protection.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/toggle-robot-ears.png?w=1600&amp;strip=info" alt="Boxy looking robot with ear horns" class="rss-image"></figure><p>toggle cases were all made from sustainable materials such as wool, upcycled fabrics and old clothing. The products were shipped in recycled “preloved” packaging too.</p><p>We liked to say the cases were “made by people, for machines”.</p><div class="v-container width-wide browser-mockup"><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/toggle-website.jpg?w=1600&amp;strip=info" alt="Grey knitted case for iPhone with large wooden toggle" class="rss-image"></figure></div><p>This was the third version of the toggle shop that I designed and built. This version was powered by WooCommerce and WordPress.</p><div size-s="" size-m="" size-l="" class="grid width-full" style="--columns:4;grid-gap:0"><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-1.jpg?w=400&amp;strip=info" alt="Pink vintage iPhone case" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-2.jpg?w=400&amp;strip=info" alt="Knitted blue laptop case with chunky wood buttons" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-3.jpg?w=400&amp;strip=info" alt="Two polka dot iPhone cases" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-4.jpg?w=400&amp;strip=info" alt="Knitted iPad case in white" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-5.jpg?w=400&amp;strip=info" alt="Postage label for preloved packaging" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-6.jpg?w=400&amp;strip=info" alt="Phone case with blue hearts" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-7.jpg?w=400&amp;strip=info" alt="Large wooden button" class="rss-image"></div><div><!----><img src="//i0.wp.com/scott.ee/images/toggle-8.jpg?w=400&amp;strip=info" alt="Upcycled iPad case made from beige shorts" class="rss-image"></div></div><p>Unfortunately we had to wind the project down as the cost per case was pushing too high to be sustainable when competing against the mass produced cases on shops like Amazon.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/toggle-robot-bin.png?w=1600&amp;strip=info" alt="Robot parts sticking out of the bin" class="rss-image"></figure>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/toggle-case.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[One More Thing]]></title>
            <link>https://scott.ee/journal/one-more-thing</link>
            <guid>https://scott.ee/journal/one-more-thing</guid>
            <pubDate>Mon, 14 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[Columbo. There is a great deal a designer can learn from this unassuming TV detective.]]></description>
            <content:encoded><![CDATA[<p>I have a guilty pleasure. On a Sunday afternoon when the weather is bad I like nothing more than to sit down to an episode of <a href="https://en.wikipedia.org/wiki/Columbo" rel="nofollow noopener noreferrer" target="_blank">Columbo</a>. We have the entire box set and have made our way though every episode, including the pilots of Mrs Columbo. Watching a random episode is now just an: “Alexa, ask Plex to play Columbo” away. Bliss.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/one-more-thing.jpg?w=1600&amp;strip=info" alt="Columbo thinking deeply with head (and cigar) in hand" class="rss-image"></figure><p>Today is no exception and watching the way he interrogates, questions and learns had me realise that there is a great deal a designer can learn from this unassuming TV detective.</p><h2 id="ask-the-right-question-at-the-right-time"><a href="#ask-the-right-question-at-the-right-time" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Ask the right question at the right time</h2><p>Columbo is famous for his catchphrase “Just one more thing…”, which is his way of squeezing in one last question before he leaves. As a detective he thrives on data and knows the right questions to ask and when to ask them.</p><p>This week I have been gathering plugin data across our VIP Go platform and using it to better understand how clients are using plugins on our platform. My aim is to reduce the number of options available for managing plugins and for us to provide a better service when it comes to updates and security fixes. The question I am asking myself right now is: what plugins are in use and how have they been activated?</p><p>We will start collecting the data and graphing it over time so we can actively monitor the progress of my work from start to finish. I can see the same data being hugely useful as time goes on. We just haven’t found the need to ask the next question yet.</p><h2 id="put-yourself-in-your-strikekillersstrike-customers-shoes"><a href="#put-yourself-in-your-strikekillersstrike-customers-shoes" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Put yourself in your <strike>killers</strike> customers shoes</h2><p>In “<a href="http://www.imdb.com/title/tt0069901/" rel="nofollow noopener noreferrer" target="_blank">Any Old Port in a Storm</a>” the murder takes places in a winery. The murderer is a wine connoisseur and in order to understand how the killing took place Columbo immerses himself in the world of wine. The knowledge he gains from his research allows him to solve the case and determine where the body was stored. The research also created a huge amount of empathy between Columbo and the killer.</p><p>With the launch of the <a href="https://vip.wordpress.com/" rel="nofollow noopener noreferrer" target="_blank">new VIP website</a> a few weeks ago it has been a great reminder of the challenges our clients face when they need to push code from a modern version control environment like GitHub to our SVN setup on WordPress.com. Putting ourselves through the same experience as our clients has been immensely valuable and highlighted some of the pain points developers face with our WordPress.com platform. We are hoping to use our new found empathy to help streamline the process if possible.</p><h2 id="equipment-doesnt-have-to-be-the-best"><a href="#equipment-doesnt-have-to-be-the-best" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Equipment doesn’t have to be the best</h2><p>Rust bucket doesn’t quite describe the poor state of Columbo’s car. He arrives on scene in a puff of smoke in a old French car that looks like it could barely take a corner without rattling to bits. The car serves him well across the entire 32 year lifespan of the programme. It gets him where needs to go and does the job well enough.</p><p>We are very privileged at Automattic to receive a new computer every 18 months and have access to the very latest and greatest technology. The problem with this is our tools do not necessarily reflect those of the people we serve. This is one of the reasons I moved away from an Apple laptop this year.</p><p>The more we can diversify the technology we use, the greater it represents the audience we serve and the better our products will be as a result.</p><h2 id="name-for-seo"><a href="#name-for-seo" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>Name for SEO</h2><p>When Columbo adopts a dog in “<a href="http://www.imdb.com/title/tt0068398/" rel="nofollow noopener noreferrer" target="_blank">Étude in Black</a>” he spends most of the episode trying to decide a name for his new pet. He settled on “Dog”.</p><p>The names we use for projects, software and teams are hugely important for discoverability, especially when most of us begin exploring cyberspace with a search.</p><h2 id="and-one-last-thing"><a href="#and-one-last-thing" aria-hidden="true" tabindex="-1"><span class="icon icon-link"></span></a>And one last thing…</h2><p>If you are feeling inspired to sit down with Columbo for an hour or two then I recommend the following episodes:</p><ul><li><a href="http://www.imdb.com/title/tt0069903/" rel="nofollow noopener noreferrer" target="_blank">Double Exposure</a></li><li><a href="http://www.imdb.com/title/tt0068395/" rel="nofollow noopener noreferrer" target="_blank">Blueprint for Murder</a></li><li><a href="http://www.imdb.com/title/tt0075864/" rel="nofollow noopener noreferrer" target="_blank">The Bye-Bye Sky High IQ Murder Case</a></li></ul>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/one-more-thing.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Decline]]></title>
            <link>https://scott.ee/journal/the-decline</link>
            <guid>https://scott.ee/journal/the-decline</guid>
            <pubDate>Fri, 01 Dec 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[There are very few objects in life that become more beautiful as they wear and ages]]></description>
            <content:encoded><![CDATA[<p>Earlier this year <a href="https://stayandroam.blog/snaps-from-berlin/" rel="nofollow noopener noreferrer" target="_blank">Gemma</a> and I took a short trip to Berlin. It is a place we have always wanted to visit and it didn’t disappoint. It is a city full of history, interesting architecture and most importantly, great food!</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/the-decline-haus-der-statistik.jpg?w=1600&amp;strip=info" alt="Haus der Statistik, large abandoned building with smashed windows and graffiti" class="rss-image"></figure><p>Walking back to our hotel one evening, we discovered a building that stood out to us. It was a huge, abandoned and had ‘Stop Wars’ painted in red across the front. The lettering was the height of two floors and spanned the width of one end of the building. A fairly impressive piece of graffiti on an even more impressive building.</p><p>It seemed odd that such a huge structure had been left to decay in what is a fairly central and busy part of the city. If this was London, it would be have been re-developed into flats and restaurants long ago.</p><p>We got a little closer and made our way into the central courtyard to see if we could find a way to photograph or see inside. We took a few steps into the courtyard and realised we were already being followed. Not knowing the area we scuttled back the main road and continued to walk along the entire length of the building, it went on forever.</p><p>Back at the hotel and on a stable Internet connection, we started researching this mysterious, bleak and intriguing lump of concrete. It turns out we had discovered Haus der Statistik, the former statistics-gathering HQ of the German Democratic Republic. The top search result was a blog called <a href="http://www.abandonedberlin.com/2011/01/stalking-stasi-in-haus-der-statistik_6120.html" rel="nofollow noopener noreferrer" target="_blank">Abandoned Berlin</a>. It is a fascinating site that explores the history of forgotten landmarks in and around Berlin. It has some beautiful photos of these forgotten buildings — including photos inside of Haus der Statistik that we didn’t manage to snap ourselves:</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/the-decline-haus-der-statistik-inside.jpg?w=1280&amp;strip=info" alt="Inside Haus der Statistik, a small dark room with computer monitors and security equipment turned on" class="rss-image"></figure><p>Haus der Statistik finished construction in 1970 and the top three floors were allocated for use by the <a href="https://en.wikipedia.org/wiki/Stasi" rel="nofollow noopener noreferrer" target="_blank">Stasi</a>. When unified Germany took over the building, the Stasi archives were made available to the German people. It would have been interesting to see what information may have been gathered about you by people never met. The archives were all moved out of the building in 1995 and the building was eventually abandoned in 2008. Looking at historical photos it is fascinating to see how the building changes and responds to the environment around it. Now it sits empty and is rather beautiful in a strange sort of way.</p><p>Unfortunately we discovered the Abandoned Berlin site just a little too late into our trip which meant we didn’t get to investigate more of the places that Ciaran has written about. Gemma surprised me with the <a href="http://shop.abandonedberlin.com/product/verlassene-orte-abandoned-berlin" rel="nofollow noopener noreferrer" target="_blank">Abandoned Berlin book</a> for my birthday (who says blogging doesn’t pay?!) and I have since been browsing through more of these fascinating landmarks and stories.</p><p>Reading through the book it got me thinking about the things we build and leave behind. In the digital space there is no real concept of decay, change or imperfection. Everything is binary, it either exists or it doesn’t. We have very little interest in preserving the things we make and all too often they simply disappear.</p><p>You may have heard of the Japense saying ‘Wabi-Sabi’ which roughly translates to:</p><blockquote><p>…the acceptance of transience and imperfection. The aesthetic is sometimes described as one of beauty that is imperfect, impermanent, and incomplete.</p><figcaption><cite><a href="https://en.wikipedia.org/wiki/Wabi-sabi" rel="nofollow noopener noreferrer" target="_blank">Wikipedia</a></cite></figcaption></blockquote><p>There are very few objects in life that become more beautiful as they wear and age. From time to time you will find something and I like to think Haus der Statistik is one of them. I have yet to find anything digital that displays these same unique qualities. I’d like to find it. I would like to leave behind something that lasts.</p>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/the-decline-haus-der-statistik.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Everything is Designed]]></title>
            <link>https://scott.ee/journal/everything-is-designed</link>
            <guid>https://scott.ee/journal/everything-is-designed</guid>
            <pubDate>Fri, 23 Mar 2012 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Look away from the screen (for just a second or two). Everything you have just witnessed has been designed. The placement of trees, the shaping of fields for agriculture, the street furniture, carpet, your chair and wrist watch have all been considered. Our influence on our surrounding environment is beyond remarkable.</p><p>In our profession it is very easy to lose sight of the bigger picture. Our days are spent obsessing over graphic design details; typography, grids, hierarchy, message and meaning. Occasionally we need to step back to consider the collective effort that has gone into making our society the way it is today. Many generations of work, time, money and thought has led us to this very point in time.</p><blockquote><p>Everything is designed. Few things are designed well. — Brian Reed</p></blockquote><p>A few years back I had the opportunity to visit two very different European cities in very quick succession. A stag weekend in Benidorm, followed by a short break in Copenhagen. In just one week I was exposed to two very different approaches to design.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/everything-is-designed-benidorm.jpg?w=1600&amp;strip=info" alt="Peering through tall buildings in Benidorm, Spain" class="rss-image"></figure><p>Prior to the 1960s, Benidorm was a small village. Today it stands out for its hotel industry, beaches and skyscrapers, built as a result of its tourist-oriented economy. The newer buildings are largely bland boxes with little respect for the heritage of Old Town Benidorm. Restaurants focus on price over quality and attractions distribute scooter riders with megaphones in a bid for your attention. Benidorm epitomises cheap, quick and convenient.</p><p>When walking around the streets of Benidorm it feels as if everything has been designed for price over experience. As a result it lacks culture and depth. The beautiful beech (the reason people flocked there is the first place) is no longer visible through the rows of sandy sky scrapers.</p><figure><!----><!----><!----><img src="//i0.wp.com/scott.ee/images/everything-is-designed-copenhagen.jpg?w=1600&amp;strip=info" alt="Outdoor swimming pool in Copenhagen, Denmark" class="rss-image"></figure><p>Copenhagen is a major regional centre of culture, business, media, and science and it is also considered one of the world’s most environmentally friendly cities. Aesthetically Copenhagen is a vast contrast to Benidorm. Historical buildings have been cared for whilst new builds are edgy, architectural master pieces that will stand the test of time to become historical attractions themselves.</p><p>Our hotel (Hotel Fox) invited different illustrators and designers from around the globe to create unique experiences for each room. Restaurants serve fresh, delicious dishes with attention to tiny details such as cutlery and furnishings. The Copenhagen experience has been crafted, considered, refined and is likely the primary reason why the city has repeatedly been recognized as one of the cities with the best quality of life.</p><p>It is our joint responsibility to consider the impact our work will have on our society and the world we live. The smallest of details have a real impact on the quality of our work, its longevity and its effect on culture.</p><blockquote><p>Design creates culture. Culture shapes values. Values determine the future. — Robert L. Peters</p></blockquote><p>If everything is designed, perhaps design is everything. Design changes the world. Done well, it changes it for the better.</p>]]></content:encoded>
            <enclosure url="https://i0.wp.com/scott.ee/images/everything-is-designed-copenhagen.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>