<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>shaun.</title><description>runner. hacker. part time hat-wearer.</description><link>https://shaungarwood.com/</link><item><title>It&apos;s been a while...</title><link>https://shaungarwood.com/blog/holy-gap-batman/</link><guid isPermaLink="true">https://shaungarwood.com/blog/holy-gap-batman/</guid><pubDate>Sun, 22 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Oh my god, it&apos;s been a while.&lt;/p&gt;
&lt;p&gt;I&apos;ll be honest, I kind of forgot that I had this blog.&lt;/p&gt;
&lt;p&gt;A few things have been happened since then. Covid, for one. The 2021 insurrection. Divorce, etc.&lt;/p&gt;
&lt;p&gt;Enough things have happened since then that the people who knew about this blog are long and gone.&lt;/p&gt;
&lt;p&gt;This blog has always been tech related stuff. I&apos;ll keep it that way, for now. But I may go on different tangents.&lt;/p&gt;
&lt;p&gt;I actually started this back up because I wanted to put a pgp key on my root domain.&lt;/p&gt;
&lt;p&gt;Here&apos;s what&apos;s changed technologically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://obsidian.md&quot;&gt;obsidian&lt;/a&gt; is the note taking app I wish I knew about years ago&lt;/li&gt;
&lt;li&gt;I&apos;ve left a job, got laid off from the next, then found a new one I am ABSOLUTELY in love with&lt;/li&gt;
&lt;li&gt;REALLy digging AI/copilot&lt;/li&gt;
&lt;li&gt;dropped python for the most part&lt;/li&gt;
&lt;li&gt;I dropped all my ansible stuff for &lt;a href=&quot;https://chezmoi.io&quot;&gt;chezmoi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I navigated to a proper pure LUA neovim setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sw.kovidgoyal.net/kitty/&quot;&gt;kitty terminal&lt;/a&gt; is my new go-to&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;lazygit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/&quot;&gt;tailscale&lt;/a&gt; is fucking awesome&lt;/li&gt;
&lt;li&gt;got a &lt;a href=&quot;https://www.mi.com/redmi-books/16-pro&quot;&gt;new laptop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bought a &lt;a href=&quot;https://supernote.com/pages/supernote-nomad&quot;&gt;Supernote&lt;/a&gt;, love it&lt;/li&gt;
&lt;li&gt;using &lt;a href=&quot;https://mealie.io&quot;&gt;mealie&lt;/a&gt; for my family recipe server&lt;/li&gt;
&lt;li&gt;my mom has a podcast&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.linuxserver.io/general/swag/&quot;&gt;SWAG&lt;/a&gt; is great!&lt;/li&gt;
&lt;li&gt;lately I&apos;ve been setting up a bunch of new docker containers from &lt;a href=&quot;https://awesome-selfhosted.net&quot;&gt;awesome-selfhosted.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okay well, let&apos;s see if this even will post a new one.&lt;/p&gt;
</content:encoded></item><item><title>Mr. Robot&apos;s Bootstraps</title><link>https://shaungarwood.com/blog/mr-robots-bootstraps/</link><guid isPermaLink="true">https://shaungarwood.com/blog/mr-robots-bootstraps/</guid><pubDate>Mon, 13 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Watching Mr. Robot, it occurred to me that Elliot is almost always on a new system. He&apos;s either using a live system (&lt;a href=&quot;https://www.kali.org/&quot;&gt;Kali Linux&lt;/a&gt;), on someone else&apos;s computer, or he&apos;s just finished microwaving his RAM. But there&apos;s no way that he&apos;s always using default set-ups. Right? He wouldn&apos;t use nano and bash for his late night coding. He&apos;d have custom python modules, elaborate nmap scripts, and a million zsh aliases. So how does he have time to set up his environments?&lt;/p&gt;
&lt;p&gt;I think that he probably has some automated scripts sitting out on the internet somewhere. Scripts that will install everything he needs and configure all the dotfiles to his liking. Sitting on some AWS server paid for anonymously, whose IP address he has memorized. His own personal bootstrap kit floating in the cloud...I want one!&lt;/p&gt;
&lt;h2&gt;My Bootstraps&lt;/h2&gt;
&lt;p&gt;While this was a fun thought experiment, it&apos;s also been on my to-do list for a while. I spend too much time setting up new systems or VMs. Plus, I can never remember how I got the directory colors just right so it&apos;s readable in dark theme terminals. It&apos;d be nice to stop fighting that.&lt;/p&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;p&gt;Needs to be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt;. Mr. Robot needs to go from zero to writing exploits in less than a minute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versatile&lt;/strong&gt;. I could probably stuff it all in a bash script, but that&apos;d be a pain for more complex stuff like updating dotfiles based on programs installed or if it&apos;s a work system or personal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy&lt;/strong&gt;. No long commands to memorize or type. No flags I can&apos;t remember.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fully headless&lt;/strong&gt;. I don&apos;t know, just because I like not being tied to a GUI.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I went with &lt;a href=&quot;https://www.ansible.com/&quot;&gt;ansible&lt;/a&gt; because it seemed better suited for provisioning a localhost. You can do the same with salt or chef, but you have to make some config changes before you can. Ansible just worked out of the box for what I needed.&lt;/p&gt;
&lt;p&gt;All the ansible &quot;playbooks&quot; are obviously in a git repo. But I didn&apos;t want to type out a long git clone command, so I wrote a bootstrap for my bootstrap! Just a quick bash script that would install git and ansible, then clone my repo full of the playbooks. This saves me time and about 5 lines of commands.&lt;/p&gt;
&lt;p&gt;So this part I&apos;m really pleased with myself about: &lt;strong&gt;I stored this bootstrap bootstrap script in the root directory of this site!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shaungarwood.com/bs.sh&quot;&gt;shaungarwood.com/bs.sh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shaungarwood/my_bootstraps/blob/master/bin/initial-bootstrap.sh&quot;&gt;Here&lt;/a&gt; is the github link if you just want to check out my bash scripting skillz.&lt;/p&gt;
&lt;p&gt;This means that all I need to type to begin setting up a new linux host is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget shaungarwood.com/bs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;In fact the full solution is a total 3 lines long!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget shaungarwood.com/bs.sh
bash bs.sh
ansible-playbook my_bootstraps/tasks/*.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gorgeous, isn&apos;t it? This simple beauty probably saves me half a day of manually installing/configuring things.&lt;/p&gt;
&lt;p&gt;Yeah, yeah - I could pipe the result of wget into bash and have the script run the ansible-playbook command which would mean the final solution is just one command. But that would require a few wget flags and I don&apos;t always want to run ALL the playbooks. Three simple commands is fine with me.&lt;/p&gt;
&lt;p&gt;Full repo: &lt;a href=&quot;https://github.com/shaungarwood/my_bootstraps&quot;&gt;https://github.com/shaungarwood/my_bootstraps&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Other concerns&lt;/h2&gt;
&lt;p&gt;I just want to address the pedantic nerd voice in my head.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&apos;t secure! You&apos;re blindly running a bash script that could compromise your whole computer!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, yes. Someone could theoretically hack into my github account or man-in-the-middle my wget. That&apos;s a weird amount of work just so they can own my raspberry pi. If I were Mr. Robot - I&apos;d probably memorize the checksum of the bash script so I&apos;d know if someone messed with it. I&apos;m not going to do that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You&apos;re downloading the script from your personal website? Goodbye anonymity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah, it doesn&apos;t get more personal on a fresh system than having the first command contain my full name. If I&apos;m trying to stay mysterious, I won&apos;t use this project. Elliot would probably just host the script on a public e-corp server he hacked.&lt;/p&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://asciinema.org/a/oOVnonDr00420VksGn99HN8H9&quot;&gt;Here&apos;s an asciinema recording&lt;/a&gt; if you want to see it in action.&lt;/p&gt;
&lt;p&gt;Want to try it out yourself? Here&apos;s a full run Vagrant demo using ubuntu and centos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Vagrant.configure(&quot;2&quot;) do |config|
  $script = &amp;lt;&amp;lt;-SCRIPT
  wget shaungarwood.com/bs.sh
  bash bs.sh
  ansible-playbook ~/my_bootstraps/tasks/basic.yml
  SCRIPT

  config.vm.provision &quot;shell&quot;, inline: $script, privileged: false

  config.vm.define &quot;centos&quot; do |centos|
    centos.vm.box = &quot;bento/centos-7.2&quot;
    centos.vm.hostname = &quot;centos&quot;
  end

  config.vm.define &quot;ubuntu&quot; do |ubuntu|
    ubuntu.vm.box = &quot;bento/ubuntu-18.04&quot;
    ubuntu.vm.hostname = &quot;ubuntu&quot;
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Even if you don&apos;t know ansible, you should check it out. All the magic is in the &quot;tasks&quot; directory. It&apos;s very human readable and easy to start hacking up to make your very own bootstrap kit in the cloud.&lt;/p&gt;
&lt;p&gt;Edit (2020/01/14): Fixed the vagrant demo code. It was running everything as root, fixed with &lt;code&gt;privileged: false&lt;/code&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Not So QuickBooks</title><link>https://shaungarwood.com/blog/not-so-quickbooks/</link><guid isPermaLink="true">https://shaungarwood.com/blog/not-so-quickbooks/</guid><pubDate>Mon, 02 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Not every story on here will be a triumphant victory. There are plenty of things to be learned from falling flat on our faces. Or spending days spinning our wheels THEN falling flat on our faces.&lt;/p&gt;
&lt;p&gt;So a friend was doing some work with QuickBooks online and she said that it was slow-going, repetitive, and going to take forever.&lt;/p&gt;
&lt;p&gt;&quot;I can automate that!&quot; said an overly confident voice at the table.&lt;/p&gt;
&lt;p&gt;&quot;Great!&quot;, said the relieved friend.&lt;/p&gt;
&lt;p&gt;All she needed was any transaction on the books before 9/1/2019 to be deleted. How hard could it be?&lt;/p&gt;
&lt;h2&gt;Hurtle #1&lt;/h2&gt;
&lt;p&gt;I had to register as developer.&lt;/p&gt;
&lt;p&gt;Not a big hurtle, but more than I had planned on for writing a quick script. I couldn&apos;t find anything on the internet for one-shot client scripts to interact with QuickBooks online, but a ton about developing apps to interact with QuickBooks online. I guess I&apos;m an app developer then.&lt;/p&gt;
&lt;p&gt;Intuit (the company who makes QuickBooks) actually has a pretty great development setup. Once I signed up (free), they redirected me to a nice little dashboard with the keys I needed AND they create a sandbox company to play around with, complete with 50+ small business transactions. Pretty sweet.&lt;/p&gt;
&lt;h2&gt;Hurtle #2&lt;/h2&gt;
&lt;p&gt;I had to write a full app, just to get logged in.&lt;/p&gt;
&lt;p&gt;So I was getting &lt;a href=&quot;https://github.com/sidecars/python-quickbooks&quot;&gt;this python package&lt;/a&gt; running with my new shiny oauth keys and I keep seeing this &quot;redirect URI&quot;. Come to find out, it is where Intuit&apos;s oauth login page redirects your user WITH the necessary refresh token. Confusing? Yeah.&lt;/p&gt;
&lt;p&gt;The assumption is you&apos;re writing an app or developing some online tool to be used by strangers. The user clicks &quot;login to QuickBooks&quot; on your app/site, you send the user to Intuit&apos;s login page, they authorize your app, Intuit sends the user AND the tokens back to your app.&lt;/p&gt;
&lt;p&gt;My flow, just to get all the ids and tokens to login:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                   (1)                                             
  +----------+  generates a  +------------+                        
  |          |  link to      |            |                        
  |  run.py  |--------------&amp;gt;| intuit&apos;s   |                        
  |          |               | auth page  |                        
  +----------+               |            |                        
       ^                     +------------+                        
       |    (4)                     |            (2)               
       | which feeds                | sends tokens and users to    
       | back into                  | &quot;redirect uri&quot; (my localhost)
       |                            V                              
+-------------+               +----------+                         
|             |               |          |                         
| config.toml |&amp;lt;--------------|  api.py  |                         
|             |   (3) writes  |          |                         
+-------------+   tokens to   +----------+                         
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;run.py&lt;/code&gt; is the main script and &lt;code&gt;api.py&lt;/code&gt; was my little flask API to retrieve the tokens that the Intuit auth page sent. Write them to my config.toml (I LOVE &lt;a href=&quot;https://github.com/toml-lang/toml&quot;&gt;toml&lt;/a&gt; files for configs) and have &lt;code&gt;run.py&lt;/code&gt; use them. Phew! I have to be getting close...&lt;/p&gt;
&lt;h2&gt;Hurtle #3&lt;/h2&gt;
&lt;p&gt;I am not an accountant.&lt;/p&gt;
&lt;p&gt;I&apos;m in! Aaaaand I have no idea what I&apos;m looking at. The API doesn&apos;t flow the same way as the dashboard. It&apos;s probably minor differences in how things are worded, but it&apos;s enough to throw a non-accountant, like me, off.&lt;/p&gt;
&lt;p&gt;A few emails back and forth with my friend and I learn that the &quot;view register&quot; part of the dashboard does not have an API equivalent. Opening a register on the dashboard would show you all the bills, payments, credit card transactions, etc. for an account. In the API, you can pull all bills, all payments, all credit cards, etc - but you&apos;re doing so for only that transaction type. I code around it.&lt;/p&gt;
&lt;p&gt;What a pain. Well, it&apos;s almost over...&lt;/p&gt;
&lt;h2&gt;Hurtle #4&lt;/h2&gt;
&lt;p&gt;Out of the sandbox, into production.&lt;/p&gt;
&lt;p&gt;I&apos;ve sunk more than a day on this &quot;easy solution&quot; now, but if I can just finish this - I&apos;ll still be saving her days, if not weeks, of work. My code works on the sandbox company, I deleted a few transactions, now it&apos;s time to turn this loose on the actual target.&lt;/p&gt;
&lt;p&gt;In order for Intuit to let me touch a production company, I have to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finish filling out my profile&lt;/li&gt;
&lt;li&gt;Link to my app&apos;s privacy policy&lt;/li&gt;
&lt;li&gt;Link to my app&apos;s EULA&lt;/li&gt;
&lt;li&gt;Supply my app&apos;s redirect URIs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UGH! Finish my profile: no problem. A privacy policy and a EULA? This is just ridiculous. So I find some online privacy policy and EULA generators. Could I have just linked to a text file for the lyrics to a Sir Mix-a-Lot song? Probably, but the generators were fast enough and they hosted the end result.&lt;/p&gt;
&lt;p&gt;More redirect URIs? I got this, I&apos;ll just use my localhost address and...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: All Production URI requests must use HTTPS.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Noooooooo!!!!&lt;/p&gt;
&lt;p&gt;Okay, maybe I can just use a self signed cert...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: Please enter a unique valid redirect URI
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It doesn&apos;t like localhost. It needs an FQDN (something with a &quot;.com&quot;).&lt;/p&gt;
&lt;h2&gt;Game Over&lt;/h2&gt;
&lt;p&gt;At this point I took a good hard look at what I had become and the lengths I have gone to &quot;save time and energy&quot;. I admitted defeat. In hindsight, I should have called it quits at hurtle #2. But I learned a lot about QuickBooks, some things about OAuth2, and a little about accounting. So it wasn&apos;t a total loss.&lt;/p&gt;
&lt;p&gt;Called my friend and I told her to contact someone at Intuit. They could do it for her in minutes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shaungarwood/quickbooks&quot;&gt;Here is the repo of all my hard work, in case some poor soul needs it&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Darn You Splunk! Darn You to HEC!</title><link>https://shaungarwood.com/blog/splunk-docker-logging-poc/</link><guid isPermaLink="true">https://shaungarwood.com/blog/splunk-docker-logging-poc/</guid><pubDate>Sat, 16 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So, the goal was to get Splunk running to monitor/alert/graph several docker containers and the physical hosts they&apos;re running on. I ended up hitting a few roadblocks getting there, while finding surprisingly little help in my Google travels. So I&apos;m writing out a simple top-to-bottom proof-of-concept to get docker logs flowing into a Splunk docker instance.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# quick splunk server, with HTTP Event Collector running and pre-determined token:
docker run -d \
  --name &quot;splunk&quot; \
  -p &apos;8000:8000&apos; \
  -p &apos;8088:8088&apos; \
  -e &quot;SPLUNK_START_ARGS=--accept-license&quot; \
  -e &quot;SPLUNK_PASSWORD=password&quot; \
  -e &quot;SPLUNK_HEC_TOKEN=secret-token&quot; \
splunk/splunk:latest

# manually insert an event
curl -k  https://localhost:8088/services/collector/event -H &quot;Authorization: Splunk secret-token&quot; -d &apos;{&quot;event&quot;: &quot;hello world&quot;}&apos;

# using docker&apos;s &quot;splunk&quot; log driver
docker run -d \
  --name &quot;nginx&quot; \
  --publish &quot;80:80&quot; \
  --log-driver=splunk \
  --log-opt splunk-token=secret-token \
  --log-opt splunk-url=https://127.0.0.1:8088 \
  --log-opt splunk-insecureskipverify=true \
nginx

# inspect nginx to see logging driver (you&apos;ll need jq if you want pretty print)
docker inspect --format=&apos;{{json .HostConfig.LogConfig}}&apos; nginx | jq .

# use above nginx, generating a log event
curl http://localhost:80
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Log in to Splunk to view the logs (yes, there&apos;s a space in that URL):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://127.0.0.1:8000/en-US/app/search/search?q=search source%3D&quot;http%3Asplunk_hec_token&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to set a system wide docker logging setting, edit your &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;log-driver&quot;: &quot;splunk&quot;,
  &quot;log-opts&quot;: {
    &quot;splunk-token&quot;: &quot;secret-token&quot;,
    &quot;splunk-url&quot;: &quot;https://127.0.0.1:8088&quot;,
    &quot;splunk-verify-connection&quot;: &quot;false&quot;,
    &quot;splunk-insecureskipverify&quot;: &quot;true&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I didn&apos;t want it to verify the connection first, because it&apos;ll error out starting the docker containers if it can&apos;t reach Splunk first. Best to just throw logs that direction and hope for the best.&lt;/p&gt;
&lt;h2&gt;Gotchas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You would be a FOOL to think that just because your Mac is running on BSD code base that it&apos;s the same as Linux. One MIGHT spend HOURS re-configuring a completely useless &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; on Mac, only to find out you need to configure the daemon.json through the taskbar (Preferences &amp;gt; Daemon &amp;gt; Advanced).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not being familiar enough with Splunk, I kept watching the main search page to see if my new changes were making it to Splunk. APPARENTLY the &quot;What to Search&quot; section and data summary are only for the default index. If you&apos;re putting things in a different index (I had set the index to &quot;logs&quot; in my testing), you need to search for that index specifically to see the results. Even the &quot;last event&quot; counter is only for the default index.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;to-do&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;need to tag docker container names&lt;/li&gt;
&lt;li&gt;set-up a universal forwarder&lt;/li&gt;
&lt;li&gt;dashboards and alerts&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>My Set-Up For Blogging</title><link>https://shaungarwood.com/blog/my-blog-dev-setup/</link><guid isPermaLink="true">https://shaungarwood.com/blog/my-blog-dev-setup/</guid><pubDate>Mon, 03 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nothing better to kick this blog off than explaining how I set it up!&lt;/p&gt;
&lt;h2&gt;Choices&lt;/h2&gt;
&lt;p&gt;I went with github-pages because I wanted something fast &amp;amp; easy, backed by a CDN, and obviously a platform where I still own the content. A big plus that I can tweak and tinker with everything. Could I write my own site from scratch and host it on the cloud? Yes, and I still might. But this works for now and will be easy to port all the content if I do.&lt;/p&gt;
&lt;h2&gt;Initial Set-up&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;jekyll new blog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Edit Gemfile, comment out jekyll, uncomment github-pages.&lt;/li&gt;
&lt;li&gt;Update _config.yml with details, comment out theme cause we&apos;re importing all the files manually.&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/poole/hyde.git ../
cp -r ../hyde/_layouts/ ./
cp ../hyde/*.html ./
cp ../hyde/atom.xml ./
cp -r ../hyde/public/ ./
cp -r ../hyde/_includes ./
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Currently&lt;/h2&gt;
&lt;p&gt;As always, I&apos;m using Vim and will until the day I die. I&apos;ll probably use it to finalize my will.&lt;/p&gt;
&lt;p&gt;In order to try things out locally, I needed to run a local web server for github pages. Dockerhub user &lt;code&gt;starefossen&lt;/code&gt; wrote a nice little Dockerfile for exactly this: &lt;a href=&quot;https://hub.docker.com/r/starefossen/github-pages/&quot;&gt;https://hub.docker.com/r/starefossen/github-pages/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So to see live updates of my changes I just run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -t --rm --name ghp -v &quot;$PWD&quot;:/usr/src/app -p &quot;4000:4000&quot; starefossen/github-pages
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Future Improvements&lt;/h2&gt;
&lt;p&gt;I&apos;ll definitely write a quick ruby script to generate a skeleton markdown post with the current date/time and proper front matter.&lt;/p&gt;
</content:encoded></item></channel></rss>