<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Infinytum]]></title><description><![CDATA[Project Updates, Engineering and more!]]></description><link>https://infinytum.co/</link><image><url>https://infinytum.co/favicon.png</url><title>Infinytum</title><link>https://infinytum.co/</link></image><generator>Ghost 5.3</generator><lastBuildDate>Thu, 09 Apr 2026 20:28:14 GMT</lastBuildDate><atom:link href="https://infinytum.co/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Go-Mojito: Your quick-start into Golang-based Websites and APIs]]></title><description><![CDATA[<p>Golang has been on the rise ever since it&apos;s release and managed to make a name for itself in the cloud development space. Popular software like Docker, Kubernetes and Caddy have all been written in Golang, bringing joy to developers at home or carrying big corporate clusters that</p>]]></description><link>https://infinytum.co/go-mojito-your-flash-start-into-golang-based-websites-and-apis/</link><guid isPermaLink="false">624f161fdef4d4006296721b</guid><category><![CDATA[Projects]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Thu, 07 Apr 2022 20:17:11 GMT</pubDate><media:content url="https://infinytum.co/content/images/2022/04/UsbFNiY4_4x-min.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2022/04/UsbFNiY4_4x-min.jpg" alt="Go-Mojito: Your quick-start into Golang-based Websites and APIs"><p>Golang has been on the rise ever since it&apos;s release and managed to make a name for itself in the cloud development space. Popular software like Docker, Kubernetes and Caddy have all been written in Golang, bringing joy to developers at home or carrying big corporate clusters that serve our everyday needs.</p><p>Introducing Go-Mojito, a simple framework that will help you create websites and APIs with ease. Go-Mojito is the official successor to the PHP-based framework &quot;Scalar&quot; and is almost fully compatible with existing Website templates. </p><h3 id="features">Features</h3><p>While this is not a complete list of all features, it should give you an idea of what Go-Mojito is capable of (And possibly what it&apos;s not capable of).</p><h4 id="dependency-injection">Dependency Injection</h4><p>One of the most annoying things to do is managing all your database connections, caches, logging instances, configurations... You get the idea. Go-Mojito can manage singleton as well as transient dependencies for you, and inject them where-ever you need them. This includes all handlers that are called by Go-Mojito. </p><figure class="kg-card kg-code-card"><pre><code class="language-go">package main

// Dependencies can be either inline like this
func InlineDependency(ctx mojito.Context, cache mojito.Cache) {
	...
}

// Or they can be collected in a struct
type Dependencies struct {
	Cache  mojito.Cache  `injector:&quot;type&quot;`
	Logger mojito.Logger `injector:&quot;type&quot;`
}

func StructDependency(ctx mojito.Context, ctx Dependencies) {
	...
}</code></pre><figcaption>Inline dependencies cannot be named dependencies as we have no way of knowing if you wanted a type-based or name-based dependency</figcaption></figure><p>In this example, you can see that dependencies can be either directly in the method signature or separated out into a struct.</p><p>Keen eyes will spot the <code>injector:&quot;type&quot;</code> tag in the struct, this tag tells the dependency injector to fill the field based on its type. That means, that whatever is registered as default for the type will be injected. The other option would be, <code>injector:&quot;name&quot;</code> which would resolve the dependency based on its type <strong>and </strong>name. This is necessary, because there can be multiple dependencies of the same type under a different name. A good example is database connections or caches.</p><figure class="kg-card kg-code-card"><pre><code class="language-go">package main

import (
	&quot;github.com/go-mojito/mojito&quot;
)

func main() {
	// This is how you register a singleton
	mojito.Register(func() YourType {
		var yourType YourType
		// Construct your type
		return yourType
	}, true)
    
    // And this is how you register a transient
    mojito.Register(func() YourType {
		var yourType YourType
		// Construct your type
		return yourType
	}, false)
}</code></pre><figcaption>The important part here is the return type of the function. It defines what type you are registering the dependency for</figcaption></figure><p>Registering a new dependency is as easy as the above. You tell Go-Mojito how to construct your dependency when it&apos;s needed by providing a constructor function, the boolean tells Mojito whether this is a singleton or a transient dependency. This will register the <strong>default</strong> dependency for the returned type. If you want to have multiple dependencies of the same type under different names, you have to register it in the following way.</p><figure class="kg-card kg-code-card"><pre><code class="language-go">package main

import (
	&quot;github.com/go-mojito/mojito&quot;
)

func main() {
	// This is how you register a named singleton
	mojito.RegisterNamed(&quot;name&quot;, func() YourType {
		var yourType YourType
		// Construct your type
		return yourType
	}, true)
}</code></pre><figcaption>If there is already a dependency with that name, you override that named dependency</figcaption></figure><p>And that is all there is about dependency injection. It&apos;s simple, but very powerful, and will surely lessen the pain of managing your application-wide connections and objects.</p><h4 id="extensibility-modularity">Extensibility &amp; Modularity</h4><p>The framework has been designed with extensibility and modularity in mind. This is why you can replace any part of the Mojito framework with your own. Don&apos;t like the default logger? Swap it out. Fancy a different template language? Sure, replace the built-in renderer. Or just register a second one and use two template formats at the same time, it&apos;s up to you! The only thing you cannot replace is the dependency injector, as it would need to inject itself, which would make for a great paradox but not for great code :)</p><figure class="kg-card kg-code-card"><pre><code class="language-go">package main

import (
	&quot;github.com/go-mojito/mojito&quot;
)

func main() {
	mojito.Register(func() mojito.Logger {
		var yourType YourLogger
		// Construct your logger
		return yourType
	}, true)
}</code></pre><figcaption>Usually you won&apos;t need to do this, unless you are not satisfied with the provided defaults</figcaption></figure><p>And just like that, the default logger has been replaced, all of Go-Mojito will automatically adjust to that change. It works best when you do this in an init method, then even the very first log messages will be printed using your logger.</p><p>In fact, that is how you replace everything in Go-Mojito, just override its default dependency. Of course, if you end up replacing everything, then I would ask why you even use Mojito, perhaps because of the handlers that work the same way even when you change the router? That&apos;s right, the only thing you cannot replace is the custom handler and middleware design. This is to ensure consistency across different routers and of course to retain the dependency injection ability.</p><h4 id="middleware-support">Middleware Support</h4><p>Speaking of middleware, Mojito has full support for early and late middleware, meaning before and after the handler executed. Middlewares have full access to the ViewBag and any metadata set on the request. They can also modify both objects or replace them completely if needed. They can even have dependencies injected just like handlers!</p><figure class="kg-card kg-code-card"><pre><code class="language-go">package main

import (
	&quot;fmt&quot;

	&quot;github.com/go-mojito/mojito&quot;
)

func main() {
	// Enable middleware on all routes
	mojito.WithMiddleware(RequestLogger)
    
    // Or just for a subset of routes
    mojito.WithGroup(&quot;/group&quot;, func(group router.Group) {
		group.WithMiddleware(RequestLogger)
	})
}

func RequestLogger(ctx mojito.Context, next func() error) (err error) {
	var start = time.Now()
	err = next()
	mojito.DefaultLogger().Fields(LogFields{
		&quot;ms&quot;:   time.Since(start).Milliseconds(),
		&quot;path&quot;: ctx.Request().GetRequest().URL.Path,
	}).Info(ctx.Request().GetRequest().Method)
	return
}</code></pre><figcaption>RequestLogger is part of the mojito package and can be used as mojito.RequestLogger</figcaption></figure><h4 id="template-rendering">Template Rendering</h4><p>Of course, there is no website without HTML code. To help you reduce duplicate code and get your content into your pages, Go-Mojito ships with a template renderer. By default, standard go templates can be used. We recommend using our Handlebars renderer though. There are a few benefits to the Handlebars renderer.</p><p>First, the partial system has been extended to dynamically load partials from your template directory. That means that you do not have to register your partials before using them, but instead you can just put in the relative file path of your partial. </p><p>Second, you can extend templates! It&apos;s like reverse partials. For example, your layout can be extended by all your subpages.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;html&gt;
    &lt;head&gt;
    	&lt;title&gt;Layout&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;h1&gt; Fancy Website Here &lt;/h1&gt;
    	{{{subview}}}
    &lt;/body&gt;
&lt;/html&gt;</code></pre><figcaption>This could be a potential extenable view. Easily spotted by the {{{subview}}}</figcaption></figure><p>And then you can extend the above using template code like this.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">{{#extends &quot;Path/To/Above&quot;}}
&lt;h2&gt;And this is a page of this website&lt;/h2&gt;
{{/extends}}</code></pre><figcaption>You can dynamically extend templates by replacing the &quot;&quot; with a variable containing the template name</figcaption></figure><p>As you can see, everything wrapped in the extends helper will be injected into the extended template, if the extended template contains a {{{subview}}} placeholder.</p><h3 id="try-it-yourself">Try it yourself</h3><p>Using the above and the example code in the repository, you should be able to get something up and running in no time. If not, just open up an issue and tell us what went wrong. Please also consult our <a href="https://go-mojito.infinytum.co">documentation</a> before opening a ticket.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/go-mojito/mojito"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - go-mojito/mojito: Code your next Go web project with (a) Mojito! Mojito is a super-modular, fast, opinion-less framework to bootstrap your next Go web project.</div><div class="kg-bookmark-description">Code your next Go web project with (a) Mojito! Mojito is a super-modular, fast, opinion-less framework to bootstrap your next Go web project. - GitHub - go-mojito/mojito: Code your next Go web proj...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Go-Mojito: Your quick-start into Golang-based Websites and APIs"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">go-mojito</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/f0c6a8659ac7536418db15b951ed6cac7736f994e96c1882ea4c069fd0ae771e/go-mojito/mojito" alt="Go-Mojito: Your quick-start into Golang-based Websites and APIs"></div></a></figure><p>For a bit of additional help to get started, please take a look at this tutorial written with Mojito. It will show you how all of the above features work and should give a good example on how to start with your app.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://go-mojito.infinytum.co/tutorial"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Go-Mojito - Code your next Go web project with (a) Mojito!</div><div class="kg-bookmark-description">Go-Mojito is a fully customizable and modular web framework that allows you to write projects that do not hard-depend on any router, template engine, cache or logger.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://go-mojito.infinytum.co/favicon.ico" alt="Go-Mojito: Your quick-start into Golang-based Websites and APIs"><span class="kg-bookmark-author">Code your next Go web project with (a) Mojito!</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://go-mojito.infinytum.co/assets/images/logo.svg" alt="Go-Mojito: Your quick-start into Golang-based Websites and APIs"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[The Story of TeSlate]]></title><description><![CDATA[Tesla already had a widget available at the time, so why did I choose to create TeSlate?]]></description><link>https://infinytum.co/the-story-of-teslate/</link><guid isPermaLink="false">61f2b1568a3d1500625415f3</guid><category><![CDATA[TeSlate]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Thu, 27 Jan 2022 17:39:10 GMT</pubDate><media:content url="https://infinytum.co/content/images/2022/01/1_5156855889575018838.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2022/01/1_5156855889575018838.jpg" alt="The Story of TeSlate"><p>TL;DR We turned a great concept design, created by D7mtg, into reality. The App Store listing is linked at the end of the article.</p><p>It was September 18th, 2020. The pandemic has forced many to stay at home, including myself. Just two days earlier, Apple released iOS 14 which brought us a new form of widgets that can be placed anywhere on our home screen. Widgets already existed before iOS 14, but they were hidden away on a separate page on the home and lock screen.</p><p>Many apps had already implemented widgets that can be placed on that widget page. Tesla was no exception and treated users to an interactive widget that can unlock the car or open the frunk. In fact, the ability to create interactive buttons was one of the advantages of the older widgets. But what made them quite unusable was the fact that you could not place those widgets on the home screen.</p><h2 id="story-time">Story Time</h2><p>I was browsing Twitter, which was full of iOS 14 news at the time. While browsing, I happened to bump into a repost of this <a href="https://www.reddit.com/r/teslamotors/comments/hsfatt/what_would_you_guys_think_of_something_like_that">Reddit post</a> with a concept for a Tesla widget for the home screen. My opinion on it was pretty clear right away: I need to have this in my life immediately. It&apos;s providing all the information I want without opening the app, and is looking good while doing so! </p><p>I knew I wanted to make this, so I tracked down the creator and found that it was designed by a designer working for <a href="https://d7m.tg?utm_source=teslate&amp;utm_medium=web&amp;utm_campaign=jan22">D7mtg, a branding agency in Brooklyn</a>. I sent them a Telegram message, asking if they would give me permission to build an app based on their design. Thankfully they were quite excited about me bringing their idea to life. I worked closely with them to get to a result we are both satisfied with. </p><p>The original idea of the concept was expanded to support multiple widget sizes, as well as custom widget backgrounds and accounts with multiple cars. The app has also been released on Apple Silicon Macs, so you can keep an eye on your Tesla while working on your Mac.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://apps.apple.com/app/teslate/id1532406445?l=en"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#x200E;TeSlate</div><div class="kg-bookmark-description">&#x200E;TeSlate is a beautiful widget crafted for iOS 14. TeSlate communicates with your Tesla vehicle and shows you useful information on your home screen. Choose which car is displayed in the app.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://apps.apple.com/favicon.ico" alt="The Story of TeSlate"><span class="kg-bookmark-author">App Store</span><span class="kg-bookmark-publisher">Michael Teuscher</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://is5-ssl.mzstatic.com/image/thumb/Purple115/v4/ec/e6/34/ece6346c-080a-9137-c72f-db26af3065f0/AppIcon-0-1x_U007emarketing-0-10-0-85-220.png/1200x630wa.png" alt="The Story of TeSlate"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Fixing my fingerprint reader on Linux by writing a driver for it]]></title><description><![CDATA[<p>TL;DR: You can find the driver by <a href="https://github.com/infinytum/libfprint/tree/driver/goodix-521d">clicking here</a>. It is also available as an <a href="https://aur.archlinux.org/packages/libfprint-goodix-521d/">AUR package</a>. For a tutorial on how to flash the firmware, please follow <a href="https://github.com/knauth/goodix-521d-explanation">this guide</a>&apos;s step 1. Also you will need <a href="https://archive.archlinux.org/packages/f/fprintd/fprintd-1.92.0-1-x86_64.pkg.tar.zst">version 1.92 of fprintd</a> for this driver to work as</p>]]></description><link>https://infinytum.co/fixing-my-fingerprint-reader-on-linux-by-writing-a-driver-for-it/</link><guid isPermaLink="false">615dc8129c3e5a0061d3bc6d</guid><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Wed, 06 Oct 2021 21:40:35 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1585079374502-415f8516dcc3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGZpbmdlcnByaW50JTIwc2Vuc3xlbnwwfHx8fDE2MzM1MzYwMTI&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1585079374502-415f8516dcc3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGZpbmdlcnByaW50JTIwc2Vuc3xlbnwwfHx8fDE2MzM1MzYwMTI&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Fixing my fingerprint reader on Linux by writing a driver for it"><p>TL;DR: You can find the driver by <a href="https://github.com/infinytum/libfprint/tree/driver/goodix-521d">clicking here</a>. It is also available as an <a href="https://aur.archlinux.org/packages/libfprint-goodix-521d/">AUR package</a>. For a tutorial on how to flash the firmware, please follow <a href="https://github.com/knauth/goodix-521d-explanation">this guide</a>&apos;s step 1. Also you will need <a href="https://archive.archlinux.org/packages/f/fprintd/fprintd-1.92.0-1-x86_64.pkg.tar.zst">version 1.92 of fprintd</a> for this driver to work as the fork hasn&apos;t been updated to 1.94 yet.</p><h2 id="why-i-made-my-own-driver">Why I made my own driver</h2><p>A few days ago I received a new work computer. As I use <a href="https://manjaro.org">Manjaro Linux </a>as my daily driver OS, it was important to me to choose something that will run it without any bigger issues. After doing my research, I settled on a Asus ROG Zephyrus G14 (2021). Basically everything it has to offer works fine under Linux, even the fancy LED cover is fully controllable. There is one noteworthy exception though: The fingerprint reader does not work under Linux. The particular fingerprint reader my machine has is a Goodix 521d. But this isn&apos;t an issue with this particular one: A quick search will reveal a whole list of unsupported fingerprint readers. While there are different reasons as to why they are not supported, for my reader there were multiple. </p><p>First of all its resolution is too small to properly work with the detection code used in the Linux library, <a href="https://gitlab.freedesktop.org/libfprint/libfprint/">libfprint</a>, &#xA0;responsible for fingerprint reading. While this can be worked around, there is a different issue regaring TLS communication with the device. The existing SSL library used in libfprint will not work with my reader and a second, different one would have to be introducted to the library. Last but not least, there is just no support from the vendor whatsoever. There is little to no documentation available on how to communicate with these readers.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/10/image-1.png" class="kg-image" alt="Fixing my fingerprint reader on Linux by writing a driver for it" loading="lazy" width="1224" height="212" srcset="https://infinytum.co/content/images/size/w600/2021/10/image-1.png 600w, https://infinytum.co/content/images/size/w1000/2021/10/image-1.png 1000w, https://infinytum.co/content/images/2021/10/image-1.png 1224w" sizes="(min-width: 720px) 720px"><figcaption>The marked line shows the fingerprint reading device in my computer</figcaption></figure><h2 id="community-efforts">Community Efforts</h2><p>Since there is a substantial amount of users with unsupported readers of the same vendor, there has been a community effort to start working out on how to implement drivers for these devices. This is where I started my quest of getting a working driver for my reader.</p><p>After joining their discord server, I was presented with a long list of devices that are currently being tracked by the community. Tracked does not necessarily mean being worked on though, as there is too many readers and not enough programmers with respective devices around to do them all at the same time. However, for many readers there were working python scripts that are able to not only communicate with the device but also request an image from it. I was in luck, my reader had such a script as well. I had to tinker a bit with the script though to ultimately get a proper image off of my sensor. </p><p>Most development effort was focused on a different reader as they had made promising advancements towards a working driver. I survived whole 2 days of waiting before I decided that it was time to start development efforts myself. There was only two problems: First of all I have no clue about drivers or fingerprints and second I don&apos;t know how to program in C. But I figured its worth a shot anyway, there was not much to loose except a few hours of my life.</p><h2 id="how-i-did-it">How I did it</h2><p>As previously mentioned, a lot of development effort had been put into a different reader of the same vendor and there was a working python script available for my reader. The first thing I did was clone the fork of libfprint where the changes for the other reader had been made. I started comparing the libfprint implementation for that reader to what had been done in the python script for that reader to understand what I would need to change in order to make it work with my reader. So I created a copy of the existing reader&apos;s implementation and started to replace the static values of the old reader with the ones I found in the python script for my reader. Now, this was done fairly quickly and I went ahead and tested it. Absolutely nothing worked. Obviously, the devices are not identical and there was more to it than just copying over static values like configurations and shared keys.</p><p>I discovered that the protocol differs between the two readers in a few ways. For example, the bytes sent over to the device for PSK verification were not the same, despite them using the same protocol in python. So I had to expand the existing protocol implementation with the missing fields and voila, it failed again. There were not only fields missing, but their order was also incorrect. This meant that I had to shuffle the order of the fields to match the python script which finally allowed me to verify the PSK of the device. Yay!</p><p>The next big roadblock was getting the device to send me an image. While I definitely got a request to the device, and I definitely got something back from it, it came out as pure random data. I knew that the image data was supposed to be encrypted but every time I tried to decrypt the chunk of data I received, the TLS library would tell me that the data was not in fact valid TLS data. Again, a small difference between the other reader and mine was, that I would have to discard the first 9 bytes of my data chunk to get the valid TLS encrypted data to feed into the decryptor. And it took me far too long to realise that. </p><p>The third and last bigger roadblock was that I was not getting a clear image from the sensor. In fact, even after decryption it still looked like utter garbage. I checked everything: The image decoder which is needed to turn the image sent by the reader into an actual viewable picture, the decryption, every receiver the data went through. After many more hours I figured out that one of my configuration calls to the device were not working properly. There was something wrong in the protocol implementation that prevented my request from being encoded into bytes successfully and the reader never got the configuration I wanted it to have in the first place. Once I resolved this, I was able to get pictures from my reader in libfprint which meant I was technically able to enroll and verify fingers.</p><p>But there is more. Since the fingerprint reader is so small, libfprint&apos;s way of verifying fingerprints just cannot find enough details to compare against and simply fails the verification everytime, even if the finger wasn&apos;t moved since the enrollment. To counter this, instead of taking one shot of the finger, I made the program take 10 shots and stitch them together. Thats also how the swipe-style fingerprint readers work! After providing libfprint with a far bigger picture and therefore far mor details, I was finally able to enroll and verify fingerprints. Now, this method might not be the safest and there will definitely be work done for a better one. So I wouldn&apos;t recommend relying this for top secrecy, although when enrolled properly I only managed to get a false positive once with one of my other fingers.</p><figure class="kg-card kg-image-card"><img src="https://infinytum.co/content/images/2021/10/image.png" class="kg-image" alt="Fixing my fingerprint reader on Linux by writing a driver for it" loading="lazy" width="978" height="685" srcset="https://infinytum.co/content/images/size/w600/2021/10/image.png 600w, https://infinytum.co/content/images/2021/10/image.png 978w" sizes="(min-width: 720px) 720px"></figure><h2 id="conclusion">Conclusion</h2><p>I never took on this project because I had particular knowledge in fingerprint scanning, drivers or even C itself. This was sort of a fun coding challenge to myself, trying out something new I had never done before and no clue about. I definitely enjoyed the 2 days journey of writing this driver and experimenting with it. It was painful sometimes and many stupid mistakes, but getting to the stage where you can unlock your machine with a driver you (mostly) wrote is very rewarding. If you got a Goodix reader that isn&apos;t working, <a href="https://discord.gg/6xZ6k34Vqg">join the discord</a> and check out what work has been done for your device. And if you got some spare time on your hand, you might just try to fix it yourself.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/10/image-2.png" class="kg-image" alt="Fixing my fingerprint reader on Linux by writing a driver for it" loading="lazy" width="423" height="70"><figcaption>Working verification of my finger with the new driver</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Quake: Custom weapon models and new movements]]></title><description><![CDATA[It is time for another Quake update. We've added custom weapon models and a new game mechanic!]]></description><link>https://infinytum.co/custom-weapon-models/</link><guid isPermaLink="false">61043d758dc357007fdde38a</guid><category><![CDATA[Minecraft]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Fri, 30 Jul 2021 21:39:25 GMT</pubDate><media:content url="https://infinytum.co/content/images/2021/07/Article-Cover-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2021/07/Article-Cover-2.png" alt="Quake: Custom weapon models and new movements"><p>First of all, don&apos;t worry, you won&apos;t need a mod to play Quake. The custom models are contained in the resource pack you are loading from the server as you join. If you decline the resource pack, you can still play but most guns will be shown as a charged crossbow.</p><h2 id="custom-weapon-models">Custom weapon models</h2><p>Quake always relied on existing items that looked somewhat like the object we wanted to make. This is where <a href="https://www.blockbench.net/">Blockbench</a> came in. Using <a href="https://www.blockbench.net/">Blockbench</a>, we designed and created custom item models for each of the currently available weapons.</p><h3 id="the-railgun">The Railgun</h3><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/quake_railgun.png" class="kg-image" alt="Quake: Custom weapon models and new movements" loading="lazy" width="721" height="298" srcset="https://infinytum.co/content/images/size/w600/2021/07/quake_railgun.png 600w, https://infinytum.co/content/images/2021/07/quake_railgun.png 721w" sizes="(min-width: 720px) 720px"><figcaption>The new (and hopefully) improved Railgun</figcaption></figure><p>The original weapon of the game, the wooden hoe, has been replaced with this custom railgun design. This type of gun will be in the center of your screen, as if you were aiming trough the non-existing scope on the weapon. We might add one later. </p><h3 id="the-knife">The Knife</h3><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/quake_knife.png" class="kg-image" alt="Quake: Custom weapon models and new movements" loading="lazy" width="337" height="121"><figcaption>The knife, with the sharpest blade we could possibly make</figcaption></figure><p>Leaned on the design of the Railgun, the knife got a short, blue blade. The knife is short on purpose since its a short-range weapon. You go up to someone to use it. When you use this item, you will hold it like a sword (it is a sword) but a bit more serial-killer like.</p><h4 id="the-rocket-launcher">The Rocket Launcher</h4><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/quake_rocketlauncher.png" class="kg-image" alt="Quake: Custom weapon models and new movements" loading="lazy" width="481" height="397"><figcaption>A heavy weapon. Designed to rest on your characters shoulder.</figcaption></figure><p>The Rocket Launcher got a simple container for the rocket, with the actual rocket peaking out of the front. Since your character is carrying it on it&apos;s shoulder, you will see it on the side of your screen. Sorry to disappoint: No the rocket does not actually launch. All the gun particles have remained the same. We might change that in a future update.</p><h2 id="the-new-game-mechanic">The new game mechanic</h2><p>You see, firing a rocket generates a lot of thrust. That thrust usually pushes you back in order to push the rocket forwards. Yes, we have added rocket recoil to the game and yes you can use it to rocket jump! Reach new heights and surprise your enemies with unexpected moves or approach vectors. It also makes for great trickshots!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/Screenshot-from-Kooha-2021-07-30-23-13-09.222webm.png" class="kg-image" alt="Quake: Custom weapon models and new movements" loading="lazy" width="2000" height="666" srcset="https://infinytum.co/content/images/size/w600/2021/07/Screenshot-from-Kooha-2021-07-30-23-13-09.222webm.png 600w, https://infinytum.co/content/images/size/w1000/2021/07/Screenshot-from-Kooha-2021-07-30-23-13-09.222webm.png 1000w, https://infinytum.co/content/images/size/w1600/2021/07/Screenshot-from-Kooha-2021-07-30-23-13-09.222webm.png 1600w, https://infinytum.co/content/images/size/w2400/2021/07/Screenshot-from-Kooha-2021-07-30-23-13-09.222webm.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Jump higher than ever before</figcaption></figure><h2 id="conclusion">Conclusion</h2><p>The new models and the rocket recoil make a great addition to the game. It opens up a lot of new ways to play the game and it&apos;s just a lot of fun to play with the rocket launcher jumps. I highly recommend using the resource pack provided by the server to enjoy the new models as well.</p>]]></content:encoded></item><item><title><![CDATA[Longhorn metadata restoration]]></title><description><![CDATA[Have you lost your Longhorn metadata for one or more volumes? No worries, you can probably manually restore it.]]></description><link>https://infinytum.co/longhorn-metadata-restoration/</link><guid isPermaLink="false">610050ce30e9380062abeced</guid><category><![CDATA[System]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Tue, 27 Jul 2021 18:30:00 GMT</pubDate><media:content url="https://infinytum.co/content/images/2021/07/longhorn-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2021/07/longhorn-1.png" alt="Longhorn metadata restoration"><p>If you found this article, you probably lost your Longhorn metadata in one or the other way. This sounds scarier than it really is, because Longhorns metadata is actually really easy to re-create manually.</p><p><strong>Warning: </strong>While this has worked for all my volumes in the past and I have not encountered any lasting effects or data-loss, I do not guarantee your success with this method. Please make appropriate backups of the files you are editing before trying this. This is a last-resort when you have no working replicas available and cannot attach the volume at all.</p><h2 id="diagnosing-failed-metadata">Diagnosing failed metadata</h2><p>The most common symptom of failed metadata is a attach-detach loop of the volume. You can see this in the Longhorn UI by filtering for the status &quot;In Progress&quot;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/Screenshot-from-2021-07-27-20-50-44.png" class="kg-image" alt="Longhorn metadata restoration" loading="lazy" width="727" height="78" srcset="https://infinytum.co/content/images/size/w600/2021/07/Screenshot-from-2021-07-27-20-50-44.png 600w, https://infinytum.co/content/images/2021/07/Screenshot-from-2021-07-27-20-50-44.png 727w" sizes="(min-width: 720px) 720px"><figcaption>Recommended filter to find volumes that repeatedly attach and detach</figcaption></figure><h2 id="restoring-volume-metadata">Restoring volume metadata</h2><p>Once you have found a problematic volume, click on the volume to open its more detailed page. Hover over the storage path of the replica and note yourself the full storage path shown in the tool-tip as well as the volume size. See the selected text in the picture for guidance on where to hover the mouse cursor. The replica below is not affected by metadata corruption and is only used for visual reference.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/Screenshot-from-2021-07-27-21-04-02.png" class="kg-image" alt="Longhorn metadata restoration" loading="lazy" width="349" height="312"><figcaption>Hover over the storage path to reveal the full path</figcaption></figure><p>For the next step you will need a remote console session to the server on which the replica is stored on. Navigate to the full storage path you noted down in the previous step. If you have one or more of the following files you are in the right place:</p><ul><li>volume-head-###.img</li><li>volume-head-###.img.meta</li><li>volume-snap-*.img</li><li>volume-snap-*.img.meta</li><li>volume.meta</li></ul><p>Check the filesize of the .meta files. If one of them is 0, this is the one you need to repair. Below are guides for each kind of metadata file, as they are different!</p><h3 id="repairing-volumemeta">Repairing volume.meta</h3><p>You lost the main metadata file for this volume, luckily this is fixable. First, you will need an example of a valid metadata file. I will provide you with one of mine:</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Size&quot;:8589934592,&quot;Head&quot;:&quot;volume-head-001.img&quot;,&quot;Dirty&quot;:true,&quot;Rebuilding&quot;:false,&quot;Error&quot;:&quot;&quot;,&quot;Parent&quot;:&quot;volume-snap-51131b80-b84f-4a33-abaf-7f8ea1a4468e.img&quot;,&quot;SectorSize&quot;:512,&quot;BackingFilePath&quot;:&quot;&quot;}
</code></pre>
<!--kg-card-end: markdown--><p>First you will need to calculate the correct size of your volume. This can be done by multiplying <strong>SizeInGiB x 1073741824.</strong> My volume above is 8GiB. Replace the size in the metadata with the calculated size.</p><p>Next, find your <strong>volume-head-###.img </strong>and set it as the value for the<strong> Head </strong>field. For <strong>Parent</strong>, order your<strong> </strong>volume-snap-*.img by their timestamp and choose the latest one. Once you are done the file should look somewhat like this (those below are still fake-values!):</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Size&quot;:YourVolumeSize,&quot;Head&quot;:&quot;volume-head-###.img&quot;,&quot;Dirty&quot;:true,&quot;Rebuilding&quot;:false,&quot;Error&quot;:&quot;&quot;,&quot;Parent&quot;:&quot;volume-snap-*.img&quot;,&quot;SectorSize&quot;:512,&quot;BackingFilePath&quot;:&quot;&quot;}
</code></pre>
<!--kg-card-end: markdown--><p>Once you saved the file, Longhorn should be able to attach the volume and begin to create new replicas for it.</p><h3 id="repairing-volume-head-imgmeta">Repairing volume-head-###.img.meta</h3><p>This one is very similar to the volume.meta file, minus some of the status fields. Here is what a valid file would look like:</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Name&quot;:&quot;volume-head-001.img&quot;,&quot;Parent&quot;:&quot;volume-snap-51131b80-b84f-4a33-abaf-7f8ea1a4468e.img&quot;,&quot;Removed&quot;:false,&quot;UserCreated&quot;:false,&quot;Created&quot;:&quot;2021-07-25T23:44:51Z&quot;,&quot;Labels&quot;:null}
</code></pre>
<!--kg-card-end: markdown--><p>Find your <strong>volume-head-###.img </strong>and set it as the value for the<strong> Name </strong>field. For <strong>Parent</strong>, order your<strong> </strong>volume-snap-*.img by their timestamp and choose the latest one. Once you are done the file should look somewhat like this (those below are still fake-values!):</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Name&quot;:&quot;volume-head-###.img&quot;,&quot;Parent&quot;:&quot;volume-snap-*.img&quot;,&quot;Removed&quot;:false,&quot;UserCreated&quot;:false,&quot;Created&quot;:&quot;2021-07-25T23:44:51Z&quot;,&quot;Labels&quot;:null}
</code></pre>
<!--kg-card-end: markdown--><p>Once you saved the file, Longhorn should be able to attach the volume and begin to create new replicas for it.</p><h3 id="repairing-volume-snapimgmeta">Repairing volume-snap*.img.meta</h3><p>This one is almost equal to the volume-head-###.img.meta file. Here is what a valid file would look like:</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Name&quot;:&quot;volume-snap-51131b80-b84f-4a33-abaf-7f8ea1a4468e.img&quot;,&quot;Parent&quot;:&quot;&quot;,&quot;Removed&quot;:true,&quot;UserCreated&quot;:false,&quot;Created&quot;:&quot;2021-07-25T23:44:51Z&quot;,&quot;Labels&quot;:null}
</code></pre>
<!--kg-card-end: markdown--><p>Remove the <strong>.meta</strong> from the filename and set it as the value for the<strong> Name </strong>field. For <strong>Parent</strong>, order your<strong> </strong>volume-snap-*.img by their timestamp and choose the one older than the snap you are currently fixing. If there is no older one, leave it empty. Once you are done the file should look somewhat like this (those below are still fake-values!):</p><!--kg-card-begin: markdown--><pre><code class="language-json">{&quot;Name&quot;:&quot;volume-snap-*.img&quot;,&quot;Parent&quot;:&quot;volume-snap-*.img OR empty&quot;,&quot;Removed&quot;:true,&quot;UserCreated&quot;:false,&quot;Created&quot;:&quot;2021-07-25T23:44:51Z&quot;,&quot;Labels&quot;:null}
</code></pre>
<!--kg-card-end: markdown--><p>Once you saved the file, Longhorn should be able to attach the volume and begin to create new replicas for it.</p><h3 id="i-hope-you-were-able-to-restore-your-metadata-with-this-guide">I hope you were able to restore your metadata with this guide.</h3>]]></content:encoded></item><item><title><![CDATA[Quake now in public testing]]></title><description><![CDATA[Fancy playing a round of our mini-game Quake? Now you can! Check out the article to find out how.]]></description><link>https://infinytum.co/quake-now-in-public-testing/</link><guid isPermaLink="false">60fdc1b70f4bc10061cfa4d1</guid><category><![CDATA[Minecraft]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Sun, 25 Jul 2021 20:01:51 GMT</pubDate><media:content url="https://infinytum.co/content/images/2021/07/quake.png" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2021/07/quake.png" alt="Quake now in public testing"><p>We are proud to announce the public testing phase of the Quake mini-game. Our Team has worked very tirelessly to optimize performance, add more weapons and to create a whole new map. </p><h2 id="new-map">New Map</h2><p>If you have played CS:GO you will probably recognize this one! Recreated in Minecraft, by 0SkillAllLuck, we are happy to bring you <strong>Dust 2</strong> as a playable Quake map. Unlike CS:GO, you can visit the roof of the buildings thanks to the Jump Boost! But fear not, camping doesn&apos;t get you very far in this game (anymore).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/dust-cover.png" class="kg-image" alt="Quake now in public testing" loading="lazy" width="2000" height="716" srcset="https://infinytum.co/content/images/size/w600/2021/07/dust-cover.png 600w, https://infinytum.co/content/images/size/w1000/2021/07/dust-cover.png 1000w, https://infinytum.co/content/images/size/w1600/2021/07/dust-cover.png 1600w, https://infinytum.co/content/images/size/w2400/2021/07/dust-cover.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Impression of the Dust 2 Map - Created by 0SkillAllLuck</figcaption></figure><h2 id="new-weapons">New Weapons</h2><p>While we kept the traditional Railgun, we have added two additional weapons to your inventory.</p><p><strong>The Rocket Launcher</strong><br>This is the first weapon to not only deal direct-impact damage but also explosion damage to anyone close during impact. That&apos;s right: You can now die slowly. This weapon has a cooldown of 2 seconds and deals explosion damage to players in a 5 block range. If you are hit directly by the rocket, you <strong>will</strong> die immediately. Rockets fly slower than the railgun projectile and they can only directly kill one person. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/Firework_Rocket_JE2_BE2-1.webp" class="kg-image" alt="Quake now in public testing" loading="lazy" width="160" height="160"><figcaption>KA-BOOM. Blow up your enemies with a rocket launcher!</figcaption></figure><p><strong>The Knife</strong><br>This weapon does not fire a projectile (Sorry). Instead you can slice up that annoying camper that just never moves (Works best if you strike behind their back). You do need two hits to kill a player, else you could do a hit-and-run on nearby players. Apart from that, this item is supposed to be a bit harder to use.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/The_Sword--1.webp" class="kg-image" alt="Quake now in public testing" loading="lazy" width="360" height="450"><figcaption>Player go stabby-stab. Show the campers who is boss with the knife!</figcaption></figure><h2 id="optimizations">Optimizations</h2><p>This section is a bit more technical. If you don&apos;t care about that, skip to the next section :)</p><p>The entire GameAPI and Game have been rewritten to eliminate duplicate code and reduce the amount of event handling. We have also removed all the NMS (Net-Minecraft-Server) code and instead rely on the integrated, version-independent API&apos;s.</p><p>Another big change is that all weapons are now handled asynchronously from the main thread. This 100% prevents the possibility of a weapon lagging out the server. Weapons cannot affect each other either. This was necessary to create the rocket launcher with it&apos;s slower projectile speed.</p><h2 id="how-to-test-the-game">How to test the game</h2><p>The game mode is publicly available on <strong>mc.infinytum.co. </strong>You will need at least one other player to play the game. You can share this address with whoever you like. You will also need Minecraft Java Edition 1.17.1 to play. The public testing server might restart from time to time to install the latest updates as we continue development on the game.</p><p><strong>Fair warning though</strong>: The game might or might not have anything to do with the original Quake. </p><p>If you find any bugs or have other questions about the game, you can message <a href="mailto:team@infinytum.co">team@infinytum.co</a></p>]]></content:encoded></item><item><title><![CDATA[Quake: Competitive Lagging]]></title><description><![CDATA[How to combat lag accusation and bad excuses for loosing the game. Sometimes it just ain't the ping.]]></description><link>https://infinytum.co/quake-competitive-lagging/</link><guid isPermaLink="false">60fe11ca0f4bc10061cfa61b</guid><category><![CDATA[Minecraft]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Thu, 22 Jul 2021 13:00:00 GMT</pubDate><media:content url="https://infinytum.co/content/images/2021/07/competitive-lagginf.png" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2021/07/competitive-lagginf.png" alt="Quake: Competitive Lagging"><p>If you have played any kind of competitive online game, you have surely encountered at least one of these things: The server appears to be lagging, or is it just your connection, or maybe the enemies connection?</p><p>While we won&apos;t talk about the delicate voice chat debate that follows, it&apos;s needless to say that this is an issue that needs to be addressed in a multiplayer shooter. Even if it&apos;s a Minecraft shooter. Of course, we can&apos;t magically fix someone&apos;s internet connection or stop a server from lagging once in a lifetime. But what we can do is being transparent about all those things.</p><h2 id="tps-what-is-it-and-why-does-it-matter">TPS: What is it and why does it matter</h2><p>In the world of Minecraft, a servers performance can be measured in so-called <strong>T</strong>icks <strong>P</strong>er <strong>S</strong>econd (TPS). Idealy, there are 20 ticks in one second. That means, that the server has completed all checks and tasks 20 times per second. Those tasks vary from mob/player movement to custom plugin code (like Quake). </p><p>Now what happens if the server cannot complete 20 ticks in a second? Well, you as a player will perceive this as lag. You might teleport back to a location you just walked away from because the server simply didn&apos;t have time to process your previous movement and thinks that you are moving to fast (hacking). You will also notice choppy movement of other players and your weapons might not work as expected. This kind of lag affects all players and its entirely a server problem.</p><p>We are doing our best to keep our code outside of those ticks, to add as little load as possible to the server. But we also have to worry about what happens if the server <strong>does</strong> lag. This is why we added a feature to all games built with our GameAPI.</p><h3 id="server-tps">Server TPS</h3><p>The Server&apos;s TPS will always be visible at the bottom of the TabList (Minecraft Java Edition). To make it a little more useful, we also added the current game state. The TPS will change color based on our rating of the TPS. </p><p>Green: OK, TPS is acceptable for playing.<br>Yellow: Light to moderate lag may occurr.<br>Red: Unplayable, too much lag to play the game. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/tps.png" class="kg-image" alt="Quake: Competitive Lagging" loading="lazy" width="493" height="176"><figcaption>Server TPS being shown in the TabList</figcaption></figure><p>You can also show the current server TPS by typing &apos;/ticks&apos; in the chat. It is usually a bit more precise than necessary and is rarely the full 20 TPS.</p><h2 id="bad-ping-it-doesnt-only-affect-you">Bad Ping: It doesn&apos;t only affect you</h2><p>The most obvious issue of a bad connection is usually your playing experience. Everything seems to be slow, your shots are not going as fast as you&apos;d like them to go and you seemingly hit someone but they didn&apos;t die. But you are also lagging for everyone else on the server. Your movement might be choppy, making it harder (or easier) for people to aim at you. </p><p>We are trying to have a good connection to everyone by putting our servers into a well-connected datacenter. This may help, but it will not fix the problem of simply bad internet connections at home. Once again, being transparent can help to at least calm fellow players on the server and to prevent claims of server lag.</p><h3 id="ping-transparency">Ping Transparency</h3><p>Every player has their ping next to their name in the TabBar. This feature also works with Bedrock clients! This way, everyone knows who they are playing with and what kind of issues they can expect with the other players.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://infinytum.co/content/images/2021/07/ping.png" class="kg-image" alt="Quake: Competitive Lagging" loading="lazy" width="985" height="266" srcset="https://infinytum.co/content/images/size/w600/2021/07/ping.png 600w, https://infinytum.co/content/images/2021/07/ping.png 985w" sizes="(min-width: 720px) 720px"><figcaption>Ping to the server being shown in chat. /ping</figcaption></figure><p>Your own ping can also be shown in chat by typing &apos;/ping&apos; in the chat. It should print the exact same number as in the TabList but this time the number is colored depending on it&apos;s rating.</p><p>Green: Great, you should not have any issues playing<br>Yellow: OK, most likely you won&apos;t notice any issues but there might be slight delay.<br>Red: Noticeable lag, you can still play<br>Dark Red: Really Lagging, we&apos;d not recommend playing like this.</p>]]></content:encoded></item><item><title><![CDATA[Planned Maintenance 23-25. July 2021]]></title><description><![CDATA[The maintenance takes place starting 00:00 CEST and can last until 04:00 CEST. Temporary downtime should be expected.]]></description><link>https://infinytum.co/planned-maintenance-23-25-july-2021/</link><guid isPermaLink="false">60fe020e0f4bc10061cfa5d2</guid><category><![CDATA[System]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Mon, 19 Jul 2021 11:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fHNlcnZlcnxlbnwwfHx8fDE2MjcyNjAwOTg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDR8fHNlcnZlcnxlbnwwfHx8fDE2MjcyNjAwOTg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Planned Maintenance 23-25. July 2021"><p>Infinytum will be carrying out maintenance on all systems (Networking, Storage, Compute) over the span of 3 days. To prevent noticeable downtime for users, the event takes place during the night (CEST!).</p><p>We will be migrating controller servers to new disks to increase their reliability and speed to take on more requests. The network plane has to be restarted completely in order to propagate a cluster-domain change. Because the network plane has to shutdown completely, workload servers have to shutdown all their scheduled workloads to prevent issues with network attached disks. During this restart services will become unresponsive and unreachable until the network plane and workload server have restarted. All workloads will automatically restore their functionality and services will be reachable again.</p><p>All Infinytum services including but not limited to:</p><ul><li>Docker Registry</li><li>GitLab</li><li>Drone CI</li><li>Minecraft Ingress</li><li>Web Ingress</li></ul><p>will be unreachable as well during the downtime.</p>]]></content:encoded></item><item><title><![CDATA[TeSlate Update - 1.4.4]]></title><description><![CDATA[We have released another minor update for TeSlate adding one of the most requested features to the app!]]></description><link>https://infinytum.co/teslate-update-1-4-4/</link><guid isPermaLink="false">60fd95387855b3006114319c</guid><category><![CDATA[TeSlate]]></category><category><![CDATA[Update]]></category><dc:creator><![CDATA[Infinytum]]></dc:creator><pubDate>Sun, 30 May 2021 17:00:00 GMT</pubDate><media:content url="https://infinytum.co/content/images/2021/07/1200x630wa.png" medium="image"/><content:encoded><![CDATA[<img src="https://infinytum.co/content/images/2021/07/1200x630wa.png" alt="TeSlate Update - 1.4.4"><p>Once again it&apos;s time for another TeSlate update. Over the past months we have received lots of feedback to our app and one particular feature has been requested by many of you.</p><h3 id="a-customizable-widget-background">A Customizable Widget Background</h3><p>There are many reasons to change your background to something different than your vehicle color: Some users prefer their UI in a darker color, some simply don&apos;t enjoy having the same color in front and back and some want to replicate the TeSlate logo color scheme ;)</p><p>Of course once you changed the color manually, you can always switch back to the automatic coloring of the widget. The color selection will be applied to all widgets, no matter their size.</p><p>If you haven&apos;t received the update already, either wait for the iPhone to do it automatically or manually update TeSlate in the AppStore.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://apps.apple.com/app/teslate/id1532406445?l=en"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#x200E;TeSlate</div><div class="kg-bookmark-description">&#x200E;TeSlate is a beautiful widget crafted for iOS 14. TeSlate communicates with your Tesla vehicle and shows you useful information on your home screen. Choose which car is displayed in the app.</div><div class="kg-bookmark-metadata"><span class="kg-bookmark-author">App Store</span><span class="kg-bookmark-publisher">Michael Teuscher</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://is5-ssl.mzstatic.com/image/thumb/Purple115/v4/ec/e6/34/ece6346c-080a-9137-c72f-db26af3065f0/AppIcon-0-1x_U007emarketing-0-10-0-85-220.png/1200x630wa.png" alt="TeSlate Update - 1.4.4"></div></a></figure>]]></content:encoded></item></channel></rss>