<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>Tom Robinson</title>
	<subtitle>A guy not sure what he&#39;s writing about.</subtitle>
	
	<link href="https://tomrobinson.io/feed/feed.xml" rel="self"/>
	<link href="https://TomRobinson.io"/>
	<updated>2024-04-23T00:00:00Z</updated>
	<id>https://TomRobinson.io</id>
	<author>
		<name>Tom Robinson</name>
		<email>blog@mail.tomrobinson.io</email>
	</author>
	
	<entry>
		<title>Taskwarrior 3.0.0 Breaks Taskd Sync Server</title>
		<link href="https://tomrobinson.io/posts/Taskwarrior-3_0-Breaks-Taskd/"/>
		<updated>2024-04-23T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Taskwarrior-3_0-Breaks-Taskd/</id>
		<content type="html">&lt;p&gt;Most of the time, when you run an upgrade on your package manager, you get all the latest security fixes, improvements, and cool new features.
Every once in a while, when you run that upgrade, you&#39;re greeted with some breaking changes.
This happened to me yesterday afternoon with a utility I use every day, &lt;a href=&quot;https://taskwarrior.org/&quot;&gt;Taskwarrior&lt;/a&gt; and man, it sucks.&lt;/p&gt;
&lt;p&gt;I use Taskwarrior with the companion sync server called taskd.
This allows me to self-host the database on my new home server (that I swear I&#39;ll write about building eventually) and I can access it from my desktop, laptop, work Mac, and with a third party app called &lt;a href=&quot;https://apps.apple.com/us/app/task-add/id1553253179&quot;&gt;task add&lt;/a&gt;, my phone as well.
This is how I&#39;ve managed everything from work projects to long term reminders like renewing my TSA PreCheck for the past several years.&lt;/p&gt;
&lt;p&gt;Yesterday afternoon, I upgraded the packages on a few of my computers and some time later I tried to run &lt;code&gt;task&lt;/code&gt; to take a look at what I still needed to do for the day.
Instead of printing out my task list as I&#39;d expect, I received a fun little error that would ruin the rest of my day.
The error points to a &lt;a href=&quot;https://github.com/GothenburgBitFactory/taskwarrior/releases/tag/v3.0.0&quot;&gt;Github release&lt;/a&gt; that states v3.0.0 &amp;quot;is a breaking upgrade&amp;quot; that not only means you need to export your tasks to a json file prior to your upgrade to re-import after changing versions (too late for that), but also breaks integration with taskd.&lt;/p&gt;
&lt;p&gt;The first part wasn&#39;t a &lt;strong&gt;huge&lt;/strong&gt; issue.
With a little bit of effort, I was able to uninstall 3.0.0 and force the package manager to pull the old version, export my tasks, re-install the upgrade, and run the import.
It would be really nice if breaking changes had a way to push a warning before blindly upgrading though.
The second part of that, the deprecation of taskd, that has really caused me issues.&lt;/p&gt;
&lt;p&gt;The documentation makes note of &lt;a href=&quot;https://taskwarrior.org/docs/upgrade-3/#upgrading-sync&quot;&gt;upgrading sync&lt;/a&gt;, which basically just says &lt;em&gt;you can&#39;t use taskd anymore and you should look at the man page for task-sync for more info.&lt;/em&gt;
The man page isn&#39;t a ton more helpful.
It gives the few options you have and gives a brief description of the new Taskchampion-Sync-Server:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;CONFIGURATION&lt;/h4&gt;
&lt;p&gt;Taskwarrior provides several options for synchronizing your tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To a server specifically designed to handle Taskwarrior data.&lt;/li&gt;
&lt;li&gt;To a cloud storage provider. Currently only GCP [Google Cloud Platform] is supported.&lt;/li&gt;
&lt;li&gt;To a local, on-disk file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;h4&gt;RUNNING TASKCHAMPION-SYNC-SERVER&lt;/h4&gt;
&lt;p&gt;The TaskChampion sync server is an HTTP server supporting multiple users.  Users are identified by a client ID, and users with different client IDs are entirely independent.  Task data is encrypted by Taskwarrior, and the sync server never sees un-encrypted data.&lt;/p&gt;
&lt;p&gt;The server is developed in &lt;a href=&quot;https://github.com/GothenburgBitFactory/taskchampion-sync-server&quot;&gt;https://github.com/GothenburgBitFactory/taskchampion-sync-server&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It also mentions some options for alternative cloud storage, which sounds like an okay solution with NextCloud, but it&#39;s a non-starter for two reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I can&#39;t install (and don&#39;t want to give access to) the NextCloud client on my work computer.&lt;/li&gt;
&lt;li&gt;The phone app I use doesn&#39;t have any ability to read from anything other than taskd.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Taskchampion-Sync-Server sounds like it&#39;s what I want, but the repo states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is still under development and currently best described as a refernce implementation of the Taskchampion sync protocol.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&#39;s not great news.
Digging a bit further into some of the issues, I found &lt;a href=&quot;https://github.com/GothenburgBitFactory/taskchampion-sync-server/issues/2#issuecomment-2041724037&quot;&gt;a quote&lt;/a&gt; from one of the maintainers of the project saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For what it&#39;s worth, taskchampion-sync-server&#39;s current setup is about where taskd aka taskserver has been for years: poorly documented, difficult to deploy, and not especially production-ready.
So while it may seem poor form to ship something in this sorry state, I would argue it&#39;s not worse than the previous solution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have to disagree with his point here; primarily because I sucessfully deployed taskd without issues, using &lt;a href=&quot;https://gothenburgbitfactory.github.io/taskserver-setup/&quot;&gt;this awesome guide&lt;/a&gt;, and because it worked very well for me.
I do, however, agree that shipping in this &amp;quot;sorry state&amp;quot; is &amp;quot;poor form&amp;quot;.
The documentation for deploying Taskchampion-Sync-Server seems sparse at best, if not non-existent.
I haven&#39;t yet had the time and energy to attempt to deploy and migrate my data to the new solution, but it doesn&#39;t look fun.
I&#39;m also going to take a wild guess that the phone app, task add, isn&#39;t compatible with it either.
I could just stay with the old version for the time being, as that was working fine and fit my needs, but eventually, I&#39;ll need to upgrade.
For now, I&#39;ve installed 3.0.1 on my main computer and I&#39;m using it as my only location for tasks.
At this point, I&#39;m just left frustrated that this breaking change to syncing wasn&#39;t better thought out and very least wasn&#39;t somehow better communicated before being rolled out.
I&#39;m sure 3.0.0 is a big milestone for the project and will bring a lot of positive things to the program, but right now, it feels like a huge downgrade to me.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Using a New Neovim Plugin Manager</title>
		<link href="https://tomrobinson.io/posts/New-Neovim-Plugin-Manager/"/>
		<updated>2024-02-10T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/New-Neovim-Plugin-Manager/</id>
		<content type="html">&lt;p&gt;I may be the last person to have heard the news, but &lt;a href=&quot;https://github.com/wbthomason/packer.nvim&quot;&gt;Packer has been unmaintained since August 2023&lt;/a&gt;.
I only now found this out when something went wrong with a PackerSync and I went to look at the documentation.
I wish there was a better way to find out something in your config is unmaintained, archived, or deprecated besides waiting for something to fail, but I digress.
Packer&#39;s GitHub recommends using &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt; and so, without doing any other research, that&#39;s what I&#39;ve gone with.&lt;/p&gt;
&lt;p&gt;Switching to lazy.nvim was fairly straightforward.
The code for boot-strapping lazy.nvim can be found on the project&#39;s readme.
Then, I needed to convert the &lt;code&gt;packer.startup&lt;/code&gt; function that initializes the plugins to the table that&#39;s required by lazy.nvim.&lt;/p&gt;
&lt;p&gt;Packer:&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; packer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;-- My plugins here&lt;/span&gt;&lt;br /&gt;    use &lt;span class=&quot;token string&quot;&gt;&quot;wbthomason/packer.nvim&quot;&lt;/span&gt;&lt;br /&gt;    use &lt;span class=&quot;token string&quot;&gt;&quot;nvim-lua/popup.nvim&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;lazy.nvim&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;local&lt;/span&gt; plugins &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;folke/lazy.nvim&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;nvim-lua/popup.nvim&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;plugins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There were a few minor changes in syntax as well.
For example, calling a plugin and changing its name in Packer uses&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;plugin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; as &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where lazy.nvim uses&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;plugin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or calling a command when a plugin is loaded with something like tree-sitter in Packer would be&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvim-treesitter/nvim-treesitter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; run &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:TSUpdate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where lazy.nvim is&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvim-treesitter/nvim-treesitter&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; build &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:TSUpdate&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not too bad and it appears most plugins have documentation for how they want to be called using lazy.nvim anyway.&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;checkhealth lazy&lt;/code&gt; as advised by the lazy.nvim readme showed I still had some Packer files that needed to be removed.
Once that was done and Neovim was restarted, all of my plugins reinstalled using lazy.nvim and I was good to go, super simple.&lt;/p&gt;
&lt;p&gt;I really like the Mason inspired interface lazy.nvim uses.
I feel like with its lazy loading feature, my Neovim start time is just a slight bit faster, which is great too.
The one thing I&#39;m going to miss is this little bit of code I had in my plugin config:&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;vim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cmd &lt;span class=&quot;token string&quot;&gt;[[&lt;br /&gt;  augroup packer_user_config&lt;br /&gt;    autocmd!&lt;br /&gt;    autocmd BufWritePost plugins.lua source &amp;lt;afile&gt; | PackerSync&lt;br /&gt;  augroup end&lt;br /&gt;]]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This autocommand would source the plugins.lua file after any changes were made to it and run a &lt;code&gt;PackerSync&lt;/code&gt;.
That made it so anytime I added or removed a plugin to or from the list, it would make Packer deal with those changes automatically when saved.
I easily modified this to work with lazy.nvim but, it complains that sourcing the plugins file isn&#39;t supported in lazy.nvim when ran.
I found a &lt;a href=&quot;https://github.com/folke/lazy.nvim/issues/966&quot;&gt;feature request&lt;/a&gt; of someone trying to do the same thing and it appears that the developer of lazy.nvim isn&#39;t interested in implementing it 🙁.
Otherwise, a very positive experience.
9/10, would lazy.nvim again.&lt;/p&gt;
&lt;p&gt;If you&#39;d like to see the diff of my plugins.lua, you can find it &lt;a href=&quot;https://github.com/TomRobinsonIO/dotfiles/commit/2644055a1cad92b685ac306529f5ec746fb96333#diff-0182793ffd046ca51355cc057f6be921d8ddeab98918a7df1eaca5c22afc4d05&quot;&gt;here&lt;/a&gt;.
Happy Neoviming!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Switching to Actual Budget</title>
		<link href="https://tomrobinson.io/posts/Switching-to-Actual-Budget/"/>
		<updated>2024-01-25T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Switching-to-Actual-Budget/</id>
		<content type="html">&lt;h1 id=&quot;you-need-a-budget&quot; tabindex=&quot;-1&quot;&gt;You Need a Budget &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Switching-to-Actual-Budget/#you-need-a-budget&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I opened my email on Monday morning and I had received a new message from YNAB titled &lt;em&gt;Heads Up! Your YNAB Subscription Is Up For Renewal!&lt;/em&gt;
This is something I knew was coming (I&#39;ve even budgeted for it) but, it&#39;s not something I&#39;m very excited about for a couple of reasons.
The first of which is that I&#39;m not a fan of software subscriptions for something that should be a one time purchase license.
I don&#39;t want to rent my software that&#39;s already feature complete, stable, and where usage of the software isn&#39;t costing the developer overhead for server rentals, a bunch of storage, etc.
While new YNAB is a hosted web service, it clearly doesn&#39;t have to be.
Up to the deprecation of YNAB4, it was always a desktop application you paid once for and owned forever.
No web servers for the company to host your data on, no monthly recurring costs to them per user.
To be clear, I don&#39;t have an issue paying for software, especially good software that a lot of thought and hard work has gone into.
Developers need to eat too and all of that.
I will happily upgrade once a year or so when a new version comes out if the improvements justify the cost.
However, if the version I&#39;ve already paid for still suits all of my needs, I want the choice not to upgrade until I feel the need to.
I don&#39;t see anything wrong with that.&lt;/p&gt;
&lt;p&gt;Reason number two is that I really want to own my own data.
To nYNAB&#39;s credit, you can absolutely export your data in an open format.
&lt;a href=&quot;https://tomrobinson.io/posts/Switching-to-Actual-Budget/www.youneedabudget.com/privacy-policy/&quot;&gt;YNAB&#39;s Privacy Policy&lt;/a&gt; also states that they won&#39;t sell your data.
I still feel better having my data in my hands, on my drives.
The privacy policy won&#39;t change.
The company won&#39;t suddenly go under and shutdown the web app.
They can&#39;t suspend my account for some reason.
I won&#39;t lose access to my data if I stop paying the annual fee.
Speaking of which, back to reason one, the annual price has gone up (like every other subscription under the sun) from $83.99/yr to $98.99/yr.
This isn&#39;t a HUGE change but, it is yet another point of contention.
If I own the software and a new version is released that costs a bit more than the last, I can decide whether it&#39;s worth the price and won&#39;t lose access to my data because I didn&#39;t shell out this year.&lt;/p&gt;
&lt;h1 id=&quot;actual-budget&quot; tabindex=&quot;-1&quot;&gt;Actual Budget &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Switching-to-Actual-Budget/#actual-budget&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A few months ago an &lt;a href=&quot;https://news.itsfoss.com/actual-finance-app/&quot;&gt;article&lt;/a&gt; from It&#39;s FOSS News showed up on my RSS reader about Actual Budget.
Actual Budget was a hosted budget platform using the same &lt;a href=&quot;https://en.wikipedia.org/wiki/Envelope_system&quot;&gt;envelope style budgeting system&lt;/a&gt; as YNAB.
The developer recently decided to open-source the project and released a self-hostable version of the server.
There&#39;s even a super easy to deploy &lt;a href=&quot;https://hub.docker.com/r/actualbudget/actual-server&quot;&gt;docker container&lt;/a&gt;.
I thought this looked really interesting and deployed it on my home server to check out.
With the help of their pretty awesome documentation, I was able to export my data from nYNAB and import it into Actual.
I got it all setup and started tinkering but, I ran into some snags and it didn&#39;t catch on at the time.
I had one real problem, the rest are differences in features and functionality.&lt;/p&gt;
&lt;p&gt;The problem was a large difference in what funds YNAB showed I had in &lt;em&gt;Ready to Assign&lt;/em&gt; vs. what Actual showed in it&#39;s &lt;em&gt;To Budget&lt;/em&gt; section.
I could not for the life of me figure out why these numbers didn&#39;t line up.
The documentation does say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nYNAB calculates its &lt;em&gt;Ready to Assign&lt;/em&gt; value differently than Actual&#39;s &lt;em&gt;To Budget&lt;/em&gt; value. There is no need to worry, we can make them match exactly with a simple change. This is purely a visual change and doesn&#39;t affect the budget itself.&lt;/p&gt;
&lt;p&gt;You will likely see money leftover in each of the imported months in your &lt;em&gt;To Budget&lt;/em&gt;. This extra comes from nYNAB including funds budgeted in future months when calculating its &lt;em&gt;Ready to Assign&lt;/em&gt; value. Actual does not include those funds by default, but offers a way to manually reserve funds for use if future months. This is affectively the same thing nYNAB does, but in a manual form.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, despite now understanding that difference, even after following the steps to &amp;quot;hold&amp;quot; money for next month, the numbers still didn&#39;t line up.
All of the other numbers add up and everything looks the same on both apps apart from this one number.
Where is this &amp;quot;extra&amp;quot; money coming from?!
It drove me crazy, I finally gave up trying to fix it and quit using Actual.&lt;/p&gt;
&lt;p&gt;It wasn&#39;t until getting the subscription renewal email from YNAB that I finally sat down and figured out what the issue was.
After several hours of doing math trying to find the difference, I realized that if I added the totals assigned to categories and subtracted that number from the totals in my accounts, the difference is what Actual shows I still have in &lt;em&gt;To Budget&lt;/em&gt;.
The number in YNAB seems to be off, not Actual!
Fast forward several more hours of math and confusion and I finally found it.&lt;/p&gt;
&lt;p&gt;YNAB has a section for credit card payments.
When you spend money on a card, it moves from the transaction&#39;s assigned category to the credit card to be reserved for the card payment.
I had somehow over allocated money to multiple cards (probably several months ago) and that total was the difference between YNAB and Actual.
With that major headache out of the way, I&#39;m a lot more confident in the numbers being right and I&#39;m ready to give it another shot.&lt;/p&gt;
&lt;h1 id=&quot;ynab-has-some-advantages&quot; tabindex=&quot;-1&quot;&gt;YNAB Has Some Advantages &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Switching-to-Actual-Budget/#ynab-has-some-advantages&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Account Syncing&lt;/h2&gt;
&lt;p&gt;This was a big one for me when I originally tried Actual.
YNAB uses third parties like Plaid (who&#39;s had some &lt;a href=&quot;https://www.fastcompany.com/90715125/class-action-lawsuit-plaid-might-owe-you-money-if-you-use-any-of-these-banking-or-financial-apps-due-to-a-58-million-settlement&quot;&gt;privacy problems&lt;/a&gt;) or MX to facilitate collecting information from your accounts.
This has been a crutch I&#39;ve leaned on going all the way back to when I started using Mint somewhere around 2010.
When I&#39;m out and spend money, I rarely remember to pull my phone out as I&#39;m finishing a transaction and enter it into my budgeting app.
If I forget to do that or an auto-paid bill posts, those transactions will get pulled in within a few days for me to categorize and track, which keeps my budget in check.
There are &lt;a href=&quot;https://actualbudget.org/docs/community-repos#bank-importers&quot;&gt;community projects&lt;/a&gt; for Plaid and SimpleFIN integration to Actual, but I&#39;m going to make an effort to go manual for now.
If I can manage to make manual budgeting work, I&#39;ll both avoid paying for a service and make my budgeting more active than reactive.&lt;/p&gt;
&lt;h2&gt;Reports&lt;/h2&gt;
&lt;p&gt;The Reports in YNAB are just better, full stop.
Both YNAB and Actual have reports for Net Worth, YNAB has Income vs Expense while Actual has Cash Flow, and YNAB has Spending, which is probably my most used report and there&#39;s nothing like it in Actual.
I find Income vs Expense to be more useful than Actual&#39;s Cash Flow, as it shows information by category, with month by month, average, and total for the specified report range.
Here&#39;s a few examples from their respective demo pages.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/YNAB_IC_Report.png&quot; alt=&quot;YNAB Income vs Expense Report&quot; /&gt;&lt;em&gt;YNAB&#39;s Income v Expense&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/Actual_CashFlow_Report.png&quot; alt=&quot;Actual Cash Flow Report&quot; /&gt;&lt;em&gt;Actual Budget&#39;s Cash Flow&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Reports aren&#39;t a make or break feature for me though.
I look at them maybe once or twice a month but, they are a useful feature and nice to have.
Actual&#39;s website says custom reports are coming soon.
I hope someone creates reports to bring Actual more in line with YNAB and maybe even surpass it in this area.&lt;/p&gt;
&lt;h2&gt;Mobile App&lt;/h2&gt;
&lt;p&gt;YNAB has a mobile app while Actual doesn&#39;t but I don&#39;t think this is going to be a huge deal for me.
The mobile site UI on Actual seems pretty good, at least for my uses.
I do the majority of my budget management on my computer and use mobile mostly for info at a glance and adding transactions.
On iOS you can visit a webpage in Safari and select &lt;em&gt;Add to Home Screen&lt;/em&gt; from the Share Sheet to make it behave more like a native app.
This is going to be my approach for adding transactions on the go.
Time will tell how well this works out for me.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;/p&gt;&lt;figure&gt;
    &lt;img src=&quot;https://tomrobinson.io/img/Actual_Mobile.png&quot; alt=&quot;Acutal&quot; Screenshot=&quot;&quot; on=&quot;&quot; iOS=&quot;&quot; /&gt;
    &lt;figcaption&gt;&lt;i&gt;Actual on iOS using Add to Home Screen&lt;/i&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h1 id=&quot;final-thoughts&quot; tabindex=&quot;-1&quot;&gt;Final Thoughts &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Switching-to-Actual-Budget/#final-thoughts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I&#39;m looking forward to seeing how this turns out.
My subscription to YNAB expires on the 30th and I intend on letting it lapse to give Actual a real go.
YNAB has been a great product that I&#39;ve enjoyed using.
This experiment is not about my dissatisfaction with YNAB but about bringing my things under my control.
Actual is still under active development and I expect there to be some challenges.
I&#39;m optimistic though, I&#39;ve already seen some big changes and experimental features get added since I first tired it just a few months ago.
The open-source and self-hostable nature of this project really speak to me as well.
Worst case senario, I can always reactivate my YNAB subscription and continue where I left off.
I just hope I never have to.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Cisco UC 11.5 to 14 Migration</title>
		<link href="https://tomrobinson.io/posts/Cisco-UC-Migration/"/>
		<updated>2024-01-08T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Cisco-UC-Migration/</id>
		<content type="html">&lt;p&gt;Over this past weekend I completed a large unified communications suite upgrade for a hospital network in Tennessee.
The process took over 100 hours of planning and configuration, had two failed attempts at the migration task, and culminated in around 30 hours of work during the maintenance window last Saturday and Sunday.
After what feels like a huge mountain of work that should have been more of a molehill, these are my thoughts about what went right, what went wrong, and what I&#39;d do differently.&lt;/p&gt;
&lt;h1 id=&quot;the-scope&quot; tabindex=&quot;-1&quot;&gt;The Scope &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#the-scope&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This project kicked off around a year ago.
The plan was originally to migrate to the 12.5 line of products, but another project to migrate this hospital network&#39;s call center from UCCX, to PCCE, Cisco&#39;s contact center enterprise, delayed the UC project.
Once the PCCE project finished, we decided to switch the version upgrades from 12.5 to 14.&lt;/p&gt;
&lt;p&gt;I say migrate specifically to mean upgrade the version, but also move the virtual machines from aging physical hardware on ESXi 5.5 to new UCS servers running ESXi 7.
The high level tasks look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install and configure seven Cisco UCS C series servers across five different locations.&lt;/li&gt;
&lt;li&gt;Upgrade firmware and install ESXi 7 on each server.&lt;/li&gt;
&lt;li&gt;Deploy and configure Cisco Prime Collaboration Deployment (PCD) to automate the migration of the CUCM cluster.&lt;/li&gt;
&lt;li&gt;Upgrade IOS XE on several CUBEs and analog gateways.&lt;/li&gt;
&lt;li&gt;Use PCD to deploy two new Emergency Responder servers.&lt;/li&gt;
&lt;li&gt;Use PCD to deploy two new Unity Connection servers.&lt;/li&gt;
&lt;li&gt;Migrate an Expressway Core server from old ESXi host to new host and upgrade.&lt;/li&gt;
&lt;li&gt;Upgrade an Expressway Edge server and leave on current host.&lt;/li&gt;
&lt;li&gt;Migrate an InformaCast Basic paging server from old ESXi host to new host and upgrade.&lt;/li&gt;
&lt;li&gt;Use PCD to migrate ten CUCM nodes and two IM&amp;amp;P nodes from old ESXi hosts to new hosts and upgrade.&lt;/li&gt;
&lt;li&gt;Use COBRAS to migrate configuration and voicemails from old UCXN servers to new servers.&lt;/li&gt;
&lt;li&gt;Shutdown old UCXN, Expressway-C, and InformaCast VMs and change temporary IP addresses on new host to IPs previously occupied by old VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sounds like a lot, huh? In theory, it shouldn&#39;t have been too bad.
Most of the work can be done during normal business hours as the new stuff wasn&#39;t in production.
However, due to several failures related to the PCD server, the off-hours maintenance windows ended up being extremely long.&lt;/p&gt;
&lt;h1 id=&quot;the-prep&quot; tabindex=&quot;-1&quot;&gt;The Prep &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#the-prep&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Leading up to the first attempt at the migration, I had to get all of the prep work out of the way.
Their on site resources racked, cabled, and got the servers on their network for me.
I built out the host machines, staged the VMs, uploaded the installation media, scripted the PCD process for the CUCM migration and all the other things that needed to be put in place.
I ran the &lt;code&gt;ciscocm.preUpgradeCheck-00041.cop.sha512&lt;/code&gt; against all nodes in the CUCM cluster and each passed without issue.
I opened a stand-by case with Cisco TAC to have assistance at the ready in case of big problems.
The plan was to start on a Saturday around 9AM by starting the PCD task to export the data from the existing CUCMs and running the COBRAS export on the old UCXN servers.
I inserted a pause step in the PCD migration task after the data export because we couldn&#39;t start taking server offline and bringing up new ones until around 7PM.
That should give the export step plenty of time to run and allow me to have the afternoon to do my own thing while just keeping an eye on it to make sure nothing went wrong.
Everything was in place and ready to go, we had our final meeting the Friday before hand and put a change freeze in place and then...&lt;/p&gt;
&lt;h1 id=&quot;the-problems-started&quot; tabindex=&quot;-1&quot;&gt;The Problems Started &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#the-problems-started&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I got started on Saturday morning and everything started out as planned.
I kicked off the PCD migration task for the CUCM migration and the COBRAS data export for UCXN.
While those were doing their thing, I started building a fresh InformaCast Basic Paging on the new host, restored from a backup of the old host, and upgraded that to the latest version.
After I wrapped up the process with InformaCast, I went to check on the PCD data export task and it had failed on the publisher node.
What&#39;s worse was now the publisher&#39;s web pages were only partially loading and CLI access (both via SSH and from the VMware console) was completely broken.
I guess it&#39;s time to call Cisco TAC.&lt;/p&gt;
&lt;p&gt;Fast forward several hours of attempting to gather logs, restart the node, run recovery disks, etc. and we&#39;re now at the point where TAC recommends we rebuild the publisher and restore from a backup.
We weren&#39;t able to collect much information from the CUCM as the CLI was completely inaccessible and TAC didn&#39;t have any cases on file with a similar problem to reference.
It&#39;s getting rather late into the evening at this point but I decided to go ahead with the rebuild.
Rebuilding the publisher took around 2.5 hours for the install and another hour to find the backup and get it restored because a cron job had moved the files from the SFTP server they&#39;re sent to by CUCM.
By the time I was finally able to get the publisher back in working condition and the dbreplication looked good, it was around 5AM and we&#39;re out of time.&lt;/p&gt;
&lt;p&gt;We did have some success; the UCXN imports went well and InformaCast was built. However, we couldn&#39;t use the new versions because they weren&#39;t compatible with the old CUCM 11.5 cluster we were still running.
They would have to sit and wait until the next migration happened and I would have to re-run the COBRAS import to retrieve any voicemails that were left in the meanwhile.
The next morning, we met to discuss what had happened the night before, the plan for the next attempt, and to pick a date.
We agreed on another Saturday a few weeks later and waited to give it another shot.&lt;/p&gt;
&lt;h1 id=&quot;the-second-attempt&quot; tabindex=&quot;-1&quot;&gt;The Second Attempt &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#the-second-attempt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started around 7 or 8 in the morning this time.
I kicked off the PCD migration task and the COBRAS export and waited; this time paying closer attention to the migration to catch any potential errors as they happen.
After a bit of time the publisher exports all of its data and we see the lovely &lt;strong&gt;&lt;em&gt;Success&lt;/em&gt;&lt;/strong&gt; message next to that task.
Now I think I&#39;m in the clear and I start to relax a bit but, that was soon to change.
The next task, export data from the IM&amp;amp;P publisher succeeds and so does the export from the first CUCM subscriber.
Then the second subscriber fails its export task.
A quick check of the webpage only partially loading and the CLI being inaccessible proves that we&#39;ve run into the same problem on a different node.
Back on the phone with TAC.&lt;/p&gt;
&lt;p&gt;We spent the afternoon trying to grab logs from the CUCM publisher and the PCD server.
Nothing points to any obvious reason why this is happening, so we decide that we need to rebuild the subscriber.
Once I had that server rebuilt and restored from backup, the plan was to run the CUCM recovery software against all remaining nodes in the cluster.
We run all of the check against all of the subscribers, a few report that issues have been corrected.
I rebuild the PCD task from scratch and kick it off again.&lt;/p&gt;
&lt;p&gt;Would it surprise you, dear reader, if I told you that the publisher passed, the IM&amp;amp;P publisher passed, the next TWO subscribers also passed, and then the third one in line failed?
I will tell you that I can be a bit of a pessimist and it did not surprise me at all.
The TAC engineer wanted to start doing the usual log pulling and test running, I was having none of that.
I went directly to rebuild yet another server and around 3 or so hours later, the cluster was back in working order.
At this point, it was again around 2AM and I didn&#39;t see us getting this done this night either.&lt;/p&gt;
&lt;p&gt;During all of the waiting this time, COBRAS finished its export and import tasks successfully again, though that wouldn&#39;t matter for the same reason as last time.
We also got the Expressway-C VM moved to the new ESXi host after a little bit of difficulty.
The original plan was to have the customer&#39;s server team tie the old and new ESXi hosts into their vCenter environment to vMotion the Expressway-C between them.
But, as it turns out, their vCenter couldn&#39;t support ESXi 5.5 and 7 at the same time as the versions are too far apart.
Instead, with the help of &lt;a href=&quot;https://us.informatiweb-pro.net/virtualization/vmware/vmware-esxi-6-7-manually-transfer-a-vm-to-another-vmware-esxi-host.html&quot;&gt;this guide&lt;/a&gt;, we transferred the files manually.&lt;/p&gt;
&lt;h1 id=&quot;the-third-and-final-attempt&quot; tabindex=&quot;-1&quot;&gt;The Third (and Final) Attempt &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#the-third-and-final-attempt&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The plan this time was a bit different.
The TAC engineer thought it might help to rebuild PCD to rule out there being an issue with the server.
During the week leading up to this attempt, I went ahead and rebuilt the server, but this time there was an updated version, so I upgraded from the 14 version to 15 at the same time.
Surely, if there&#39;s a problem with the PCD server, a brand new one on a different version will resolve the problem.&lt;/p&gt;
&lt;p&gt;On Saturday morning, I get up early and kick off the PCD migration task and COBRAS export with some hope that PCD will work this time, but plan to have a long day.
A few hours into the task, several subscribers into the list the damned thing fails AGAIN, this time on yet another server.
I get in touch with my primary customer contact and tell him what&#39;s going on.
I gave him a few options in my order of preference on how to proceed and luckily he agrees to get everyone on board with my primary plan.
We&#39;re going to rebuild this subscriber and the remaining six left on the list that haven&#39;t already been rebuilt.&lt;/p&gt;
&lt;p&gt;Up to now, I&#39;ve been using PCD to automate the rebuilds.
I get the whole thing scripted out, defining all of the networking, username and password combos, certificate information, build order etc. and get ready to kick off the task.
When I get to the step to define the media to install the OS from, the server doesn&#39;t show any valid .iso images.
I do a quick check in the fresh_install directory, and I see the file sitting there.
I had skipped an important step... I hadn&#39;t checked the release notes for PCD 15 during my rebuild.
As it turns out, support for installing version 11 has been dropped in this new version.
Looks like I&#39;ll be rebuilding all six of these CUCM nodes... manually and they have to be staggered two at a time to boot; this is a network of hospitals, after all.&lt;/p&gt;
&lt;p&gt;Fast forward, it&#39;s now around 10PM and I&#39;ve finally got ALL CUCM nodes rebuilt and restored from their backups.
We&#39;ve basically got a brand new cluster of 11.5 servers now.
I&#39;m pretty confident this time that at least the export stage of the PCD migration is going to work, so we kick it off again and hope for the best.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It. Worked.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We passed the last export step and moved onto the build step where PCD should shut down the 11.5 publisher and start the install of the 14 publisher with the same IP address.
The requirement for the CUCM cluster was for all nodes to keep the same IPs and hostnames as the old servers, apart from one, which was moving from their corporate site to a newer hospital that needed a local node but didn&#39;t currently have one.
PCD supports two migration types.
From the PCD administration guide:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Using the source node settings for all destination nodes option is called a simple migration.&lt;/li&gt;
&lt;li&gt;Entering new network settings for &lt;strong&gt;one or more&lt;/strong&gt; destination nodes is called a network migration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;So as you can see, there should be no problem changing the IP address of a single node.
However, I had noticed back before the first attempt when adding a simple migration task, the steps in the process looked something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export data from all nodes&lt;/li&gt;
&lt;li&gt;Shutdown 11.5 node X&lt;/li&gt;
&lt;li&gt;Start installation task for node X on version 14&lt;/li&gt;
&lt;li&gt;Repeat the last two steps for all remaining nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network migration tasks look more like this, regardless of whether the node is keeping the same IP address or not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export data from all nodes&lt;/li&gt;
&lt;li&gt;Start installation task for node X on version 14&lt;/li&gt;
&lt;li&gt;Repeat installation task for all remaining nodes&lt;/li&gt;
&lt;li&gt;Shutdown 11.5 node X&lt;/li&gt;
&lt;li&gt;Repeat shutdown task for all remaining nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can you spot the issue here?
If the nodes that are keeping the same IP information don&#39;t have the 11.5 node shutdown first, there&#39;s going to be an IP address conflict.
I actually noticed this during the prep for the first migration attempt and opened a case with Cisco TAC about it.
The engineer I was working with on this case reference other TAC cases as documentation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For the new network migration, PCD will not shut down the nodes as no conflict will occur.
For same source migration PCD should shutdown the nodes before installing the destination node to avoid any conflicts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&#39;m guessing you can see where this is going by now.
The publisher began its install step as expected but despite the PCD task being told it would be reusing the same IP information, the old node was not shutdown and the install failed due to an IP conflict.
Fortunately, this was a fairly simple to fix.
SSH into the 11.5 server, give it the old &lt;code&gt;utils system shutdown&lt;/code&gt;, reboot the node running the installation and PCD took over to finish the install from there.
But, this meant that I needed to remain at my computer for the duration of the installation process for all nodes and as a new group of servers began their installs, I had to login and shutdown the old ones.&lt;/p&gt;
&lt;p&gt;While I was waiting for all servers to finish their install, I completed the IP changes on the UCXN, InformaCast, and Expressway-C servers, shutdown the old nodes, and upgraded the Expressway-C &amp;amp; E.
Around 9AM, 25 hours from the start of the migration, we were finally done and cursory testing was completed.
The two customer engineers and I all agreed to go get a few hours of sleep and meet again in the evening to wrap up things like licensing and certificates, which we did.
The following day (Monday if you&#39;re keeping score), we monitored the system, took care of some minor issues that came in via their ticketing system, and all seems well.&lt;/p&gt;
&lt;h1 id=&quot;final-thoughts&quot; tabindex=&quot;-1&quot;&gt;Final Thoughts &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Cisco-UC-Migration/#final-thoughts&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I think the biggest issue with PCD is how opaque the utility is.
It&#39;s very much worth using, especially with large clusters, but you just don&#39;t get the same detail of logging out of it as you would running your tasks manually through the CLI of each server.
Yes, you can open the console of your VM and watch the install process and the servers keep their own logs, but say your server gets exploded and the CLI is inaccessible from that point on.
You have no ability to go pull information after the fact, where if you had the live output from the process like you do from a CLI install task, you&#39;d have it in the scrollback of your console to reference.
You don&#39;t even get anything equivalent to a progress bar to know if some process has hung, just scheduled, in progress, and success messages for each task.
I also really take issue with the fact that the network migration task didn&#39;t shutdown servers to avoid IP conflicts like it clearly should.
This would have worked with a simple migration, but because of the single node we had changing, it malfunctioned and defeat the automated installation, which is kinda the whole point.&lt;/p&gt;
&lt;p&gt;The process I used for all of the other servers went great.
I really couldn&#39;t have asked for any of the stuff outside of CUCM &amp;amp; PCD to go any smoother.
I learned that sometimes for the sake of time, it may be better to cut your losses and take the last resort measure (rebuilding in this case) sooner, rather than troubleshooting in circles.
We may have been able to get this done in two tries or even a single long weekend if I&#39;d made the decision to rebuild everything more aggressively instead of waiting for TAC to come up with an answer I might like better.
I never did get any definitive answer from TAC on what the underlying issue was.
The most detailed answer I got was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the logs [collected from PCD] we can see below error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Line 84271: org.apache.axis2.AxisFault: Transport error: 404 Error: Not Found&lt;/code&gt;
&lt;code&gt;Line 84290: 2023-11-12 16:13:07,288 WARN  [DefaultQuartzScheduler_Worker-15] cisco.ucmap - SoapClientBase - Failure message = Transport error: 404 Error: Not Found&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Suggested user to customer rebuilt PCD then restore.
Based on the case notes and log analysis, I suspect the recovery disk and rebuild were suggested as database corruption was found on the dbIntegrity log, similar to symptoms seen on bug CSCvy68211, in which server rebuild is required to restore filesystem health, database integrity and proper feature functionality such as upgrade or migration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next time I have a migration project on my hands, I&#39;m going to give serious thought to using the new fresh installation with data import process offered by v14+.
For now, I&#39;m just happy that I don&#39;t have to worry about spending another entire weekend fighting with PCD anytime in the near future.&lt;/p&gt;
&lt;p&gt;If you&#39;ve made it to the end of this whole saga, thank you for reading.&lt;/p&gt;
&lt;p&gt;Have you had a similar experience with a maintenance window that went over like a lead balloon?
Do you have any advice on any of the processes I followed?
Shoot me an email using the button at the bottom of this post; I would love to hear from you.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Custom Keybinds with Better Touch Tool on MacOS</title>
		<link href="https://tomrobinson.io/posts/Custom-Keybinds-with-BTT-on-MacOS/"/>
		<updated>2024-01-04T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Custom-Keybinds-with-BTT-on-MacOS/</id>
		<content type="html">&lt;p&gt;I&#39;ve used &lt;a href=&quot;https://folivora.ai/&quot;&gt;Better Touch Tool&lt;/a&gt; for a few years now, but only for a few basic functions.
I had one problem to solve, creating global shortcuts to launch apps like I have setup in my tiling window managers.
I set that up to my liking and never explored any further into its capabilities.
Now my Mac workflow is the same way as my computer running &lt;a href=&quot;https://fedoraproject.org/&quot;&gt;Fedora&lt;/a&gt;.
The Option(⌥) key on the Mac keyboard is where the Super key would be on a standard keyboard.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⌥+b launches Firefox&lt;/li&gt;
&lt;li&gt;⌥+return launches Kitty terminal&lt;/li&gt;
&lt;li&gt;⌥+t opens Finder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recently took my BTT usage a step further and added a few key sequence shortcuts to &lt;a href=&quot;https://tomrobinson.io/posts/Caps-Lock-as-Esc-and-Ctrl/&quot;&gt;make caps lock an Esc/Ctrl key&lt;/a&gt;, which gives me even more mileage out of the app.
What never occurred to me though (but probably should have) is BTT can also create key binds for actions while focused on a specific app.
I occasionally use &lt;a href=&quot;https://tapbots.com/ivory/mac/&quot;&gt;Ivory&lt;/a&gt; to browse Mastodon.
It&#39;s always annoyed me that the developers added j and k binds for moving up and down between toots, but didn&#39;t go the extra step to add h and l to go back and forward or g and G (shift+g) for scroll to top and scroll to bottom.
Today, I finally put two and two together; I can now stop waiting for a day that may never come and just make my own key binds.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/BTT_Ivory.png&quot; alt=&quot;Better Touch Tool Key Binds for Ivory&quot; /&gt;&lt;/p&gt;
&lt;p&gt;While I know this isn&#39;t revolutionary and probably not even news to anyone who&#39;s used BTT before, it&#39;s a function I never thought to tap into and has made my day a little better.
Now that I have the idea in the back of my head, I&#39;m confident I&#39;ll find other places to use this feature... and vim keys all the things.&lt;/p&gt;
&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;After using these new keybindings for a few weeks, today was the first time I tried to write a new toot.
When I opened the text box, I noticed that my u key wasn&#39;t working and I realized the keybinds I had created were interfering with regular typing.
I came up with another somewhat hacky solution, which is to only enable those binds on windows not titled &lt;em&gt;Compose&lt;/em&gt; using the &lt;em&gt;advanced conditions&lt;/em&gt; option.
But I also had to take it one step further as it appears that excluding the &lt;em&gt;Compose&lt;/em&gt; window from the keybind doesn&#39;t just disable the shortcut and pass the key through, it disables the key altogether.
That means I had to create another keybind for each key that &lt;strong&gt;only&lt;/strong&gt; activates on the &lt;em&gt;Compose&lt;/em&gt; window and sends the key that was pressed.
My BTT configuration window now looks more like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/BTT_Ivory_Update.png&quot; alt=&quot;Better Touch Tool Keybinds to Pass Keys to Compose Window&quot; /&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Create More Consume Less</title>
		<link href="https://tomrobinson.io/posts/Create-More-Consume-Less/"/>
		<updated>2024-01-03T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Create-More-Consume-Less/</id>
		<content type="html">&lt;p&gt;Last year I had the idea to create this blog but didn&#39;t really follow through with it.
In the process of creating my own blog, I did however find a bunch of blogs and news feeds to follow via RSS.
One of the blogs I discovered last year was Manuel Moreale&#39;s and yesterday I saw his &lt;a href=&quot;https://manuelmoreale.com/@/page/CNGrtkaiFN9Kh0Pp&quot;&gt;post&lt;/a&gt; about creating more and consuming less this year.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I feel that is something I need to do for myself, for the sake of my mental sanity but I also think that’s something the internet as a whole would benefit from.
Consuming content online is, for the most part, a mindless act.
But creating content forces you to reflect, to introspect, to look at yourself and the world around you in different ways.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Though it&#39;s a short post, I found it inspiring enough that it prompted me to make a post (now two) here.
I like the idea of being reflective and introspective; I think I&#39;ll give it a try, thanks, Manuel.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Caps Lock as Esc &amp; Ctrl</title>
		<link href="https://tomrobinson.io/posts/Caps-Lock-as-Esc-and-Ctrl/"/>
		<updated>2024-01-02T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Caps-Lock-as-Esc-and-Ctrl/</id>
		<content type="html">&lt;p&gt;I haven&#39;t written anything for my blog in almost a year since setting it up. This is something I&#39;d like to change in the new year, so to start, I thought I&#39;d share something I found useful last year.&lt;/p&gt;
&lt;h1 id=&quot;use-caps-lock-as-esc-ctrl&quot; tabindex=&quot;-1&quot;&gt;Use Caps Lock as ESC + Ctrl &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/Caps-Lock-as-Esc-and-Ctrl/#use-caps-lock-as-esc-ctrl&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I almost never use the Caps Lock key when it is set to its default function. I guess I just don&#39;t do that much yelling on the internet?
A couple of years ago, I remapped this key&#39;s function to Ctrl, making a traditional keyboard on my laptop or desk behave more like the &lt;a href=&quot;https://hhkeyboard.us/hhkb/pro-hybrid-type-s&quot;&gt;HHKB&lt;/a&gt;.
Recently though, I found that it is possible to have the key act as ESC when tapped and released quickly, and Ctrl while held.
This gives you the best of both worlds, using ESC for quick Neovim navigation &amp;amp; easy access to the Ctrl key for modifier combinations that require it, like copy &amp;amp; paste.&lt;/p&gt;
&lt;h2&gt;MacOS Method&lt;/h2&gt;
&lt;p&gt;I have to start by saying, I don&#39;t personally know of a way to do this completely with free software.
While that may be possible, I purchased a copy of &lt;a href=&quot;https://folivora.ai/&quot;&gt;Better Touch Tool&lt;/a&gt; years ago and still happily use it for this and a few other functions.&lt;/p&gt;
&lt;p&gt;The first step is to set your Caps Lock key as Ctrl in System Settings &amp;gt; Keyboard &amp;gt; Keyboard Shortcuts &amp;gt; Modifier Keys.
Next, head into Better Touch Tool under the Key Sequences / Typed Word menu and click the + button in the main pane.
Type the key sequence in the provided box by tapping Caps Lock and releasing the key. Set the max pause to 0.3 and save.
In the actions pane, click the + and under the Keyboard Keys heading, find the ESC (Escape Key, respects pressed modifiers) option. That&#39;s it!
As a bonus, you can also create an additional action for pressing the real Control key + Caps Lock to trigger an action to toggle Caps Lock and keep the ability to use it the few times a year you might actually want to.&lt;/p&gt;
&lt;h2&gt;Hyprland Method&lt;/h2&gt;
&lt;p&gt;There are several different ways to do this on Linux. I&#39;m using a method I found on a &lt;a href=&quot;https://www.reddit.com/r/hyprland/comments/11v6iif/tutorial_making_caps_do_both_control_and_esc_like/&quot;&gt;Reddit thread&lt;/a&gt;.
I installed &lt;a href=&quot;https://github.com/ReimuNotMoe/ydotool&quot;&gt;ydotool&lt;/a&gt; from DNF. Then created a user service to start ydotoold in &lt;code&gt;$HOME/.config/systemd/user/&lt;/code&gt; called &lt;code&gt;ydotoold.service&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[unit]
Descritpion=Starts ydotoold service

[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/ydotoold --socket-path=&amp;quot;/home/tom/.ydotool_socket&amp;quot; --socket-own=&amp;quot;1000:1000&amp;quot;
ExecReload=/usr/bin/kill -HUP $MAINPID
KillMode=process
TimeoutSec=180

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the &lt;code&gt;--socket-path&lt;/code&gt; is set to your home directory and the &lt;code&gt;---socket-own&lt;/code&gt; is set to your uid, found with the command &lt;code&gt;echo $UID&lt;/code&gt;.
Start the service by running &lt;code&gt;systemctl --user enable --now ydotoold&lt;/code&gt;.
I also added the env variable &lt;code&gt;$YDOTOOL_SOCKET=$HOME/.ydotool_socket&lt;/code&gt; to my hyprland config.
In hyprland&#39;s config syntax, that&#39;s done like this: &lt;code&gt;env = YDOTOOL_SOCKET,$HOME/.ydotool_socket&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can then add the config options from Reddit into your hyprland configs. I have it split into two config files that make the most logical sense for the structure of my config.
In my &lt;code&gt;Settings.conf&lt;/code&gt; I have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;input {
  kb_options=caps:ctrl_modifier
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my &lt;code&gt;Keybinds.conf&lt;/code&gt; I have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bindr=CONTROL,Caps_Lock,exec, ydotool key 1:1 1:0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s it! Both platforms I use regularly now have this cool little trick deployed that turns one of the least used keys on my keyboard into one of the most used.
If you have any cool productivity hacks like this one that you&#39;d like to share, please feel free to shoot me a message on &lt;a href=&quot;https://fosstodon.org/@TomRobinsonIO&quot;&gt;Mastodon&lt;/a&gt; or send me an &lt;a href=&quot;mailto:blog@mail.tomrobinson.io&quot;&gt;email&lt;/a&gt;.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>My Home Server is Dying</title>
		<link href="https://tomrobinson.io/posts/Macserver-is-Dying/"/>
		<updated>2023-03-13T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/Macserver-is-Dying/</id>
		<content type="html">&lt;p&gt;I have a Mid 2014 Macbook Pro that since being retired as my main daily driver computer, has become my home server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/macserver.png&quot; alt=&quot;Macserver&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I originally set this computer up to run the Unifi Controller software for my Unifi Security Gateway.
It then slowly grew to host all sorts of other services I run in my house.
AdGuard Home, HomeBridge, Plex Media Server, Unbound... the list goes on.
Over the weekend, I was fighting with getting some plug-in updates for Neovim to run when I realized I was having a network issue.
DNS didn&#39;t seem to be working correctly, so I went to check out the &amp;quot;Macserver&amp;quot; in my closet and it had shut itself off.
When I went to turn it back on, I noticed it had happened again.
The battery has swelled so badly that it&#39;s bowing the chassis and preventing the trackpad from physically clicking.
This has happened once before.
I sent this same computer into Apple for a battery replacement back in 2020 and paid the low low cost of $234 to have the battery replaced.
The Mac&#39;s software is supposed to attempt to prevent battery swelling by not fully charging the device if it is frequently used plugged in, but this doesn&#39;t appear to have worked.
So, just a few years later, I find myself at a crossroads.
Do I replace the battery again, I&#39;m sure for at least another $234, on what is an otherwise fairly well working machine, or do I replace the old laptop with something better suited for the job?&lt;/p&gt;
&lt;p&gt;Macserver is old. It stopped receiving new OS releases after Big Sur, in 2020.
It doesn&#39;t have a lot of internal storage, only a 512GB SSD.
This is fine for a personal laptop, but less so for a server that (among other things) is used for... storage.
It runs Docker, but with some limitations that Docker&#39;s documentation states is due to MacOS itself.&lt;/p&gt;
&lt;p&gt;I think it may be time to bite the bullet, retire my old beloved &amp;quot;Macserver&amp;quot; and upgrade to something more purpose built.
Today I started looking at the HPE ProLiant ML30 Gen10.
This (without storage) would cost me around $1000 and be able to run all of my home services, add some real storage power so that I can finally setup NextCloud, and have enough spare horsepower to run some Cisco VMs for a home lab.
I haven&#39;t yet had much time to compare other hardware or map out a real design for this, but I think it&#39;s safe to say this will be my next big project.
Hopefully, it will also give me a reason to write more posts about the process of putting it all together as well.&lt;/p&gt;
&lt;p&gt;If you have any suggestions on hardware, OS, or just cool toys to run on a home server, send me an email or a mention on &lt;a href=&quot;https://fosstodon.org/@tomrobinsonio&quot;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How I Use my Mac</title>
		<link href="https://tomrobinson.io/posts/How-I-Use-My-Mac/"/>
		<updated>2023-02-17T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/How-I-Use-My-Mac/</id>
		<content type="html">&lt;p&gt;I&#39;ve been using MacOS since around 2011. Before that, I was using an old ASUS laptop running Linux Mint as both my personal and work computer.
At the time, there were several pieces of software (thanks Cisco and VMware) I needed for work and study that, despite all of my efforts, I couldn&#39;t get to work and ultimately caved to my boss&#39; idea that I get a Mac.
Today, I have two M1 Macbooks Pro. One I bought in 2021 when they were released and one issued by work.
MacOS recent releases feel like Apple is trying to push the system more in the iOS direction of simplification. It doesn&#39;t feel very &amp;quot;pro&amp;quot; anymore.
For that and a number of other reasons, I prefer to use my desktop running Arch most of the time. But having the laptop form factor still keeps me reaching for the Mac often enough.
So, here are a few tools and configuration tweaks I use to make it better fit my workflow.&lt;/p&gt;
&lt;p&gt;I use a few apps to make the Mac behave more like my dwm configuration on Arch. To start, I have 10 &amp;quot;Desktops&amp;quot; setup. I use these in a similar way I use tags in dwm. I usually keep specific apps on specific desktops.
In System Preferences &amp;gt; Keyboard &amp;gt; Keyboard Shortcuts &amp;gt; Mission Control I have Option ⌥ (which is where the super key would be) + 1 - 0 set to switch between the desktops.
This way, muscle memory knows ⌥ + 1 is my browser, ⌥ + 2 is my terminal, ⌥ + 5 is Music and Overcast... you get the idea.&lt;/p&gt;
&lt;p&gt;I also use a tiling window manager called &lt;a href=&quot;https://github.com/ianyh/Amethyst&quot;&gt;Amethyst&lt;/a&gt; to arrange my windows.
I&#39;ve configured hotkeys for Option ⌥ + Shift ⇧ + 1 - 0 to move windows to a specific desktop and a few binds ⌥ + j or k to switch between windows in a stack, ⌥ + ⇧ + j or k to rotate stack, etc.&lt;/p&gt;
&lt;p&gt;I use Better Touch Tool to create keybindings to launch apps like ⌥ + enter for my terminal or ⌥ + b for my browser. Finally, I use Alfred to do anything less common like launch programs I don&#39;t use every day, do web searches, copy passwords and so on.&lt;/p&gt;
&lt;p&gt;With my browser, I use an extension called &lt;a href=&quot;https://vimium.github.io/&quot;&gt;Vimium&lt;/a&gt; to allow me to use vim like keybindings to navigate around pages.&lt;/p&gt;
&lt;p&gt;When I&#39;m not in the browser, I&#39;m most likely in the terminal. I use &lt;a href=&quot;https://alacritty.org/&quot;&gt;Alacritty&lt;/a&gt; with &lt;a href=&quot;https://github.com/tmux/tmux&quot;&gt;tmux&lt;/a&gt; on launch to keep tabs consistently open to the TUI programs I usually have open.&lt;/p&gt;
&lt;p&gt;For file system navigation I use a combination of &lt;a href=&quot;https://github.com/rupa/z&quot;&gt;z&lt;/a&gt; which tracks your most commonly used directories and can cd to them with shorthand, &lt;a href=&quot;https://github.com/gokcehan/lf&quot;&gt;lf&lt;/a&gt; as a file browser,
and &lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt; configured with &lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;RipGrep&lt;/a&gt; for fuzzy searching.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>SSH Syntax Highlighting</title>
		<link href="https://tomrobinson.io/posts/SSH-Syntax-Highlighting/"/>
		<updated>2023-02-10T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/SSH-Syntax-Highlighting/</id>
		<content type="html">&lt;p&gt;I was having a conversation in a group chat with some of my old colleagues turned friends the other day when the conversation turned to Linux vs. Windows.
One of my friends, who is a network engineer and spends a good portion of his day SSH&#39;d into equipment, said something along the lines of &amp;quot;Most of the time I&#39;m fighting my workflow, working in Linux.
Like, this is a big one for me. Fucking keyword highlight in SSH sessions dude.&amp;quot; I figured this had to be something easy to accomplish, but I&#39;ve never actually tried. So, I did some searching and before long, I had a very promising solution.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/SecureCRT_Highlights.png&quot; alt=&quot;SecureCRT&quot; title=&quot;SecureCRT the 10 Ton Gorilla&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://github.com/hSaria/ChromaTerm&quot;&gt;ChromaTerm&lt;/a&gt;!&lt;/h3&gt;
&lt;p&gt;As the GitHub page describes it: &amp;quot;ChromaTerm (ct) is a Python script that colors your terminal&#39;s output using regular expressions. It even works with interactive programs, like SSH.&amp;quot;&lt;/p&gt;
&lt;p&gt;Cool, so with this script, we can create a YAML file with regex rules to highlight as we see fit. Now all I need to do is create a configuration to make it useful for network devices.
Unless... &lt;a href=&quot;https://github.com/danielmacuare/netcli-highlight&quot;&gt;someone&#39;s already done that for me&lt;/a&gt;.
Using the .chromaterm.yml in this repo as a jumping off point, I&#39;ve now added a few highlights of my own and customized some of the colors to make it fit what I&#39;m looking for. This really does make a big difference when looking at configs via SSH.
My next down time task is going to be adding highlighting for some of the most common (and usually very chatty) debugs I use when troubleshooting SIP and PRI connections for my own job.
Once I have some highlights for Cisco CUBEs, I &lt;s&gt;may&lt;/s&gt; will &lt;a href=&quot;https://github.com/TomRobinsonIO/dotfiles/blob/main/chromaterm/.chromaterm.yml&quot;&gt;post the file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tomrobinson.io/img/SSH_CT.png&quot; alt=&quot;SSH with CT&quot; title=&quot;SSH, now in color!&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;The Drawback&lt;/h3&gt;
&lt;p&gt;I have one small issue with ct. I added &lt;code&gt;ssh() { /usr/bin/ssh &amp;quot;$@&amp;quot; | ct; }&lt;/code&gt; to my .zshrc as noted in the readme of the repository and it does work. But, when I SSH to any of my devices that displays its own colors, ct displays them incorrectly.
I may see if I can come up with a better way to bypass ct, but for now, I&#39;ll be removing the command from my .zshrc and creating an alias like &lt;code&gt;sshc&lt;/code&gt; or something so that I can choose to only use ct when I connect to specific devices.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>FOSS Alternatives for my Workflow</title>
		<link href="https://tomrobinson.io/posts/FOSS-Alternatives-for-my-Workflow/"/>
		<updated>2023-02-08T00:00:00Z</updated>
		<id>https://tomrobinson.io/posts/FOSS-Alternatives-for-my-Workflow/</id>
		<content type="html">&lt;p&gt;I somewhat recently started using Linux again, originally just to see how I liked it. I haven&#39;t really daily driven a Linux desktop since 2011. Now, I&#39;ve been using my computer with Arch installed more regularly. I&#39;ve been able to find a lot of alternatives to proprietary Mac software, but some others I&#39;m still struggling with.&lt;/p&gt;
&lt;h1 id=&quot;great-alternatives-i-ve-found&quot; tabindex=&quot;-1&quot;&gt;Great Alternatives I&#39;ve Found &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/FOSS-Alternatives-for-my-Workflow/#great-alternatives-i-ve-found&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3&gt;Alfred to dmenu&lt;/h3&gt;
&lt;p&gt;Alfred is a Mac launcher and replacement for Spotlight. Alfred can do a lot of things Spotlight can&#39;t.
I frequently make use of the clipboard history, snippets, and a few workflows like a &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt; workflow that combined with Bitwarden&#39;s CLI client,
can search for passwords in your vault and copy them to your clipboard.&lt;/p&gt;
&lt;p&gt;I&#39;ve been able to recreate a lot of what I use Alfred for in &lt;a href=&quot;https://tools.suckless.org/dmenu/&quot;&gt;dmenu&lt;/a&gt;.
Using &lt;a href=&quot;https://github.com/andykais/bitwarden-dmenu&quot;&gt;bitwarden-dmenu&lt;/a&gt;, for example, I have the same functionality I had with the Alfred workflow.
With &lt;a href=&quot;https://gitlab.com/dwt1/dmscripts&quot;&gt;DT&#39;s dmscripts&lt;/a&gt;, I get web searches, menus for locking or sleeping the computer, man pages, weather and more right from the launcher.
I would say this has been a huge success in replacing 99% of what Alfred does for me on the Mac.&lt;/p&gt;
&lt;h3&gt;Notes to Joplin&lt;/h3&gt;
&lt;p&gt;I have been using Apple&#39;s Notes app since it was released. It isn&#39;t a particularly complexed note app, but that&#39;s what I need.
I wanted something that I had the ability to fully encrypt though. So I found and switched to &lt;a href=&quot;https://joplinapp.org/&quot;&gt;Joplin&lt;/a&gt; and so far, I&#39;ve been very happy.
I love the fact that there is a terminal client as well as a desktop app for Linux and Mac, plus an iOS app. I also very much enjoy the fact that notes are formatted using Markdown.
The two drawbacks I have yet to find my way around are document scanning, which I still use notes for at the moment and then move the scan to Joplin, and sharing notes with my family.&lt;/p&gt;
&lt;h3&gt;Logic to Reaper&lt;/h3&gt;
&lt;p&gt;Even though I spent money on Logic and a fair amount of time figuring it out, I still think &lt;a href=&quot;https://reaper.fm/&quot;&gt;Reaper&lt;/a&gt; may be even better.
It comes with a great set of built-in plugins, works on both Mac and Linux, has some great customization options and a very strong community of people creating educational content around it.
I have really only scratched the surface with this one, but I&#39;m enthusiastic about the potential.&lt;/p&gt;
&lt;h3&gt;Cider for Apple Music&lt;/h3&gt;
&lt;p&gt;This isn&#39;t really a replacement so much as a front-end for Linux use. &lt;a href=&quot;https://cider.sh/&quot;&gt;Cider Classic&lt;/a&gt; (I&#39;m finding out as I&#39;m writing this is end of life) is an Electron app with a very similar UI to the Mac Apple Muisc client,
but has some additional features included. I haven&#39;t found a great way to break away from music streaming yet.
As far as I can tell, Apple Music still has the best music quality (lossless only on their official clients) and isn&#39;t any worse for privacy than any other service.&lt;/p&gt;
&lt;h1 id=&quot;things-i-still-need&quot; tabindex=&quot;-1&quot;&gt;Things I Still Need &lt;a class=&quot;direct-link&quot; href=&quot;https://tomrobinson.io/posts/FOSS-Alternatives-for-my-Workflow/#things-i-still-need&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h3&gt;Reminders&lt;/h3&gt;
&lt;p&gt;I would think this would be one of the simpler things to replace. I use Apple&#39;s Reminders frequently for simple tasks, usually that need to be done on a specific date.
I have tons of reminders for things like giving the dog her meds on the 1st of every month or canceling a subscription 8 months from now.
What I need is something simple, with the ability to schedule and mark off tasks, that will reliably notify me on my phone and my computer.
Equally as importantly, it needs to keep reminding me until I mark the task complete or let me sleep a notification if I can&#39;t do that task right this second.
Joplin has a to-do functionality, but I&#39;ve had mixed results with the notifications working. I also don&#39;t believe I can tell a notification I&#39;m not ready to deal with to &amp;quot;remind me again tomorrow morning&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Messages&lt;/h3&gt;
&lt;p&gt;I don&#39;t think this one needs any introduction. It&#39;s no secret that one of Apple&#39;s biggest points for lock-in is iMessage. I use &lt;a href=&quot;https://www.signal.org/&quot;&gt;Signal&lt;/a&gt; with a group of tech industry friends and I think it&#39;s awesome.
The majority of the people I talk to regularly though all have iPhones or other Apple devices and all use iMessage as their default communication method.
I have received a few notifications from Signal that someone in my contacts list as joined, but they usually don&#39;t answer when I message them, making me think they&#39;ve probably already deleted the app from their phone.
Maybe I&#39;m just not pushy enough to get my friends and family to move.&lt;/p&gt;
&lt;h3&gt;Overcast&lt;/h3&gt;
&lt;p&gt;Man, I really love Overcast for podcasts. The sync feature always seems to work between devices, the UI is simple and clean, and smart speed to dynamically shorten silence in conversations is like magic.
I happily pay the $10/yr for this app, written by a small single developer, because I think it&#39;s worth the price. However, it is only developed for iOS, though iPad version does work on my M1 Mac.
I have seriously considered just keeping this one. There is a half way decent website for it that lets me listen on Linux. The developer put a notice on the site at then end of last year saying he was going to shut the web version down.
He later decided that he wasn&#39;t going to be killing the site and explained why on his podcast, &lt;a href=&quot;https://atp.fm/516&quot;&gt;ATP&lt;/a&gt;.
This is great news for now, but it was a strong reminder that my use case may not be top priority for a &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_as_a_service&quot;&gt;SaaS&lt;/a&gt; app and things can change at any moment.&lt;/p&gt;
</content>
	</entry>
</feed>
