<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>App on Pauls Blog</title><link>https://prule.github.io/pauls-blog/tags/app/</link><description>Recent content in App on Pauls Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 22 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://prule.github.io/pauls-blog/tags/app/index.xml" rel="self" type="application/rss+xml"/><item><title>Creating and releasing an application</title><link>https://prule.github.io/pauls-blog/post/coding/2026/creating-an-application/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/creating-an-application/</guid><description>&lt;h2 id="creating-and-releasing-an-application"&gt;Creating and releasing an application&lt;/h2&gt;
&lt;p&gt;I love sim racing, so I thought it would be an interesting exercise to create an application that makes use of Assetto Corsa Competizione (ACC) telemetry.&lt;/p&gt;
&lt;p&gt;The basic operation is this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client sends a registration message to ACC&lt;/li&gt;
&lt;li&gt;ACC replies and starts sending telemetry messages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is all done over UDP.&lt;/p&gt;
&lt;h2 id="acc-messages"&gt;ACC messages&lt;/h2&gt;
&lt;p&gt;The first step was to create a library that could parse the message byte streams. There is a little bit of documentation in the way of some C# code and a &lt;code&gt;ServerAdminHandbook.pdf&lt;/code&gt; that can be found in the ACC installation.&lt;/p&gt;</description></item><item><title>Leave planner 1.1.0</title><link>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner-1_1_0/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner-1_1_0/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://prule.github.io/leave-planner/" target="_blank" rel="noopener"&gt;Leave Planner&lt;/a&gt;
 helps you track your leave balance and plan future holidays with ease.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="announcing-leave-planner-v110-work-from-home-tracking--more"&gt;Announcing Leave Planner v1.1.0: Work From Home Tracking &amp;amp; More!&lt;/h1&gt;
&lt;p&gt;This update brings a feature to help you manage your work life better, along with some under-the-hood improvements.&lt;/p&gt;
&lt;h2 id="-work-from-home-wfh-tracking"&gt;🏠 Work From Home (WFH) Tracking&lt;/h2&gt;
&lt;p&gt;With the rise of hybrid work, keeping track of the days you work from home is more important than ever, especially for tax purposes. Leave Planner now allows you to easily log your WFH days.&lt;/p&gt;</description></item><item><title>Leave planner application</title><link>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/leave-planner/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Ever wanted to know how much leave you&amp;rsquo;ll have in the future and easily visualise your balance over time? Sure, some leave systems have some kind of future leave calculator, but none that I&amp;rsquo;ve seen make it easy or intuitive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Application available here, on github pages: &lt;a href="https://prule.github.io/leave-planner/" target="_blank" rel="noopener"&gt;https://prule.github.io/leave-planner/&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="the-spreadsheet-prototype"&gt;The spreadsheet prototype&lt;/h2&gt;
&lt;p&gt;To scratch my own itch, I started with a google sheet. The principle is simple: Enter your starting balance, and for each month fill in the estimated hours leave accrued. Add in your hours leave taken for the month&amp;hellip; and graph the total leave remaining.&lt;/p&gt;</description></item><item><title>YouTube channel aggregator experiment</title><link>https://prule.github.io/pauls-blog/post/coding/2026/youtube-channel-aggregator/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2026/youtube-channel-aggregator/</guid><description>&lt;p&gt;While trying to keep up with what&amp;rsquo;s happening in tennis and motorsport, I found myself wondering if the experience could be better. What if I could configure a list of channels, aggregate the videos, tag those videos by looking for keywords in their titles, and then have a convenient way to filter and navigate those.&lt;/p&gt;
&lt;p&gt;This provides me with a feed of relevant content which I can view oldest to newest. Watched videos are marked so they disappear from the feed, allowing me to pick up where I left off.&lt;/p&gt;</description></item><item><title>Introduction to JSON5</title><link>https://prule.github.io/pauls-blog/post/coding/2025/json5/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/json5/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;Json5 is a superset of JSON that allows for comments and trailing commas. It’s a popular choice for configuration files due to its readability and flexibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;From the website:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="quoteblock"&gt;
&lt;blockquote&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Formally, the JSON5 Data Interchange Format is a superset of JSON (so valid JSON files will always be valid JSON5 files) that expands its syntax to include some productions from ECMAScript 5.1 (ES5). It’s also a subset of ES5, so valid JSON5 files will always be valid ES5.*&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Dependency upgrades with Renovate</title><link>https://prule.github.io/pauls-blog/post/coding/2025/renovate/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2025/renovate/</guid><description>&lt;div class="paragraph"&gt;
&lt;p&gt;In modern software development, managing dependencies is a critical yet often overlooked aspect of maintaining healthy codebases. Enter Renovate: an open-source tool that automates dependency updates, making your project maintenance both easier and more secure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sect1"&gt;
&lt;h2 id="_what_is_renovate"&gt;What is Renovate?&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;Renovate is an automated dependency management tool that monitors your repository’s dependencies and automatically creates pull requests when updates become available. Think of it as your personal assistant that constantly checks for new versions of the libraries and packages your project uses.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>Clean architecture - part 1</title><link>https://prule.github.io/pauls-blog/post/coding/2024/clean-architecture-1/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://prule.github.io/pauls-blog/post/coding/2024/clean-architecture-1/</guid><description>&lt;div class="sect1"&gt;
&lt;h2 id="_clean_architecture_part_1"&gt;Clean architecture - part 1&lt;/h2&gt;
&lt;div class="sectionbody"&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;After porting my template app over to Kotlin, I thought it was time to attempt rewriting from a layered architecture to a ports and adapters/hexagonal architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="paragraph"&gt;
&lt;p&gt;In the layered version, the usual patterns exist:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The domain models ARE the database entities&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The domain model is compromised, cluttered with persistence concerns and far from clean&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Services implement the business logic, manipulating the domain (database entities) and persisting them via the repositories&lt;/p&gt;
&lt;div class="ulist"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unfortunately the services usually end up being classes with a bunch of methods&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description></item></channel></rss>