Bridgetown2024-03-07T08:38:15+01:00https://www.stefanwienert.de/feed.xmlStefan’s BlogI am a web developer from Germany, mostly working with Ruby on Rails, but also like to do Frontend Javascript with Vue, Svelte, Server-Deployment with Docker, Ansible, Terraform on Hetzner Cloud or build small mobile Apps with Flutter.Stefan WienertRails/ActiveStorage: Client-Side encryption with Amazon S3 & dynamic service switching2024-01-31T08:12:45+01:002024-01-31T08:12:45+01:00repo://posts.collection/_posts/2024/2024-01-31-rails-activestorage-client-side-encryption-with-amazon-s3.md<p>Recently, we implemented client-side encryption for ActiveStorage - Which was a
customer’s requirement in light of FISA and Schrems II GDPR rulings. In
summary, relying only on Amazon’s KMS is not enough, so we implemented
Client-Side encryption. Unfortunately, there are not a lot of guides out, that
explain, how to best do this with ActiveStorage. So here is our take on it.</p>
<p>First, the resources I started with:</p>
<ul>
<li><a href="https://ankane.org/activestorage-s3-encryption">Andrew Kane’s blog post - Active Storage S3 Client-Side Encryption</a></li>
<li><a href="https://alisepehri.medium.com/preview-for-amazon-s3-client-side-encrypted-active-storage-files-8e3ba55accb8">Preview for Amazon S3 Client-Side Encrypted Active Storage files</a></li>
<li><a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Encryption.html">AWS Ruby SDK</a> which explains also ho</li>
<li><a href="https://docs.aws.amazon.com/amazon-s3-encryption-client/latest/developerguide/concepts.html#wrapping-key">AWS guide on Client-Side Encryption</a> which explains also how the Envelope Encryption works.</li>
</ul>
<p>The code from Ankane is a good starting point, but missed a few things, like:</p>
<ul>
<li>Previews</li>
<li>Direct Uploads</li>
<li>Support linking via proxy</li>
<li>Implement 100% of the Service API to be compatible with ActiveStorage - e.g. was missing downloads and chunked downloads</li>
<li>Variants</li>
<li>Implements the new <code class="highlighter-rouge">AWS::S3::EncryptionV2</code> interface</li>
</ul>
<p>Which we implemented (except previews - not tested). For our own convenience, we created a Gem that wraps the modified service:</p>
<p><a href="https://github.com/pludoni/active_storage_client_side_encrypted" class="button">pludoni/active_storage_client_side_encrypted</a></p>
<p>You can add the Gem, or just download the main service file: <a href="https://github.com/pludoni/active_storage_client_side_encrypted/blob/main/lib/active_storage/service/encrypted_s3_service.rb">encrypted_s3_service.rb</a>
You will need Rails 7 because there are a lot of changes in ActiveStorage, that are not backwards-compatible. Also, it added tracked variants, which makes encrypting them too feasible.</p>
<p>AWS-SDK supports many different key formats. For starters, we only use a static 32-byte-length (256bit) key. That is the format, our adapter supports for now. Future implementations could also implement Public/Private key encryption.</p>
<p>Add the service:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">encrypted_amazon</span><span class="pi">:</span>
<span class="na">service</span><span class="pi">:</span> <span class="s">EncryptedS3</span> <span class="c1"># <---- Important</span>
<span class="na">access_key_id</span><span class="pi">:</span> <span class="s"><%= Rails.application.credentials.dig(:aws, :access_key_id) %></span>
<span class="na">secret_access_key</span><span class="pi">:</span> <span class="s"><%= Rails.application.credentials.dig(:aws, :secret_access_key) %></span>
<span class="na">region</span><span class="pi">:</span> <span class="s"><%= Rails.application.credentials.dig(:aws, :region) %></span>
<span class="na">bucket</span><span class="pi">:</span> <span class="s"><%= Rails.application.credentials.dig(:aws, :bucket) %></span>
<span class="c1"># Static Encryption Key: 32 bytes - must be 32 bytes = 256bit length.</span>
<span class="c1"># mark as base64 to encode all ascii characters</span>
<span class="c1"># generate with: Base64.strict_encode64(OpenSSL::Cipher.new("AES-256-ECB").random_key)</span>
<span class="na">encryption_key</span><span class="pi">:</span> <span class="s2">"</span><span class="s">base64:randomGiberish"</span>
</code></pre></div></div>
<p>Then, either use it as a <strong>default service</strong> and you are down. Or use it for a specific attachment:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MyModel</span> <span class="o"><</span> <span class="no">ApplicationRecord</span>
<span class="n">has_one_attached</span> <span class="ss">:contract_pdf</span><span class="p">,</span> <span class="ss">service: :encrypted_amazon</span>
<span class="k">end</span>
</code></pre></div></div>
<h3 id="change-the-service-dynamically-based-on-the-tenant">Change the service dynamically based on the tenant</h3>
<p>In our case, we enabled that feature on a customer/tenant basis, so we are switching out the service dynamically:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># Tenant, User whatever</span>
<span class="k">class</span> <span class="nc">Organisation</span> <span class="o"><</span> <span class="no">ApplicationRecord</span>
<span class="k">def</span> <span class="nf">with_s3_settings</span><span class="p">(</span><span class="o">&</span><span class="n">block</span><span class="p">)</span>
<span class="n">tenant_before</span> <span class="o">=</span> <span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span>
<span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span> <span class="o">=</span> <span class="nb">self</span>
<span class="n">before</span> <span class="o">=</span> <span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">config</span><span class="p">.</span><span class="nf">active_storage</span><span class="p">.</span><span class="nf">service</span>
<span class="k">if</span> <span class="nb">self</span><span class="p">.</span><span class="nf">encryption_enabled?</span>
<span class="k">if</span> <span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">config</span><span class="p">.</span><span class="nf">active_storage</span><span class="p">.</span><span class="nf">service_configurations</span><span class="p">[</span><span class="s1">'encrypted_amazon'</span><span class="p">]</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">config</span><span class="p">.</span><span class="nf">active_storage</span><span class="p">.</span><span class="nf">service</span> <span class="o">=</span> <span class="ss">:encrypted_amazon</span>
<span class="no">ActiveStorage</span><span class="o">::</span><span class="no">Blob</span><span class="p">.</span><span class="nf">service</span> <span class="o">=</span> <span class="no">ActiveStorage</span><span class="o">::</span><span class="no">Blob</span><span class="p">.</span><span class="nf">services</span><span class="p">.</span><span class="nf">fetch</span><span class="p">(</span><span class="ss">:encrypted_amazon</span><span class="p">)</span>
<span class="k">else</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">logger</span><span class="p">.</span><span class="nf">warn</span> <span class="s2">"ActiveStorage service </span><span class="si">#{</span><span class="n">setting</span><span class="si">}</span><span class="s2"> not configured"</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">yield</span>
<span class="k">ensure</span>
<span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span> <span class="o">=</span> <span class="n">tenant_before</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">config</span><span class="p">.</span><span class="nf">active_storage</span><span class="p">.</span><span class="nf">service</span> <span class="o">=</span> <span class="n">before</span>
<span class="no">ActiveStorage</span><span class="o">::</span><span class="no">Blob</span><span class="p">.</span><span class="nf">service</span> <span class="o">=</span> <span class="no">ActiveStorage</span><span class="o">::</span><span class="no">Blob</span><span class="p">.</span><span class="nf">services</span><span class="p">.</span><span class="nf">fetch</span><span class="p">(</span><span class="n">before</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<p>Then, you can switch the service in a <code class="highlighter-rouge">before_action</code> or similar.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o"><</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span>
<span class="n">around_action</span> <span class="ss">:set_active_storage_service</span>
<span class="c1"># sign in</span>
<span class="k">def</span> <span class="nf">set_active_storage_service</span>
<span class="k">if</span> <span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span>
<span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span><span class="p">.</span><span class="nf">with_s3_settings</span> <span class="k">do</span>
<span class="k">yield</span>
<span class="k">end</span>
<span class="k">else</span>
<span class="k">yield</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<p>If you also want to enable <strong>Direct Uploads</strong> with client-side encryption dynamically, you need to “patch” the ActiveStorage controller:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># config/initalizers/active_storage_direct_upload_patch.rb</span>
<span class="k">module</span> <span class="nn">ASDirectUploadPatch</span>
<span class="k">def</span> <span class="nf">blob_args</span>
<span class="n">service_name</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="ss">:service_name</span><span class="p">].</span><span class="nf">presence</span>
<span class="k">super</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="ss">service_name: </span><span class="n">service_name</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">reloader</span><span class="p">.</span><span class="nf">to_prepare</span> <span class="k">do</span>
<span class="no">ActiveStorage</span><span class="o">::</span><span class="no">DirectUploadsController</span><span class="p">.</span><span class="nf">prepend</span> <span class="no">ASDirectUploadPatch</span>
<span class="k">rescue</span> <span class="no">Aws</span><span class="o">::</span><span class="no">Errors</span><span class="o">::</span><span class="no">MissingRegionError</span>
<span class="k">end</span>
<span class="c1"># In the views/forms call the direct-upload-path like this:</span>
<span class="o"><</span><span class="sx">%= f.file_field :file, multiple: true, "data-direct-upload-url" =</span><span class="o">></span> <span class="n">rails_direct_uploads_url</span><span class="p">(</span><span class="ss">service_name: </span><span class="s1">'encrypted_amazon'</span><span class="p">)</span> <span class="o">%></span>
</code></pre></div></div>
<p>Rails didn’t implement it, because it is not safe, and the URL can be manipulated and different services chosen. But in our case, we have further tenant checks in place. Otherwise, you might want to pass a signed parameter instead of the plain service name instead.</p>
<h3 id="active-job">Active Job</h3>
<p>If you are using ActiveJobs that are creating or modifying blobs, it might be necessary to wrap them with the current tenant and switch out the service during each process:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ApplicationJob</span> <span class="o"><</span> <span class="no">ActiveJob</span><span class="o">::</span><span class="no">Base</span>
<span class="n">queue_as</span> <span class="ss">:default</span>
<span class="c1"># Serialize the whole Current object, so it can be passed to the job</span>
<span class="k">def</span> <span class="nf">serialize</span>
<span class="k">super</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="ss">current: </span><span class="no">Current</span><span class="p">.</span><span class="nf">serialize</span><span class="p">)</span>
<span class="k">end</span>
<span class="c1"># Load the Current metadata</span>
<span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">job_data</span><span class="p">)</span>
<span class="k">if</span> <span class="n">job_data</span><span class="p">[</span><span class="s1">'current'</span><span class="p">]</span>
<span class="no">Current</span><span class="p">.</span><span class="nf">deserialize</span><span class="p">(</span><span class="n">job_data</span><span class="p">[</span><span class="s1">'current'</span><span class="p">])</span>
<span class="k">end</span>
<span class="k">super</span><span class="p">(</span><span class="n">job_data</span><span class="p">)</span>
<span class="k">end</span>
<span class="n">around_perform</span> <span class="ss">:set_active_storage_service</span>
<span class="c1"># Call our method from above and switch out the service</span>
<span class="k">def</span> <span class="nf">set_active_storage_service</span>
<span class="k">if</span> <span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span>
<span class="no">Current</span><span class="p">.</span><span class="nf">organisation_tenant</span><span class="p">.</span><span class="nf">with_s3_settings</span> <span class="k">do</span>
<span class="k">yield</span>
<span class="k">end</span>
<span class="k">else</span>
<span class="k">yield</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<h3 id="impact-on-server-load">Impact on server load</h3>
<p>The encryption is done by the “client”, which in this case is your server,
that’s the one, holding the keys, so it also must do the work! Your web-app
server (Puma etc.) must also handle ALL file uploads and downloads, so make
sure you have enough extra capacity. That’s why in our case, we only
selectively enable it for customers that need it, and also only for sensitive
data. For example, we do not encrypt company logos, banners, custom CSS etc.</p>
<hr />
<p>Feel free to try out the Gem. Let me know if you have any questions or suggestions via Mastodon <a href="https://ruby.social/@zealot128">ruby.social/@zealot128</a>. Also, contributions to the Gem code are welcome.</p>Stefan WienertMy media consumption and recommendations in 2023 - movies, games, books2023-12-31T14:55:36+01:002023-12-31T14:55:36+01:00repo://posts.collection/_posts/2023/2023-12-31-media-consumption-games-movies-series.md<p>Here, I want to share some of my media consumption in 2023, recommend some books, movies, or games.</p>
<h2 id="books">Books:</h2>
<p>This year I started to read more books again. In the previous years, I frankly read almost no books at all, if any then only programming books.</p>
<h3 id="three-body-problem-3-suns-trilogy">Three-Body Problem (3-Suns) Trilogy</h3>
<p>This Sci-Fi trilogy by Chinese author Liu Cixin was highly acclaimed. The first book has an upcoming Netflix series and has already broadcasted another one on Chinese TV series which I watched in spring.
Granted, it is relatively hard to read, as first, the names of the protagonists are Chinese, so one has to get used to recognising the characters. The books are also very different. The first one is a bit like a detective story, the second one is a bit like a war story, and the third one is a bit like a philosophical story.
The story and even the characters are not the main reason which makes it interesting, but a lot of great Sci-Fi ideas, such as a human-powered computer, folding and unfolding dimensions, and the whole “Dark forest” theory (no spoilers).</p>
<h3 id="battletech-books">BattleTech books</h3>
<p>BattleTech is a tabletop game from the 80s (which I admittedly never played). But it has a huge universe, that has a lot of Games (MechWarrior series, BattleTech by Harebrained Schemes, MechCommander, MechAssault, etc.) and - dozens of books.
In my youth I read some of them, but never in order and with huge gaps - Just all books that I could get my hand on in a time before Amazon and even eBay. So, This year I started again from the beginning:</p>
<ul>
<li>GDL - Gray Death Legion, Decision at Thunder Rift, Mercenary’s Star, Price of Glory.
<ul>
<li>The origin story of the mercenary unit Gray Death Legion. It involves a lot of non-Mech action, hand-to-hand combat, and some politics around ComStar and Marik. In the end, I found it mediocre, compared to later books. 6/10</li>
</ul>
</li>
<li>Warrior Trilogy - En Garde, Riposte, Coupe
<ul>
<li>Great books, with a lot of interstellar politics, spying, and a lot of mech action. By the grandmaster of the genre - Michael Stackpole. He has a great writing style and keeps the story interesting. 9/10</li>
</ul>
</li>
<li>Wolves on the border - Currently, I am here. Paused, as I’d like to take a break from BatteTech and “lasers hit the armor” for a moment</li>
</ul>
<h3 id="the-expanse---persepolis-rising">The Expanse - Persepolis Rising</h3>
<p>After watching the Amazon TV series, and noticing the author received a Hugo award and Lotus Award, I decided to read the books that are following the series. There are some plot differences in the series like one character died in the series.
After a relatively slow start, the story picks up and becomes interesting. The narrative style reminds me of Game Of Thrones because each chapter is written in the third person to one specific character, but we hear their thoughts, too - The chapter(s) with Amos are interesting :D.
I am currently at book 7, and I am looking forward to finishing it and the last 2 books.</p>
<h3 id="ruby-books---ruby-3--sustainable-rails">Ruby books - Ruby 3 + Sustainable Rails</h3>
<p>Frankly, only overflew the Ruby 3 book, which seems to be great as a reference point, if one likes to dive deeper into specific topics, such as inheritance, modules, etc.
Sustainable Rails by David Copeland has some great ideas and practices, some of which I also use in my projects.</p>
<h2 id="movies">Movies</h2>
<p>In general, I don’t watch too many movies, the one that I remember from this year are:</p>
<ul>
<li>Oppenheimer - 9/10 - watched in the cinema. Great soundtrack by Ludwig Görransson. As thrilling as you can tell a story about the development of the atomic bomb.</li>
<li>Tenet - 8/10 - finally watched it. Interesting enough, but not as great as Inception and Interstellar IMO. Still another great soundtrack by Ludwig Görransson.</li>
<li>The Batman - 7/10 - ok.</li>
<li>During our airplane travel to China, I remember to have watched:
<ul>
<li>Spider-Man Trilogy 7/10 - I guess ok?</li>
<li>John Wick 2-4 - 8/10 - great if you like realistic and brutal fight scenes. Otherwise a little boooriiing.</li>
</ul>
</li>
<li>Mario Bros - 10/10 - watched it in the Cinema with my kids. As great as you can make a movie about … Mario.</li>
<li>Everything Everywhere All At Once - 9/10 - very interesting and unique.</li>
</ul>
<h2 id="series">Series</h2>
<p>I have a regular SciFi series evening with a friend, where we watch a SciFi series together. This year we watched:</p>
<ul>
<li>Star Trek Strange New Worlds - 7/10 - good production quality, but too many “special” episodes, almost no classical Star Trek episodes (We come to a new planet, we have a problem, we solve it with science or diplomacy, we leave)</li>
<li>Star Trek Lower Decks - 9/10 - Very funny if you are familiar with the Star Trek universe. Tons of references, funny.</li>
<li>Star Trek Prodigy - 7/10 - originally developed for kids, but after 5-6 episodes or so it gets interesting and also references old Voyager characters.</li>
<li>Star Trek Discovery - 5/10 - compared to other Star Trek series, the character development was not as interesting for us. Burnham does not hold a candle compared to Picard, Janeway or Sisko. Also, this series is like a long movie with Rescue The Universe, instead of classical sci-fi material.</li>
</ul>
<p>Other series:</p>
<ul>
<li>The Billions - 8/10 - great main actors, like Suits a totally different world (rich people in New York), but interesting enough to keep it running while riding the bike (Zwift).</li>
</ul>
<h2 id="games">Games</h2>
<ul>
<li>Everspace 2 - 9/10 - great space feel, with 6DOF, great graphics, good story. I played it for 50 hours, and I am looking forward to the full release in 2024.</li>
<li>Diablo 4 - 5/10 - bought it, to play with friends. We finished the main campaign; the grind had its moments, but in the end, we all lost interest in the end game with its - <em>check notes</em> 3 activities.</li>
<li>Battletech - 8/10 - fits great to the books. Relatively difficult to get the hang of it (which weapons, which mechs) and to get ahead of the power curve. Especially mid-game with medium mechs I found it relatively difficult. In the end, after I got the first heavy - a lot of fun.</li>
<li>MechWarrior 4 Mercenaries (2001) + MechWarrior 4 Vengeance, Black Knight - 9/10 - A little difficult to get running on modern Windows 10 - Just check the Abondonware forums. But - surprisingly great games, Black Knight expansion is very challenging though, many missions need several restarts. But, especially Mercenaries is still sooo much better than ….:</li>
<li>MechWarrior 5 Mercenaries + Heroes of the Inner Sphere - 5/10 - I was so looking forward to this game, but it is just mediocre. The huge difference to the more than 20-years-old MW4:merc is, that there are almost NO cohesive missions. 95% is auto-generated repetitive grind shit. Also shit shit power-curve, If you follow the recommended path, you will get shot a lot, and have to cycle through lots of mechs, fly around a lot only for boooring repairs - in the end, you almost make no money, so best to go to easier regions and grind grind grind…. The whole Mech managing and equipment thing is so bad, the equipment progression super slow. Bad example of “quantity over quality”, doesn’t hold a candle to the 20 years older games besides graphics.</li>
</ul>
<p>Games that I played with my kids:</p>
<ul>
<li>Cobra Kai - 7/10 - great brawler, especially if you are familiar with the Netflix series.</li>
<li>Ori Will of the Wisp + Ori 2 - 8/10 Great “Metroidvania”, but a little bit too hard for the kids</li>
<li>LEGO Harry Potter 1-4 - My daughter became a HP fan playing those, and is now eager to watch the movies., 5-7 is already installed and ready…</li>
<li>Sonic Team Racing 6/10 - okish, but much less fun than the previous Sonic Racing Transformed All-Stars</li>
<li>Yokus Island Express 9/10 - Fun little game, great Flipper.</li>
<li>Currently: The Santa Clause brought a Switch, so Mario Kart 8, and Mario Party are on the list…</li>
</ul>
<h2 id="other">Other</h2>
<p>Special shout-out to some of my Patreon subscriptions:</p>
<ul>
<li>WhatsOnWeibo - Newsletter and online magazine about China, especially social media and youth culture. Helps me to get up-to-date and surprise my Chinese friends with modern slang.</li>
<li>[German] Podcasts that I support:
<ul>
<li>Gamespodcast</li>
<li>Stay Forever</li>
<li>Geschichte aus der Geschichte,</li>
<li>Halbe Katoffl</li>
</ul>
</li>
</ul>Stefan WienertMigrate from MySQL to PostgreSQL (Rails)2023-10-25T15:55:36+02:002023-10-25T15:55:36+02:00repo://posts.collection/_posts/2023/2023-10-25-migrate-from-mysql-to-postgresql-rails-.md<p>Our oldest project, the Empfehlungsbund user dashboard, was running on MySQL until recently. For various reasons that I will go into below, we decided to migrate to PostgreSQL. This is a short write-up of the steps we took to migrate the database.</p>
<h2 id="why-postgresql-for-us">Why PostgreSQL for us?</h2>
<ul>
<li>Almost all of our other projects are using PostgreSQL, so having a different SQL dialect in the mix is a bit annoying and confusing when diving into specific vendor-specific SQL features.</li>
<li>Transactional DDL, meaning even the migrations are running in a transaction. This is a huge benefit because it means that if a migration fails, the database is rolled back to the state before the migration. Especially useful if you have more than one change in a migration, and one of them fails.
With MySQL that is usually a pain, because you have to manually revert the changes that were already applied or comment them out. With PostgreSQL, we even pair our DDL migrations (e.g. adding a column) with a data migration (e.g. filling the column with data) frequently, so that we can be sure that the data is in a consistent state after the migration.</li>
<li>We like to use specific SQL-Features, such as JSONB with indexed columns, Text-Search with TS-Vector or Reverse-Tagging-Search with TS-Query.</li>
</ul>
<h2 id="migration-vs-pgloader">Migration vs pgloader</h2>
<p>Fortunately, there is already an awesome tool: <a href="https://github.com/dimitri/pgloader">pgloader</a> that can migrate from various Databases to PG. It will create tables, indices etc. and copy over the data.</p>
<h3 id="preparation">Preparation</h3>
<p>PGloader is available in most package managers, BUT we needed to compile from source because there <a href="https://stackoverflow.com/questions/75493241/mysql-to-postgres-migration-pgloader-error-mysql-76-fell-through-ecase-express">had been issues with the old version</a>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># compile from source</span>
apt remove pgloader <span class="nt">-y</span>
apt-get <span class="nb">install </span>sbcl unzip libsqlite3-dev make curl gawk freetds-dev libzip-dev
<span class="nb">cd</span> /root
git clone https://github.com/dimitri/pgloader.git
<span class="nb">cd </span>pgloader
make pgloader
./build/bin/pgloader <span class="nt">--help</span>
<span class="nb">cp </span>build/bin/pgloader /usr/local/bin/pgloader
</code></pre></div></div>
<p>Now, also make sure that your database users have access to the two databases:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql <span class="nt">-u</span> root
mysql> CREATE USER <span class="s1">'admin'</span>@<span class="s1">'localhost'</span><span class="p">;</span>
mysql> GRANT ALL PRIVILEGES ON <span class="k">*</span>.<span class="k">*</span> TO <span class="s1">'admin'</span>@<span class="s1">'localhost'</span> WITH GRANT OPTION<span class="p">;</span>
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>su - postgres
createuser root
psql
GRANT ALL ON SCHEMA public TO root<span class="p">;</span>
GRANT ALL PRIVILEGES ON DATABASE <span class="s2">"YOUR_DB"</span> to root <span class="p">;</span>
</code></pre></div></div>
<h3 id="migration">Migration</h3>
<p>PG-Loader can be run directly from the command-line but also supports a config file in SQL-like format. In our case:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">LOAD</span> <span class="k">DATABASE</span>
<span class="k">FROM</span> <span class="n">mysql</span><span class="p">:</span><span class="o">//</span><span class="k">admin</span><span class="p">:</span><span class="n">yourpassword</span><span class="o">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="o">/</span><span class="n">your_db</span>
<span class="k">INTO</span> <span class="n">postgresql</span><span class="p">:</span><span class="o">///</span><span class="n">target_db</span>
<span class="k">WITH</span>
<span class="k">preserve</span> <span class="k">index</span> <span class="k">names</span><span class="p">,</span><span class="n">prefetch</span> <span class="k">rows</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">alter</span> <span class="k">schema</span> <span class="s1">'dbname'</span> <span class="k">rename</span> <span class="k">to</span> <span class="s1">'public'</span>
</code></pre></div></div>
<p>Run it with:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/usr/local/bin/pgloader -v pgloader.load
</code></pre></div></div>
<p>The options that we used:</p>
<ul>
<li><code class="highlighter-rouge">preserve index names</code> - this will try to keep the names of indices the same, otherwise, you will get indices in PG with a number suffix like <code class="highlighter-rouge">index_foo_on_bar_12311</code></li>
<li><code class="highlighter-rouge">prefetch rows = 100</code> - this will limit the row length to 100 which fixed an <a href="https://github.com/dimitri/pgloader/issues/962">import heap error for us</a></li>
<li><code class="highlighter-rouge">alter schema</code>: it seems that <code class="highlighter-rouge">pgloader</code> likes to put the DB into a PG schema, so you might want to rename it to the public schema. That might be only possible if your access rights are right.</li>
</ul>
<h2 id="differences-in-dialect">Differences in Dialect</h2>
<p>The effort to change SQL access patterns is totally dependent on your codebase. In our case, we had a few things that we had to change, especially around date-time handling or JSON access:</p>
<table style="white-space: normal; font-size: 12px;"><thead><tr><th>Description</th><th>MySQL </th><th> PostgreSQL</th></tr></thead>
<tbody><tr>
<td style="text-align:left; max-width: 150px">Rand vs Random </td>
<td style="text-align:left"> <code>order(Arel.sql("rand()"))</code> </td>
<td style="text-align:left"> <code>order(Arel.sql("random()"))</code></td>
</tr>
<tr>
<td style="text-align:left">group by year of a datetime col </td>
<td style="text-align:left"> <code>where('year(created_at) = ?', year)</code> </td>
<td style="text-align:left"> <code>where('extract(year from created_at) = ?', year)</code> </td></tr>
<tr>
<td style="text-align:left">Format Month in DB </td>
<td style="text-align:left"> <code>group("DATE_FORMAT(senddate, '%Y-%m')")</code> </td>
<td style="text-align:left"> <code>group("to_char(senddate, 'YYYY-MM')")</code></td> </tr>
<tr>
<td style="text-align:left">extract JSON keys </td>
<td style="text-align:left"> <code>where("json_column->>\"$.json_key_boolean\"").</code> </td>
<td style="text-align:left"> <code>where("(json_column->>'json_key_boolean')::boolean")</code></td> </tr>
<tr>
<td style="text-align:left">Truncate to date to group by date </td>
<td style="text-align:left"> <code>date(senddate)</code> </td>
<td style="text-align:left"> <code>date_trunc('day', senddate) AS senddate</code></td> </tr>
<tr>
<td style="text-align:left">Date arithmetic </td>
<td style="text-align:left"> <code>where day > DATE_SUB(CURDATE(),INTERVAL 6 month)</code> </td>
<td style="text-align:left"> <code>where day > (CURRENT_DATE - INTERVAL '6 month')</code></td> </tr>
</tbody></table>Stefan WienertRails 7.1 - migrate from secrets.yml to credentials.enc.yml [Short]2023-10-24T12:08:53+02:002023-10-24T12:08:53+02:00repo://posts.collection/_posts/2023/2023-10-24-rails-7-1-migrate-from-secrets-yml-to-credentials-enc-yml-short.md<p>If you have been using the <code class="highlighter-rouge">Rails.application.secrets</code> feature, you have been able to ignore the deprecation until Rails 7.1. But now, Secrets is gone! We had been using <code class="highlighter-rouge">config/secrets.yml</code> in the past because our deployment script would just replace the file during deployment.</p>
<p>The “new” credentials on the other hand want to be kept in your repository, encrypted. We used the following playbook to migrate our secrets to the new format:</p>
<h2 id="development--test">Development / Test</h2>
<p>Use the Rails commands to generate the credentials and a random key. During the generation, it will pop open your editor and you can copy over the secrets from the old secrets.yml and respective environment onto the top level:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rails credentials:edit <span class="nt">--environment</span> development
rails credentials:edit <span class="nt">--environment</span> <span class="nb">test</span>
</code></pre></div></div>
<p>Then, in our case, the dev/test credentials are all fake anyway, so we will commit the keys to the repository:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Copy over stuff from secrets,</span>
<span class="c"># might commit dev/test key:</span>
git add config/credentials/test.key <span class="nt">-f</span>
git add config/credentials/development.key <span class="nt">-f</span>
</code></pre></div></div>
<h2 id="production">production</h2>
<p>Generate the key and credentials file the same way:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rails credentials:edit <span class="nt">--environment</span> production
<span class="c"># use content of config/credentials/production.key and set it as Environment Variable RAILS_MASTER_KEY in ansible</span>
<span class="nb">cat </span>config/credentials/production.key
</code></pre></div></div>
<p>Put the content of the production.key somewhere in your production pipeline as the environment variable <code class="highlighter-rouge">RAILS_MASTER_KEY=</code> (e.g. Heroku env, Ansible env, Docker env, etc.)</p>
<h2 id="migrate-usage">Migrate usage</h2>
<p>Lastly, replace usages of <code class="highlighter-rouge">Rails.application.secrets</code> with <code class="highlighter-rouge">Rails.application.credentials</code>, here using the awesome sd + rg tool instead of sed. Our use find&replace all in your editor of choice:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sd application.secrets application.credentials <span class="sb">`</span>rg application.secrets <span class="nt">-l</span><span class="sb">`</span>
</code></pre></div></div>Stefan WienertChina trip 2023: internet and payment situation and app recommendation2023-07-28T13:45:19+02:002023-07-28T13:45:19+02:00repo://posts.collection/_posts/2023/2023-07-28-china-trip-2023-internet-and-payment-situation.md<toc></toc>
<p>After a long break caused by Corona, we went back to China this year. Because the internet situation for a foreigner is far from ideal, I want to share my experiences of using various “Jump the wall” strategies.</p>
<h2 id="1-buying-a-sim-card-in-hongkong-with-china-roaming">1. Buying a SIM card in HongKong with China Roaming</h2>
<p>If you have a couple of hours, you can buy a SIM card directly at Hongkong Airport. You just have to leave the transfer area and immigrate. Inside the airport, there is a 7Eleven shop. There, you can buy a SIM card, which is made for Mainland China Roaming. Just can buy with your VISA card (ApplePay works great!).
Then, you have to activate the SIM card and register with a passport (Photo is enough). All-in-all took about 15min and I had unrestricted internet in China. Best, you activate BEFORE entering China though, because maybe accessing the register portal needs some WiFi connection first. Best, just to it right at the airport</p>
<p><img src="/images/blog/2023/csl.png" alt="CSL Sim card details" /></p>
<ul>
<li>Pro: Easy to obtain, relatively cheap, good reception</li>
<li>Neg: only 2/4GB included traffic, which can be used up quickly. Have to go through Hongkong to obtain it. You can recharge the card online with your credit card and can buy more 2GB slices for 60 HKD (7 EUR).</li>
</ul>
<h2 id="2-self-hosted-vpn-from-germany---trojan-go">2. Self-hosted VPN from Germany - Trojan-Go</h2>
<p><strong>Heads up:</strong> I prepared Trojan like below, but in the end used it only a few times, because the speed was extremely low. Like max. 100kb/s, only useful for accessing a couple of websites in serial and getting some information. I guess, between China and Hetzner is not a good peering, or the GFW is throttling the speed to a probable proxy, who knows. In the end, it is just a fallback now.</p>
<p>As an IT person, setting up my own VPN was another option. I read, that the Shadowsocks protocol, that I used years before, does not work anymore, and one should now use Trojan-Go.
So, I set up a Trojan-Go server which is easy using docker-compose on a Hetzner VM IF you can also bring a domain name (you must have access to a domain name, to make Trojan useful and get a LetsEncrypt certificate)</p>
<ol>
<li>Order server from your favourite provider</li>
<li>Add a domain name (A-Record) to that server, it can also be a subdomain.</li>
<li>use the <a href="https://github.com/Jeonkwan/trojan-go-caddy">trojan-go</a>:</li>
</ol>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt update
apt <span class="nb">install </span>docker-compose curl uuid
git clone https://github.com/Jeonkwan/trojan-go-caddy/ /opt/trojan
<span class="nb">cd</span> /opt/trojan
<span class="nb">source</span> ./configure_trojan-go.sh
<span class="c"># Enter domain name and a random password</span>
docker-compose <span class="nt">-f</span> docker-compose_trojan-go.yml up <span class="nt">-d</span>
</code></pre></div></div>
<p>Then, to connect you can install an iOS app <a href="https://apps.apple.com/de/app/oneclick-safe-easy-fast/id1545555197">“OneClick”</a> - BUT that must be done before entering China because the app is not available in the AppStore.</p>
<p>For MacOS or Windows PCs, you must also install the trojan package and configure it with the client and leave out the server part. I had trouble running it via Homebrew and <code class="highlighter-rouge">launchctl</code> and instead opted to manually run it every time I needed it. It also will only start a SOCK5 proxy that you must manually configure in e.g. Firefox to work. To make it globally available you might need other software, like <code class="highlighter-rouge">polipo</code>.</p>
<ul>
<li>Pro: It works, I guess?</li>
<li>Neg: Very very slow for my setup / server at least. Hard to set up for non-technical people.</li>
</ul>
<h2 id="3-the-vpn-i-actually-used---veee">3. The VPN I actually used - Veee+</h2>
<p>In the end, I got a recommendation for the App Veee+, which I could download from the App Store through my Hongkong SIM card without issue. Then you can book the “VIP” package for about $15 per 90 days package, which is very reasonable.
As of 2023, that VPN is working great. They also provide a Mac/Windows app - Which I downloaded through the phone and sent via Airdrop to the laptop… because the Trojan was too slow.
If you book the subscription via AppStore, I recommend creating an account before buying the package first. I booked the subscription first and then created an account, and then later I had to contact support to merge the subscription from the Anonymous “Tourist”-Account to the email account.</p>
<p>Pro: Hi-Speed, various apps, very reasonable price.
Neg: Have to download before entering China from the AppStore to work correctly.</p>
<table>
<tbody>
<tr>
<td><a href="https://apps.apple.com/de/app/veee/id1325003703">App-Store</a></td>
<td><a href="https://kxe1.net/405abfe">Website (Affiliate*)</a></td>
</tr>
</tbody>
</table>
<p>*: will give you 10% off, if buying a full year’s package.</p>
<h3 id="veeeproxy-usage-for-developer-tools-console-bundler-yarn-curl">Veee+/Proxy usage for developer tools (console, bundler, yarn, curl…)</h3>
<p>Even after using Veee+ global mode, you might not be able to access Github from the command line. Unfortunately, to install a lot of developer stuff - Homebrew recipes, Rubygems, NPM-Packages etc. you need access to Github, which might be disabled (At least it was for me). To fix this, you need to manually tell all underlying programs to use the Veee+ Proxy.</p>
<p>In MacOS bring up the “Proxies” configuration. There, after you enabled Veee+ global mode you can see the configured Proxy localhost plus a port number with a 5-digit number. Note that number, go into your console and:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">http_proxy</span><span class="o">=</span>http://localhost:15236
<span class="nb">export </span><span class="nv">https_proxy</span><span class="o">=</span>http://localhost:15236
</code></pre></div></div>
<p>After that, you should be able to access Github and install all the stuff you need. Note that you have to do this for every new console session. You can also add it to your <code class="highlighter-rouge">.bashrc</code> or <code class="highlighter-rouge">.zshrc</code> file if you are longer in China.</p>
<p>Usually, normal ssh usage was no problem from within China for me, but if you have trouble, you can also use the same proxy for ssh. Also, in some situations, it can improve the connection latency or bandwidth, so working on a remote system via TMux and quickly switching panes is much more enjoyable.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># For MacOS usw -x</span>
<span class="nb">export </span><span class="nv">ssh_proxy</span><span class="o">=</span><span class="s1">'ProxyCommand=nc -x connect -x localhost:15235 %h %p'</span>
<span class="c"># For GNU/Linux usw -X</span>
<span class="c"># export ssh_proxy='ProxyCommand=nc -X connect -x localhost:15235 %h %p'</span>
ssh <span class="nt">-o</span> <span class="s2">"</span><span class="nv">$ssh_proxy</span><span class="s2">"</span> user@host
</code></pre></div></div>
<h2 id="4-payment---wechat-pay">4. Payment - WeChat-Pay</h2>
<p>Now there is almost no cash payment anymore in China. You buy everything via WeChat Pay or AliZhuFuBao. Before flying to China, I tried to use both and link my VISA card, but both failed me during the verification, like even if I supplied a Passport and Visa, I would get random errors.
But fortunately, <a href="https://asia.nikkei.com/Business/Finance/China-s-WeChat-Pay-and-Alilpay-now-accept-Visa-and-Mastercard">WeChat formally announced</a> that they allow you to use foreign VISA cards now, since about 20th July or so.</p>
<blockquote>
<p>There is a 3% fee for transactions more than 200 yuan, with an annual payment cap of 60,000 yuan.</p>
</blockquote>
<p>Go to: Me -> Services -> Money should start the verification process. You must enter your passport data and make a photo of your passport, as well as a face verification of yourself (Tip: Use a white background). The process was still very buggy and badly translated, but in the end, now I can use WeChat Pay. Still cannot receive HongBaos and send people money, but I can pay with QR codes at least. If you pay more than CNY200, there is also a service fee.</p>
<p>Things to still find out: -didi-taxi-, train tickets, bus tickets, etc. - I will update this post, once I know more.</p>
<p>Didi Taxi: I just used the Mini-app within WeChat to call a cab without any problem. It worked; the only downside is, that sometimes the driver will try to call you if they can’t find you are unable to use their app to find your location. So some Chinese is useful or have a friend nearby for translation.</p>
<h2 id="5-maps-apple-maps">5. Maps: Apple Maps</h2>
<p>GoogleMaps is still borderline useless, because the GPS fix is completely off, because of a <a href="https://en.wikipedia.org/wiki/Restrictions_on_geographic_data_in_China">policy by China</a>. Also, the map data is now growing old, as GMaps is not used anymore in China.
But, Apple Maps to my surprise worked relatively well, even has some Subway lines integrated and good POI information.</p>
<h2 id="6-chinese-characters-reading-pleco--apple-camera">6. Chinese characters reading: Pleco + Apple Camera</h2>
<p>Apple camera has that great AI feature where you can select text in the Photo. So my process is like this: making a photo of the menu, selecting the text, switching to Pleco and receiving the translation.</p>Stefan WienertBest 23 Cycling apps & links2023-05-05T18:54:45+02:002023-05-05T18:54:45+02:00repo://posts.collection/_posts/2023/2023-05-03-cycling-apps-links.md<p>In this post, I want to give you an overview of the apps and websites I use for cycling. I will try to keep this post updated in the future. If you have any suggestions, please let me know via Mastodon/Twitter/Mail.</p>
<h2 id="route-planning">Route planning</h2>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAI5UlEQVR4nO1dC7BWUxS%2BEZHH6DGM6XURPU1GNWhE3gblESqkhFAeITPyGHHFyHtC5V0aijHVpMEYJoMaTMOkQkrNNAoj8ppIzbKXvc%2B9665%2F7%2FOfs%2FY%2B%2Fr%2Fb%2FmbW0DlrrW%2Bt83X%2Bc87e%2B5xqaiIiIiIiIiIiIiIiIiIiIsIA8mNWpWtu0hAIMqPSNTdpCAR5odI1N2lEQaoMUZAqQxSkyhAFqTJEQaoMUZAqQxSkyhBMELWj3iLkEAjyXJ4kG5S9q2yismNDimXEb6Nsr4zWNhS%2F4W4t4Tax%2Bzv8JILMNHH1efImWaRssO%2FBUfGDBMUfHUiQ4QLuLkSQQuFDUAdCYVTciQK%2BnoEEOVfA3X5HECTBsChIOIQiWAg5zhaIgjgRkuBHZS2iIH4ITfC7sl2iIHIUQbAWyvx8QRTEiaIIpkdBZCiSoE8UJD%2BKJPgFHD9dEAVxAgmOV9ZZ2Z7KDlV2nLJxypYFyH9xExXkD4v9IMi7Xdkmmqdc8c2VvSkgSrAZLGcJ7KCCZMidF1OkTZwlIEvQ15IvCqIhnw9RwecLCBFzLbmiIBp%2BE1QqwXsCUgTPEwXR8BZkHwEpoj%2FLEwXR8J%2FCVUkWCIgnsRxREI0gghwjIP6U5YiCaAQRREK8jeWIgmiEWXWiEn0pIKfxURCNYII8KyDfncRHQTSCCXKPgLwNiY%2BCaAQT5HoBeS2Jj4JoBBNktIC8M4mPgmgEE%2BQOAfkBJD4KohFMkEcE5PuS%2BEoKco6Au%2BoFeUdATuP7C%2BJ7B6p9iIB7%2F4y58yKYINvzMrP4XoLijw1U%2BygBd%2FOMufPixRANNRcQ%2F8Ry1ApyXOBdvOa%2BRcCdNXdevB6iodsExPNZjtaCHI96F6%2B55wi4s%2BbOi0W%2BzaBtFhCPZ3maCXKs9Cq%2Bgfv7vMQ5cufFMt9mLheQIrqyPNLVG60865ecmatz5M99bQXpqx3gtwTGlu9XQZ7ZsurrOZ8XcGb%2BHgnIVp4cI2kE7QsBGWKOI%2Bd8Yb7Tcjeg%2BToL%2Ba7MwfGVIP9yyHOWKOdWyr4VNoPo5sh7tUfOXO%2BkKP%2BeHlyH5eB5X8jxHKSJAvqMOErZDI9GEOtTOPbwzL1S2SmuRkwP3ZTN8%2BTJqgfyPebBgwsTD8ck3yn7UNkbyhabP4dC%2FzINrAjEs1HZEtA9fKDsm0B5p2ZWo0Y8TtYIRa5VXZqhgTMK5A%2BBtjkF8T6eRQqyX8YG1hRYgw%2Fm5RGD9CS9%2BfkPRQkyOEcD3QuqwRd7CQXx%2BtkqQpCJgiYkU8JF4hKJGKYXtI1S4tCCPAyCJ09Tx4uBa5HiKakYpJ%2BDpeQhBRnn2QTa7ID1SIBP8r56JP0MlhQQQpAtyroH6UI3clWAmiQYFaoH0st5eYvwFeROKOALQqA%2F%2BPKBZ21Z8TZknBEU9nKYst%2ByFiMR5C9l4%2BF%2F%2BJQT6CftVwU1ZsFLkHGuPEAfaDdlKSqrIJ8ou1tZJ6jAN7VMnTgP%2FyTIBvAQOB73hLJTK9ED6QP5X1b2p0uQEcpuBj21iSqOBL0yA58PdqtU8WkwdbcEPWh4vulhvOkBr0EXgh7n6gP6%2B1aVLtkK00dHZScoOxOPfaVrioiIaDJQPyntQX%2FusK%2B5prXOGFdjfpYwDl946lV0rTsFoHTF5jUZ41qxuDVF17pTAPRnDSkuzRjHJ%2BM%2BK7rWnQJRkCoDlI5KhxfEXGQ6OfYlFzC0AWBfznOgsn7QcKGrtfignQb64XKq%2Be9QWz4Sc5LJibk7kjwDzYHBh8SSBRTEp85wTQQ9R%2BHkssQPMhzTlN0H%2BgM9uP3WQIIsJVxdlE1Q9hRyJk%2Fqyy1J9oZSlLwSAKVfd7iI7R9ryUMxxXawmA%2FOlbdT9jfbPpIdyNvLcN1r4yLxD6bE4oelZ7JtUkFwdQp%2BOHktJ6GN8yS2Udc6SxMlOcn%2BKSkNUiyz8FPghM82S9ww4p91zGuRhQttccZ4CqkgKO4%2FtoS08SNYko8s%2FuuYTzu2fwnZd4KjCVy%2Bs8my%2FZ4UQVwYbXxd73zgIjTbSOtYxuU6s8otDZUKwlH%2Fl402XkcSpB2QZsTvOrZvNNnHF9fhdYMWaZtLLycILhvCcaoOoO%2Ftk1r5Qb%2BW5ern4gJ7rwvY%2Fh7Kfrb4%2BQoynPFMosWsIAkGkO1bWJJLiN8itm93RwFLSqrUfnxIui%2FZxzEP7NeaTtzPwfUA8%2Btktp%2FMtls%2FTQilvwYIH0FucDlTJNteINtw3oBOFr1lfHjsOpJzINuHr8CNAT0amxi%2BWv008xvlqAuxh6N%2BviJ%2FLugbCcqFZ%2FIrzO9Mh1BjUg7sx8zXRxCnMwXeAuM2egEdBKV3SuhzCNt2F8kpnYYd76jLec%2BKvEKu4SZ%2BFtveL4VrKvOVCvJdmjPF%2FVB6u2sbi8GV5Deybe1JzivKHQ0HRjvq2p5Sv%2BQVbcTZJp4vrBiQwvUM85UKsjHNmd5J4O0nfSlyLfGjF058kKFv4uLzAc3Jl4jiTB3%2BAy61KdYVGn8PhWJLSv38JU58EGxbhgunhpuZeD5geEsKF5%2BtLOQnayFz%2FJz8P73zos8Uq6CxkNNZTn6Wfe0swN0ERZogfA3Uhzl5%2BErDrbZaQY8acPgIMtnlfLHFOQH9HEbvFD%2Fbl0f5KvqHoPFZdCToBRP4vdrkCXwXsp8iTRA0fic4gXHhndRWw4X%2F3Qbpt734rNQLGm6rXf8qj%2B9tL44MtDccLQDfW3cUlIA3XtaP%2BJ%2Fu8MWzxTbB%2FxqLp3AKYnxHOLjwwPLhFsQTLP7JlN7SEOrBsB5JwHrLvpctiW0vv8wvqaDB%2F%2FGMdfwAkDp0kiqI8c%2B66nG1hQttVYbYDezPUkGQy%2Fo2cBIw2bLvHEvioRa%2FIWWKuQAcS14MpoH9DCstNJ0nubtLG%2B5wrj028Wl%2FgfA5in9v0vnMwnLzt3%2BXGb6Sz%2B4mAbuCHgamdyGuoruV83MUhctxcKnLZaC%2FlN09LVbtO9xwHAT53vNLnqrPNlx4x9c1R51oR4O%2BtuIYWQ9ofL1J%2BsecLXPk7GHi8PmtA9mH7%2ByfntSatc%2BIiIiIiIiIiIiIHRj%2FAhsBGOimrn08AAAAAElFTkSuQmCC" /><h4>bikerouter.de</h4></div><div class="bookmark__right-side"><q>▶ Der wahrscheinlich beste Fahrrad-Routenplaner der Welt! Kostenlos und datenschutzfreundlich. City, MTB, Rennrad, Gravel, Trekking uvm.</q><div class="bookmark__comment"><p>The meta description is quite on point. For an OpenSource app it has a extremely sophisticated Routing algorithm, that has sometimes a lot of tuning options. Mostly use “Trekking Fast Wet” or “Rennrad (weniger Verkehr)”</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://brouter.m11n.de/">bikerouter.de<br /><small class="text-muted">brouter.m11n.de</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A2KKKK%2FMTyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKltbea7uY7e1ieaeQ4WNBkmoq6zTP%2BJR4fhkiO291NWd5BwyQA4VQe24gk1vh6PtZa7LVjS6sgj8LRxHbqesWlrL3iija4Kn0JXABqK58L3BjeTSrq31NUGWjiBSUD18tuT%2BFW7C1ur6QxWUEkzKMkIOg9z0FRs89pc4bzILiJu%2FyshrvdCly6wsu93f%2FAC%2FAOby0OYBz0orofF0cc8dprMSqjXW%2BO5VRgCZOrf8AAgc1m3%2BkXllcJC8fnO1utz%2B4DPtRs4J446c9q4KuHlCTS1St%2BOw3HsUKKla3nW1W5a3mW2Y4WYxsEP0bGKcbO6ETSm0uRGoBZ%2FJbaM9MnHftWXLLsKxBRUs9vPbzCKe3milOMRyRsrHPTAIyaS5gntZPLuoJoJMZ2SoUOPoaHFrdBYjoqybC8FxBA9pcRzTEeWrxMpb3AI5FP1XTrrSr6S1vY9siHG4A7W6cqSBkc03Tmk5NaILMp0UUVAgrqNRdptJ8PzxjKtaC1AXk%2BZGxBGPU5FcvW%2F4V186Q8kFwrNZyEuGVQz28m0qJUB4zg8j%2FACezBVIRm41HZPr2KjZ6M3Pt8%2FhnSpbKKZV1W5dZJAoB%2BzKBwpPdj6dsn8YtflOtxnWrTBKoqXcAHzQkfxe6n17fyzW0K5upGk0y%2BstTjclvMW4VJDz1dHIIP51Y0yFfD14l9qWpQRSJkfY7V1mlmHdGx8qqfUnt617Tk3HlnpD10XnfZ7%2FP7i%2FefuvYqa0xj8HWELY33N3LcoO%2BxUCZ%2FE1u61qun32jyWFnewW919kgZ5fMwt0qqQYC38JHp3z9a47WdSl1W%2BNxKiRIFEcUKfdijH3UH0qlXlSx3LOSgrppL5JW%2FH%2FgC57aI9B1LWrORdTvP7Yjn0y5sjBBpIB3o5UAAp0XBB59%2FYUQeJVh1W2WPVVW0j0YJgSfILgDpj%2B9wK8%2BoqnmlW%2FMlb7%2FAF77eQ%2FbPc7nTdftfL8Mz6le77yKC6imnf8AePA7EbHb14B%2FOnR6xZ2DaHFq2pR6zcW14073MZMghjKFQNx5PzENjtj2FcJRUrMqiWyvp36W311%2BFB7V%2FwBf15Haalq5stL2S66NVvmvUuIJLdjmCMfe%2BbsWGRt96zPHFyt7rbXUGox3trMN8KrISYRgAqVP3eRnFc9RWdbGyqwcGtNO%2FS%2F379fLsKVRtWCiiiuIzCiiigBGVW%2B8oP1GaAABgAAe1LRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf%2F2Q%3D%3D" /><h4>Komoot | Find, plan and share your adventures</h4></div><div class="bookmark__right-side"><q>Turn your next ride, hike, or run into an adventure with komoot. Get inspired by tapping into shared community knowledge and recommendations, then bring your adventures to life with the easy route planner.</q><div class="bookmark__comment"><p>A good planner, but slower than bikerouter. On the other hand, I use it mainly to upload the gpx files from Bikerouter to my Wahoo.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.komoot.com">Komoot | Find, plan and share your adventures<br /><small class="text-muted">www.komoot.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAAvGQEA6AMAAC8ZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2Bp%2FLX%2B6Pyo8tf7o%2FKnUUAN8tf7o%2FKjy1%2Fuj8qdRQA3y1%2Fuj8qPLX%2B6Pyp1FADfLX%2B6Pyo8tf7o%2FKnUUAN8tf7o%2FKjy1%2Fuj8qdRQA3y1%2Fuj8qPLX%2B6Pyp1FADfLX%2B6Pyop1FABRXL%2BEPGdl4keSCOOS2vI13mGQg5XOMqR1xkeh5rqKyo1qdeCnTd0bV8PUw83TqqzQUUVzfxG8SP4R8E6vr0Vst09jD5ohZ9gfkDGcHHX0rUxOkor5M%2F4a0u84%2F4RCD%2FAMGDf%2FG6X%2FhrS7%2F6FCD%2FAMGJ%2FwDjdAH1lRXzh4O%2Fao0XUtRitfEuiz6RFIQouop%2FtEak93G1WA9xu%2BlfQWoX62%2BjXOoQbJ0jgadNrfK4ClhgjsfWgC7RXzV4C%2FaVuvFPjLRtDfwxBbLf3KQGYXrNs3dwNgz%2BdekfHP4mzfDLRdNv4dLTUTd3BgKPOYtuELZyFOaAPTaK%2BTP%2BGtbv%2FoUIP%2FBg3%2FxunL%2B1rdBgX8Hwle4GokH%2FANF0AfWNFfOGm%2FtX%2BHJLVW1Pw%2FrFvc55jt2imQf8CYof0ooA9P8ABPhS08N3Mup3mq21wxjMaMhCRopIJJJPJOB9K7y2niuYEmt5FkicZV0OQw9Qe9eLWesaHbzfadK8ECWJTxLKzS%2Fj91gD%2BNdt4b%2BIumatcJa3Ub2Fw52oJGDRsfQMOh%2BoFeHl%2BMw1JKjFqPb4tX6tI%2BizPAYuq3XknLv8Oi9Itnb155%2B0F%2FyRrxX%2FANef%2Fs616HXnn7QX%2FJGvFf8A15%2F%2BzrXuHzp8kfsx3GlWvxUgk12awhsvss4Z71kWPO0Y5fjNfYEusfDYxOJdS8HmPB3bp7XGPfmvh74PeB4%2FiD42j0Ka%2FewV4ZZfOWISEbRnGCR%2FOvT%2FAIn%2FALNtz4U8H3mt6NrMmrPZfvZ7drQRHyR951IY5K9SPTJ7YIB5X8YpfD03xM12TwakK6EZl8gQLtjzsXzNg7Lv34xxjpxivtb4dwXtt8AtJi1PcLldEPDdVTymKA%2BmE2jHtXyP%2BznH4TufiRZWfjSyFylwQlkZX%2FcrcZ%2BUSJ%2FEG6DPGcAgg8fd3ij%2FAJFrVf8Ar0m%2F9AagD8%2B%2FgZ%2FyV%2Fwl%2FwBhCKvof9tn%2FkTfD3%2FX%2B3%2Foo188fAz%2FAJK%2F4S%2F7CEVfQ%2F7bP%2FIm%2BHv%2Bv9v%2FAEUaAMf9i%2FS9P1HR%2FFH9oWNpdFLi32meFXK%2FI%2FTINfRN74L8MX0DQ3nh3R54m6rJZREf%2Bg18%2B%2FsT3ENvo3iozzRR5uLfG9wufkf1r6O1DxFo2nW7T6hq2n2sCjJknuURR%2BJNAHyD8ZvgRPpvjNh4LhUaTcQrOIZZD%2B4cswKKTklflBGeecdqKb8bPjjPqXjZ%2FwDhC7hTpNtAsAmkQ%2Fv3DMWdRwQvzADP93PeigD7SRFRFVAFVRgAcACuN%2BI%2Fhe01TR7q%2BhhRNRt4zKJFGDIoGSrevHT0P412lYHjnVYdJ8M300rAPJG0MSk8s7Agfl1PsK5cbTpzoSVXax2YCpVhiYOi%2Feuin8M9Wl1fwrA9wxea3c27OerbcEE%2B%2B0ipfiX4cm8W%2BBdZ0K1njt5r6DyllkUlVO4HkDntVb4V6ZLpvhGDz1Kvcu1xtIwQCAF%2FRQfxrc8T6jPpHhzVNStLX7ZPZ2stwlvv2eaUUtszg4JxjpSwDm8NB1N7IeYqCxVRU9rs8O%2BDHwG1PwB45h1271myu4UgliMUUTqxLDAOTxX0GyhlIYAg8EGvN9R%2BLWk251lbWCS4aw0SPWI%2FmwJ%2FMAKxA4OG%2BeHnn%2FWjj19FgaRoI2mRUlKjeqtuAOOQD35rrOI%2BXvF%2F7Lct74mv7zw3rNpYaZNJ5sNtLE5aDPJUEcbQc474wO2T7%2Foela1%2Fwgi6T4hv7e71f7K9tJeRKwWXgqrkHndjG71OSMZxVjwLr58U%2BEtM1o232U3sXm%2BTv37OSMbsDPT0rGTxTr5%2BID%2BHDoWnCFYheG6%2FtNt32YymMN5fk%2Ff4zs3Y%2FwBqgDxf4ffs3ax4X8a6Jrc%2BvafPHYXKTvEkLgsB2BNem%2FHv4aXvxL0TS7Gx1C3smtLlpmaZGYMChXAxXaeO%2FEH%2FAAivhHVNb%2BzC6%2BxQmXyTJ5e7kD72Djr6VU0bxnYa14wu9G0ma0vbe3sYrtru2uVlXc8jp5ZC5wQEB69%2BlAHzT%2Fwyfrf%2FAEMmm%2F8AgPJT4v2TtYLgS%2BJtPVO5W2diPwyP519eUUAfOGl%2FsoeG47RV1bX9YubrPMlssUCEf7rK5%2F8AHqK%2Bj6KAOZl0%2FwAT26mOx1myuI%2Bite2hMij3ZCAx99oqla%2BCnu9Sj1DxRqL6tPHzHD5YjhT%2FAID37eme%2Ba7OiuWWDpSa57tLo22vu%2FzO2OPrRTULJvqkk%2FvS%2FIKR1DqVYAqeCCMgilorqOI8isPgzBaaToVp%2FabySafq5vppGQn7Rb%2FKFtyM9AsNsO4%2FddK9dxRRQBz%2FAIA0CTwv4P0vRZrhLmSzh8oyohQPyTkAk46%2BtIvh%2BQePpPEX2hPKbTFsPI2HdkStJu3Z6c4xiuhooA574geH5PFPg7VdEhuEtpL2ExCV03heQckZGelQ6d4Ug07xvd65ZLbW9tPp8VmbaGAJ86SyOXJHByHA6dutdPRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBhf2vP8A3IvyP%2BNH9rz%2FANyL8j%2FjRRQAf2vP%2Fci%2FI%2F40f2vP%2Fci%2FI%2F40UUAH9rz%2FANyL8j%2FjR%2Fa8%2FwDci%2FI%2F40UUAH9rz%2F3IvyP%2BNH9rz%2F3IvyP%2BNFFAB%2Fa8%2FwDci%2FI%2F40f2vP8A3IvyP%2BNFFAB%2Fa8%2F9yL8j%2FjR%2Fa8%2F9yL8j%2FjRRQAf2vP8A3IvyP%2BNFFFAH%2F9k%3D" /><h4>Bike Route Planner - Ride with GPS</h4></div><div class="bookmark__right-side"><q>The number one bike route planning tool on the web. Fast, easy, and powerful. Plan your next bike ride and use voice navigation with offline maps.</q><div class="bookmark__comment"><p>Seems to be very popular in US, never used it though.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://ridewithgps.com/routes/new">Bike Route Planner - Ride with GPS<br /><small class="text-muted">ridewithgps.com</small></a></div></div>
</div>
<p>If you ride for more than a couple of kilometres, you might want to plan your ride ahead. Mostly, I use <strong>bikerouter.de/brouter.m11.de</strong>, which uses OpenStreetMap data and a sophisticated OpenSource routing engine called BRouter. It offers tons of different ride profiles to weigh the different road types.
You can also add custom OSM layers, such as Garmin’s heatmaps or Google Satellite:</p>
<p><img src="/images/blog/2023/additional-bikerouter-layers.png" alt="BikeRouter additional Layers" class="aligncenter" /></p>
<h3 id="weather-planningforecast">Weather planning/forecast</h3>
<p>Knowing the weather forecast can make the difference between a nice ride and a miserable one - Should I take the rain jacket, should I head back through the woods because of headwind etc.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QCkRXhpZgAASUkqAAgAAAAFABIBAwABAAAAAQAAABoBBQABAAAASgAAABsBBQABAAAAUgAAACgBAwABAAAAAgAAAGmHBAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAAABQAAkAcABAAAADAyMTAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BEDgWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjEwNWQ1NjMzLTAzMWUtNDE2NC1hNzY5LTgwMDc0MjlhNzIzMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNDc4NDk3MDkyM0MxMUU3QkI0QkM2RUY2QTc5NzdGMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNDc4NDk2RjkyM0MxMUU3QkI0QkM2RUY2QTc5NzdGMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoTWFjaW50b3NoKSI%2BIDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmIzMzA4ZDliLThkMDAtNGNmZS1hZTU4LTUxOGRiOGFmMmJlOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMDVkNTYzMy0wMzFlLTQxNjQtYTc2OS04MDA3NDI5YTcyMzIiLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz7%2F2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj%2F2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj%2FwAARCABkAGQDASIAAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL%2F8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4%2BTl5ufo6erx8vP09fb3%2BPn6%2F8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL%2F8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3%2BPn6%2F9oADAMBAAIRAxEAPwD6ayvtRke1VfOb0FKJ%2FVRTsK5a3UZFVTcHsBTWuD7UWHctFh600vVM3GOuBUT3gHekBo76A5rNW9B6VPHcA96ALwJNOqssy8c1Mr570AOpPqDTHJPIJFQoHMpyxK%2FXrQBMetFNklEZ2giiiwDSmeab5XpyatFVqJnCdDTuFivJAwUnIB9KzbiUxnnrV25n68mvP%2FGXiVoJXsrBsTjiWUfwf7I9%2FU9q3w2HqYmfs4HHjsbRwNJ1qz0%2FFvsjW1bxBZ6eSLiUmX%2FnknzN%2BPp%2BNc3ceNpNx%2BzWaAdjK5J%2FIYrkGYsxLEkk5JPU0lfT0MnoU17%2FALzPgcXxRjK0v3PuL7397%2FSx1SeNr4N89vakeg3D%2Bta2neNraRgt5FJbn%2B8p3r%2Fj%2FOvP6K0qZThZq3Lb0OejxHmFJ3c%2BZdml%2FwAP%2BJ7Ta38U8aSxSLJG3RlOQasNekcA8145pGqXOmXG%2B3YlD9%2BMn5WH%2BPvXoGnalHfwJPEflbqD1U9wa%2BexuXTwjvvF9f8AM%2B3ynO6WZRcbcs1uv1X9aHSC8kIA3cU4XUgI56VmRSZAqwrVw2PYuWmuGJyaKgALcgGigDciuBLE5K%2FMvUCsi5vWDEjgenpTyxRSVPPsarTQqQzShmY87R2qCjI1%2FXzY6bNKAPOPyRH%2FAGj3%2FDk%2FhXm9rp1%2FqG%2BSzs7q6APztFEz4J55IHWtzxxKPOt4UJ2gM5H44H8jXX%2FBjH9namM8%2Bch%2F8dr6PCP6lgniIq7f%2Bdj4jM4%2F2rmqwUpWjFfja7%2Fy%2BR5SylWKsCrA4IIwQat2el6hexGWzsLu4iB2l4oWcA%2BmQKbqoI1O8B4InkBH%2FAjXrHwg%2FwCRWuf%2Bvt%2F%2FAEBK9PG4t4ej7VK%2Bx8%2FleXRxuLeHlKy1%2FA8ht4ZbmZIbeN5ZXOFRFLMx9gK318EeI2UMNLkwfWRAfy3V2HwZ0%2BE2N7qLKDceb5CseqqFDHH13fpVC6%2BJ9%2BtzKtvYWghDEIHLFsZ74PWuepjMROtKlh4p8u9zsoZZgqWGhiMdUa572S8vkzitU0fUNKZV1Gzmt9xwrOvyk%2BzDg%2FnVnwxfG11BYmbEUxCnPZux%2FwA%2Bter%2BF9atvGujXttf2aoUwk0edykMDhgeoPB%2BmOteM6hbtYaldWu7LW8zxbvXaxGf0p0qrxkZ4avG0lv%2BjFiMNHK50cdhJ80G9O%2Bm6frsemwOavwHcwzWPp8vnQRS%2FwB9A35jNa0Oeor5Nqzsz9Ji1JKS2ZqIoC%2FeVfY5oqkJWPeikUSIg2ZZ8HrjFVJZZA2RyR3q6YD0Z1H0qvOVhUKTn3FIZ5546AOpwSAYDQ%2FruP8AjU3w88SR%2BH9UkW7yLK5AWRgM7COjY7jkg%2FX2q746thPYxXUYy0LYb%2Fdbv%2BYH51w9fWYCMMVglTlts%2F6%2B5n5tnM6uX5q69PfRrzurP9Ue03%2Fgzw94huX1OC5kAlO92tZVKOe55BwfXGK3fDsGl2mmta6K0b28DsjFH3%2FPjJy3c8j%2BXavAdNtRe30FsZobcTOE8yUkKufXFeyXbWXgTwe0Ecu64KsI93DTSkdcdgOPoAO9edjsLOmo0faOTeyPcyjMKVZ1MUqMYJL3pX1b8lbS%2FwCPqUvg1%2FyLV3%2F19n%2F0BKrj4XWrZMmp3BckklYlAqz8Ghjw3d%2F9fZ%2F9ASuA07xTqena%2B1%2B1zNcZkbzYpHJV1J5GOg9vStVTxE8TW9hKzVvn2OeVfB0sDhVjKfMmn8trvz6Hp0UWjeANEmPms8kh34dh5kzAcAAdv5V4rdTvdXU1xMQZZXaRyPUnJ%2FnXrnivR9O8XaImt6fOI5YoWbfszvUAkowzwQfy5615LYW7Xd3DBGCWkIHHYdz%2BVdOVuChOrNvn%2B1fpY4OIFVlUpYelFKn9i3W532j5WwtQe0S%2FyrobHHpVPS4os4BBK9OO1aKxgPvQYQ9R6V8zOXNJy7n6BTh7OCh2ViwY4ySdg55oo3%2B350VBoRzTquQudx7ms64bexNIz5prGmIoXkYkieOQbo3BDD1FefanZSWNy0bglTyjf3hXpEozWZqFlFdxGOZcr1BHUH1Fehl%2BOeEnrrF7%2FwCZ4udZRHMqS5Xacdn%2Bj%2FrQ8%2FqW5uZ7p1e5mkmdVCBpGLEKOg57Vfv9FubYs0SmaIfxKOR9RWWQQSDwRX1lKtTrrnpu5%2BbYnC4jCSdKtFx%2FJ%2FoySKeWIYjlkQZzhXI5%2FCo6Klt7aa5bbBGzn2HT8a0k4wXM9DGMZ1WoRTb6LcaksiKypI6q3UKxANdt4I0z7Kv22df38g2xqR91e5%2Bp%2Fl9ap6FoUccqy3hEkg%2B6g5VT7%2Bv8q7K1QKAScmvm8zzKNROjR2e7%2FQ%2B6yDIZ0JLE4rdbLt5vz7Lp6mhFbqzCSNQG6EetPBzOEdcYFNibbGcHBqcASKCDzjBrwT7EAVHrRULhg1FMRALOISli37vspNMmtI85SRselZbX0hP3uKU3zbcbqdmK6LF7CI2Hl8g8cnoaqSxlSQetMNwT1Oaa0ueppiGSJ8u33zVeS1jl%2FwBbFG%2F%2B%2BgNWWfJpoYU02tUKUVJWkrogXTrVeRawcj%2FnmKURbQFA4HYCrYcEUoxTlKUvidxQpwh8CS9COFMVoWzlMEkEDtVVdoycigygcCpLNUz%2FAC8U6K8Cqd1ZHnHFN86iwXNdp1ZiQ2B2BorJ86iiwGeGJpcmiiqELk0uaKKAFJNNyaKKADcaNx9aKKAHBjRk%2BtFFACZPNAGe5oooAeEGOpooooA%2F%2F9k%3D" /><h4>YR.no Today's weather forecast for your location</h4></div><div class="bookmark__right-side"><q>Weather forecast. Hourly, long term and precipitation map from NRK and Meteorologisk institutt.</q><div class="bookmark__comment"><p>The Norwegian weather forecast which works world-wide, to check for rain probs and wind directions before rides.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.yr.no/en">YR.no Today's weather forecast for your location<br /><small class="text-muted">www.yr.no</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BjVQdc1KoXHTms5ZveniU9jTA0CikVAcA%2FKfzqncXiW8Ek08qRwxKXeR22qqgZJJ7CvNvGN949v7fxda6VAtgkStHpclq586YBVbfuI6tggYxjJHUZpoD1czHGAMGmnc3zYrySw1LxMfFfw7WeDWVguLEHVGZpBErCJt6ypjActtO4kHPFTeAfGniOHS9Hj8XWV9cvqWqy6fDcGARyRrljE8i4GVwpGcDjB57gHqRJoLkL3xUDzZpPtJ27eop2C5L5gzTJDuFVi%2BDxSeaadhEhBHQ1G3vTHmwOTVaS5x0pgSuBmiqLTknvRTEaKsPap0Ix1FY8czYznio212wgh82e%2BtUi3FN7TKBuHbOetZlD%2FHK%2Bb4L16MW32rdYzBoN23zF2HcoPYlc498V8h6xqmna5exCztfEKxxQJGs39oDMqqoAZkZcZwByCM9cA19b3viTT4LGaVL20dvKZkQSqS%2FwApIAGec18n6Z9mu%2FEl4l2mIHg2qg4AHHp0qZS5UXCHM7FK3upYo3%2Bxa74otlU5ZRKCB%2BKzAfpXT%2BCfFmoWmv2kcnizxW73RMECSRh4zIwKpn94xIyRwBz6gZNRW9po1vHNbLBcmK5XYrKhbJHoa0%2FCa2Gg%2BPPDMtkxuLfzkJEx3bSz7dwz0Izke4rONW7sazoOKufUkDeVBFHISzoiozE5JIABOfqKf5wJ7Cs6S%2BtIc%2BbdQJjj5pAKpz%2BI9GiB36na8dQHzW9jmN4SK6gjBFQynPQVy0Xi%2FSY7ZMXEknH8EJqtP480%2BPO2G6ceu0D%2BtPlYuZHSyk5PBqMJzk81x83xHsEBLWlzj1JUf1qnN8VdHjH%2FAB73BPopU%2FyNPbcLp7HeEtngDH0orzWX4tacH%2FdaZeuvqWUUVPPEdmeJ22uahYrN5F%2FcxiVSjASnkHr3rP8AtmY%2FL3HZksAemT3rDW4faQ4PvgVZjkQTIJRgAjIHHB9OtYWfUVjrPD%2FEU13IAfLGFPvj%2Blcyt4U19ZGOEkyhPp6V199MsGhrDFAtuhUN5YyWPuxPJJP5CuCkIa8UDkA81KW50RVkrHZx218k8awXt6nQoUQEKPY5xj8Kz7eeR9ciFufNZJRj3CnJ%2FM5NZs91dwDyY7ifywNuwPgf%2Fqqzo1rIl9A7vt8siV8eg5xSStqazldWR2%2F2h3jmcBR5ZxhnGXz3FR%2BdcMmPIznIyDxVWzgmns5vKkXkblMZAIGOpGAamAts4M5YnoAxNOUmuhyqCZPBc3EAIEgj%2FwBkHNNmvpGPzzSHPpgVEotVGAjytj%2BJSKAkaMNsccbHrggtUuo%2B4%2BREBkR2yYmY%2Br5ao5bkRgg%2FKBx0xV2RZNpYsSvt%2FXNVZpI4o8BEaQ%2FxZzU81yrFP7QGJKqSPWipPtcv8KLj2oouKyMyTR7RskIU90JFNt7aDTLjz4m%2F0hjhZHG4xjuV9z61Ya6B4OMHuKzdQn8y135JIJFXSbb1MkdBLbtf2sAj%2B6TsYk%2FMc9P5GuctNPWa8VVGAZMD%2FdB5NdnHiy0u1UYFxKv7pO%2FIwXP0XOPrXL2zlPElssLDyVbyn46qTzT1bdjqVopXLN1aRwyFmILFskjsKnjjjt9OvJW5csqEegPUfkKfcW3nahsX5v4ixHGep%2FpTLqFobDdI6jzJAdp6A4OB9cZP41K1si5NK7Me0vp7WdfKlZWjb5Sp75rq4fJeJbiRcmT5yC3A9gPSuJjH%2BmyhsDBxgDAzXU2OzyIsjJ21db4TlTsaFzdxGNSpkI%2FuqOB9KrNchX3qAvbI5NRsF4ULgfXFV3miT2z2rmuVzD%2FtHml%2FMz17mq7yMcDHQ9KjmniB4QgnuO9VpHLZJUg4xycVRPMW%2FNI7hfaisp513dKKdmK5GY7mcgKQiknqOKuRxmE20YTzCxJwqAn9eB9aX7WE9PSqeo3dwYlayebPOQgP5cVrTldjsjpL%2B%2FVTJI7AyeUc4OcAYGP8%2Blc1BcxxziVz907sDqfasb7ZctHJHMrqy4ByNvHUDFQCdiO9aRjYcpXO5OrrFpQKtm5JwxPYkZ%2Fw%2FKlvpJl0Cya6gkUSPuDOmA4KcH8ea4eS4fy2Az%2BJ716r4ptbefS7W1sp1ZRALU7m%2B4ygGNiO3eodoNGsE6iZwel2k%2BoavNBZqpbcW%2BZgiqB3JJwBWyl00cUeADgcjPNMv44bC2u0jto4LoSiCYQElWwvBGfU5JNUmuSgKowBXjpnFKcuZEVIcll1Lr3TvgyMVwOMc1XuJgxy7E45BzzVJ5pG6sMenXNWra3kfnaFU8HcMn8M1EYNmYwOY2wpAVvU9KtwWdzcNu2lU9Wqe2tVjwcZb%2FaOa0Ygo5GDWqpLqFiOPSU2DdtY%2BpairG7HVcn6UVpyrsM4tkHmASuUU4yepH4V2fhm30uWyuEiW8lj3ZMpbaASMduM1xvkSEZkltvT%2Fj4jP9a6Kw8Q3NvE6TLazqAojSO4jjVcdcgGsHTn2NKFWnF%2B8zn%2FABXp8mk6gHUu9tPny3YdcdQffmsRp1JyR%2Bldv4o1SLW9B8gtbW9zHKHRWnRtwA9QeM5rifsE3d7X%2FwACo%2F8AGt4RnbVEVZQUvdYjTK4wqduxrXu9bhu0i3pLHPsVHOeHYd6yjp0nGHtP%2FAmP%2FGmnTpT1e0%2F8CY%2F8ap02%2BhMaqjsztfBeuW2lXNzJMoYzAL83JGKh1krqWt3N3GvlxSEEKOp4AP0rM0WyKqQzWpkHOfPjJx%2Bdba27Y%2B%2FB9fOX%2FGoVB3vYqVdSXLcrwWqJ91AP9rqauJHgEhufQ0LG4J2yQ7v%2Buqf409Y3XkyQk%2BvnJ%2FjWnJLsRzx7kyHZkbeM8kUNKiscLULqxHMkHTn98n%2BNRSBuzwf9%2FwBP8aOSXYOePcsee38Kiis%2FypD1kg%2F7%2FJ%2FjRRyS7Bzx7nn0FzLITvYH8BSTXLqCAqcjGcUUVFhlIOw6Gl8wnrj8qKKADfgcBfypDIx74%2BlFFAF7RpGW847qQa3I7mTgZ4GKKKAEe7lVRtIGfSqWo39xGAqPt4ySO9FFMCKy1G5fh5N3uas%2Fa5SXUkYHNFFADfPf1FFFFAH%2F2Q%3D%3D" /><h4>Epic Ride Weather</h4></div><div class="bookmark__right-side"><q>A unique approach to weather forecasts for cyclists, for your ride, with your route, at your pace. Official supplier to Team Jumbo-Visma.</q><div class="bookmark__comment"><p>(paid) app to check your tomorrow’s route for headwinds, rain etc.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.epicrideweather.com/">Epic Ride Weather<br /><small class="text-muted">www.epicrideweather.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QCkRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAWQAAAHAAAABDAyMTCgAAAHAAAABDAxMDCgAQADAAAAAf%2F%2FAACgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGQAAAAA%2F%2BEJIWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI%2FPgD%2F7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs%2BEJ%2B%2F%2BIM%2BElDQ19QUk9GSUxFAAEBAAAM6GFwcGwCEAAAbW50clJHQiBYWVogB98ACwADAAoAAwA1YWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAHOY3BydAAAA4QAAAAjd3RwdAAAA6gAAAAUclhZWgAAA7wAAAAUZ1hZWgAAA9AAAAAUYlhZWgAAA%2BQAAAAUclRSQwAAA%2FgAAAgMYWFyZwAADAQAAAAgdmNndAAADCQAAAAwbmRpbgAADFQAAAA%2BY2hhZAAADJQAAAAsbW1vZAAADMAAAAAoYlRSQwAAA%2FgAAAgMZ1RSQwAAA%2FgAAAgMYWFiZwAADAQAAAAgYWFnZwAADAQAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAIgAAAAxockhSAAAAJgAAAahrb0tSAAAAJgAAAahuYk5PAAAAJgAAAahpZAAAAAAAJgAAAahodUhVAAAAJgAAAahjc0NaAAAAJgAAAahkYURLAAAAJgAAAah1a1VBAAAAJgAAAahhcgAAAAAAJgAAAahpdElUAAAAJgAAAahyb1JPAAAAJgAAAahubE5MAAAAJgAAAahoZUlMAAAAJgAAAahlc0VTAAAAJgAAAahmaUZJAAAAJgAAAah6aFRXAAAAJgAAAah2aVZOAAAAJgAAAahza1NLAAAAJgAAAah6aENOAAAAJgAAAahydVJVAAAAJgAAAahmckZSAAAAJgAAAahtcwAAAAAAJgAAAahjYUVTAAAAJgAAAah0aFRIAAAAJgAAAahlc1hMAAAAJgAAAahkZURFAAAAJgAAAahlblVTAAAAJgAAAahwdEJSAAAAJgAAAahwbFBMAAAAJgAAAahlbEdSAAAAJgAAAahzdlNFAAAAJgAAAah0clRSAAAAJgAAAahqYUpQAAAAJgAAAahwdFBUAAAAJgAAAagAVABoAHUAbgBkAGUAcgBiAG8AbAB0ACAARABpAHMAcABsAGEAeQAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNQAAWFlaIAAAAAAAAPMWAAEAAAABFspYWVogAAAAAAAAccAAADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAAAAAAACPyAAAMkAAAvdBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE%2BAUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN%2BA4oDlgOiA64DugPHA9MD4APsA%2FkEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE%2FgUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB%2BUH%2BAgLCB8IMghGCFoIbgiCCJYIqgi%2BCNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC%2FkMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg%2BWD7MPzw%2FsEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW%2BhcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx%2FqIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy%2F%2BMDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl%2FObw5%2BTo2OnQ6sjrvOy07azuqO%2Bg8JzxlPKQ84z0iPWE9oT3gPiA%2BYD6gPuA%2FIT9hP6I%2F4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU%2BTT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV%2BBYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v%2FbFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF%2BAX5ifsJ%2FI3%2BEf%2BWAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn%2BimSKyoswi5aL%2FIxjjMqNMY2Yjf%2BOZo7OjzaPnpAGkG6Q1pE%2FkaiSEZJ6kuOTTZO2lCCUipT0lV%2BVyZY0lp%2BXCpd1l%2BCYTJi4mSSZkJn8mmia1ZtCm6%2BcHJyJnPedZJ3SnkCerp8dn4uf%2BqBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot%2BC4WbjRuUq5wro7urW7LrunvCG8m70VvY%2B%2BCr6Evv%2B%2Fer%2F1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7%2FIPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG%2B0j%2FSwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd%2Bv4DbgveFE4cziU%2BLb42Pj6%2BRz5PzlhOYN5pbnH%2Bep6DLovOlG6dDqW%2Brl63Dr%2B%2ByG7RHtnO4o7rTvQO%2FM8Fjw5fFy8f%2FyjPMZ86f0NPTC9VD13vZt9vv3ivgZ%2BKj5OPnH%2Blf65%2Ft3%2FAf8mP0p%2Fbr%2BS%2F7c%2F23%2F%2F3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnQAAAVYAAAEzAAACewAAAJYAAAAzAAABQAAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAEMcgAABfj%2F%2F%2FMdAAAHugAA%2FXL%2F%2F%2Fud%2F%2F%2F9pAAAA9kAAMBxbW1vZAAAAAAAAAYQAACSJxUpAjbKtUMAAAAAAAAAAAAAAAAAAAAAAP%2FbAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP%2FbAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP%2FAABEIAGQAZAMBIgACEQEDEQH%2FxAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5%2Bjp6vHy8%2FT19vf4%2Bfr%2FxAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4%2BTl5ufo6ery8%2FT19vf4%2Bfr%2F2gAMAwEAAhEDEQA%2FAKMkYLHg%2B1PZWMIQFQ24lRjkcDmrckYXnGM0kFuXcMVba3Qj%2BLmvIwcPa1oxtddfQ4qz5YtlW1sXafaX6ckkZNPkhSS%2BjWNMmNcNWuEWN0HTvnPT6VFZ20m25wdxR2Bbpmvq%2Bay0PNc2xkh2uMdBTLtZJYR5Z%2Bb%2BdWJbSSKR0JV8ddp5FK8Evl4KMpI49fyrJOzuazhokjLNtNjDXCKfTFJJY3k8csguUdo13YJOSB6fSpl0%2B5ceZtJj%2FvYq3HEhxFLKsQKnDNwC3YVaqO5dWFOmlySuzCWV0G0TCCTGGEnKt%2BOOPpUhuAybJAJGTAYqRgk%2BmKraqPLlkjJVihxnsfpSWcZTbvUYYZ298Hv7cVdWq4cqUb37ExV0PmEWOA4PpxVNlAHH%2FwCqrckfzgBsjGR60824Kj5cH1rkr5lSgrJN3%2BRcUNWG3kRWl8vcR%2FF1orUto4vKG4gH0or5p1ZJ6NnWo6Fi7ZY0LuuQBwD0Jz0otbs53E7mY5IA6eg%2BlU7uRLqTETF40Gdx4yT1I%2FlUMU%2FlRnBHXgV9FluDVKjzNe8zkry9o7GnKfPnhnjlPlLkFVwQ2RWrtWCHhY9hzvUNySSBzj6Vg2MkcceVjVM8lR0zW7ZuZosRIpLY4xzjPIFdk00rHMtJK%2BwuTnLneU48zjIz2JquLkPuljxI0ZKrgY2jGcgdhUyMSHZCxMPDAAEEE4P44rBskMGurb79wEhiz6jBFTGN0zpdW2i2LH9q3Any7NuAABJ7elLrG1rcPu3LIdykfqPwqvfRNDMwcZKnFP14xx6TaKrjziThAuDj%2FOKUbJ3Z6GY0qPs4Tpq1%2Bxz0yjzQF%2FSrs0a7omLEhkAII6EDGP5U20hB5YZJ61qC2M1pIirufblQOuQe3615NfNG614bWt%2FwTijTbRTisGDb8nC5IO0HPtntVqJGA%2BY5H0qzprsLfccEgFtwHXg8GmXBd5AIx8rEZ56V5VSrKpJuW5aikrjooJSmVBwe1FbFlFiAAxseeoNFczq6nVGnoctLGLe2yGyW4PvVMuEQu7AIozn0FWbjdI4jC4APT0p0Wnmf5Nvyufyr7DEZjTw0uXc86EWyNpNlu5iJ3AZGec1Xsr%2BeO4B8xpN3ygMc9%2FSrd7Zvankhue1VbWDybrOSNrEAHnt%2Fj%2FKumji6VdLkd7g420Zu6OjfadsgjQAZyW%2B8O%2F0%2F%2FVVKW7hfX7abAEQkUMSc5wcZP%2BelWpoEuI4CzFcE5A79hXMyZLFTnK8H61TcY3lJ2Moq51%2BoTRwGWaZN4jx07nPasi0Vri5N1dDzCxPyMeAPQVDNqUl3CkEijhgS4%2FixntVqz4XHavAzHFO3s6b06%2F5HVD3mr9C1HDgY5YdQT1q%2Fb27mJ3TaNpHfnPtVeAZ4rSsUAZzuCHZ1Ppnn%2BleFKV3qdUI6aDtPLGR0ZQVIJYMOR2%2Fwp11apH8y9G5571p2wjeP14yPVSf4aRYP%2BJgjsG8uNcjPIDcDvWTnqbKGhXhZ44wu3A7fITxRWlI8CuwmRy4PO4nj9aKy5%2FI2UGc5pWhq6CW4zjGTmrVxFFGjhRtjVeW6YFbAJaEngZ4AFQLbIoZZgGU9QelayrSm3KTM%2FYqHuo5RYwhkgl3kv%2B8RJfvBfzrJuSFuwenY8V1%2BoonnOyGMsRwRHkj26%2B9Yt3psrnzFHkgn75U5P0r0cvxSoVFOWxx16d9iv5ymLHoecVjaiqLcLJGAFkySMg9%2BtaFxYARbHkPmKp4A4buOlVpIWliCvGyurDbjG0D0HevdlmGHrU5Rl8jkVNoht48tn3rTtAeOKp2RYTbSOK2ootxr52pI6KcbktspDDNaMaYYYHT1qOwg%2FfEnoBWkkQPPSuKc9Tupw0FhLQhWViBn14%2FLvVu4lVoFYZAYnAx3x0qFBExCMeh3KT0Bq0CrCNl27Qd%2FHr0H5Vi2mdEYtPXYhliDFTcfNJtH8WMe1FZd%2FMHuWIPHSirUGdkaLauLp%2Bq7F2XeWTHBAGQa1FkS6hBRxg9CeK5qWzlgi3uVIHJwelSQOYYJ0kBRnA27hjNNx6oc6MZq6NVZLaxWRg8c1wflUYyBnqfSmJN9oysoznuTWTnD4bqPTmrMMm0jBpO5n9XjGNkiy2nxsPwqtNpoVdqjg1bWbA%2B9UsdwpwGGaSnJHLLDo5%2F7BsPC1ftbU5HFX3eI%2FwAPNNe4VVwoxVuq2iI4ZpkqJHEOSM01pS2R2qqJCzE9RUisD3rJnUqaiPZyBwKL65CRiKE9AMmkLIqc5PXPpjFZV5LuXPVm61pThzM6KNPmZFJKxc4NFVdy96K7uRdjvtY2WP8AaNmHhfY8Zw0fbP8AnoarWMzMywuWK5yAOqEdx71Tsp%2FIkO4HawwSOq%2B9PeB41B4YZ6qc9elc1uhxwXKrdCaQFG%2BVw6%2F3hyP%2FAK1IJMmnxXFxbKEbcE%2FuuvFROyHBCkHnIzx%2BFTY0tcnErY%2B9TkmII5qsRhsHII6g04NzUuJLiWPNb2ppYnvUQYetOzwKmxNrEsbYBzTzL71Xzz0pm8A8kj6UWuHLckupj5TjOCRxj%2FPtWYZ96%2FKelWHbd15GCKrJFGq%2F6wMenz8V2UeWMdTopuMI2IiXzx%2FKipgQABtL%2B4OB%2FKitPaIXtkV11LcObS3%2FADk%2F%2BKq7pmplXkK2sHKDu%2Fr%2FAL1FFdDpx7HluT5dy82qsV2G0tto4%2Fj6en3qrTzokTOtvFwucbnx1A%2FvUUVKpx7DpzlbcqnUiTk20Gfq%2FwD8VQNTOf8Aj1g%2FN%2F8A4qiin7OHY15pdxf7SP8Az6wfm%2F8A8VQdTOP%2BPaD83%2F8AiqKKPZw7IXNLuJ%2FaZ%2F59oPzf%2FwCKpr6jz%2Fx6wfm%2F%2FwAVRRTVOHYOaXcibUc9bWDr6v8A%2FFU0agP%2BfWD%2FAL6k%2FwDiqKKfJHsS5S7kL6nhv%2BPS3%2FOT%2FwCKooop%2Bzj2I5n3P%2F%2FZ" /><h4>Windy as forecasted</h4></div><div class="bookmark__right-side"><q>Weather radar, wind and waves forecast for kiters, surfers, paragliders, pilots, sailors and anyone else. Worldwide animated weather map, with easy to use layers and precise spot forecast. METAR, TAF and NOTAMs for any airport in the World. SYNOP codes from weather stations and buoys. Forecast models ECMWF, GFS, NAM and NEMS</q><div class="bookmark__comment"><p>Great ui to get a feel for the general wind directions</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.windy.com/">Windy as forecasted<br /><small class="text-muted">www.windy.com</small></a></div></div>
</div>
<h2 id="tracking">Tracking</h2>
<p>I am a data nerd and like to see my progress, heatmaps etc. For that, I recommend using a dedicated GPS device, or GPS watch. That’s mainly to save your phone battery. I used to use a Garmin Edge 520 before, but, for a couple of years, I primarily use Wahoo Bolt. Additionally, for shorter rides or runs, I use an Apple watch.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><h4>Strava</h4></div><div class="bookmark__right-side"><q>Strava connects millions of runners, cyclists, hikers, walkers and other active people through the sports they love – all on our mobile app and website.</q><div class="bookmark__comment"><p>Central hub for all (GPS-based) activities - Apple Watch, Garmin/Wahoo tracking</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="strava.com/">Strava<br /><small class="text-muted"></small></a></div></div>
</div>
<p>All of that data will be synced to Strava as my main hub. Strava is still a good app, even very usable with the Free Tier. Currently, I am still paying for the Premium tier, but I will probably stop to renew it in 2024, because of a recent price spike. There is not so much value for me in the Paid tier features, such as using the Route planner (Using Bikerouter), or the Beacon feature (Using Wahoo built-in), weather info, goal tracking, training analysis and more.</p>
<h3 id="challenges--after-ride-analysis">Challenges & After-Ride Analysis</h3>
<p>Because Strava has a relatively open API policy, there are a lot of apps that can connect to it. Most of them will get your rides immediately after uploading them. Some of them will enhance the ride description, such as Weather information, new roads travelled and more.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QCkRXhpZgAASUkqAAgAAAAFABIBAwABAAAAAQAAABoBBQABAAAASgAAABsBBQABAAAAUgAAACgBAwABAAAAAgAAAGmHBAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAAABQAAkAcABAAAADAyMTAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BEDL2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4yLWMwMDAgNzkuMWI2NWE3OWI0LCAyMDIyLzA2LzEzLTIyOjAxOjAxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuNSAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEI4Q0RDMzA1QTAzMTFFREE2NThCOUJGRDIxMEMxNjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEI4Q0RDMzE1QTAzMTFFREE2NThCOUJGRDIxMEMxNjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0QjhDREMyRTVBMDMxMUVEQTY1OEI5QkZEMjEwQzE2OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0QjhDREMyRjVBMDMxMUVEQTY1OEI5QkZEMjEwQzE2OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI%2FPv%2FbAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP%2FbAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP%2FAABEIAGQAZAMBIgACEQEDEQH%2FxAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5%2Bjp6vHy8%2FT19vf4%2Bfr%2FxAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4%2BTl5ufo6ery8%2FT19vf4%2Bfr%2F2gAMAwEAAhEDEQA%2FAPqmisjzXA5a6HUH9z0qZMMgb7aBkZwwAIpKSexTi47mjRVDb%2F0%2FL%2BlVrudreW2RJJpxNJ5ZaJVIiGCdz88Lxj8aG%2BVXYopydkbFFYj3Mq7OLklgxwAh2kdj82BntUf2uZmjUpdIrkAu3ljYOck%2FN0H9al1Ev%2BGZapyf%2FDo17i5WNSSwVR3P9Ky59VROSMD1kcLWRqLmSMObx4nbIVX2ZQA4zwSOev41x18IzIWGoFiT%2FrJApJ%2BgzXh43OaVB2bPWweXxq%2FEz0iDVUfkD5f70b7sVqW9ysighgynuP615BZOi3kafbJhkE%2FaIlUKh7A89%2Ba63QLuSWQLMbqA7cu0gj2H8m608FnFOu7JlYzLVSjzRZ3VFZ0a%2FLj7epx%2Fu%2F41S1y7l07Sp7u3k%2B1yRlcRL3ywXPygnjJPAPSvclNRi5vZHjQg5zUI7vQ3qK83HjPU%2FwDoFsP%2B%2FwB%2F8Zorj%2FtLDfzfg%2F8AI7%2F7Ixf8n4r%2FADOt1PTII7C8c5kDRkbHCkD6cZrycWVtgfuI%2FwDvkV3PhvxrH4tsNajSwls3s4o2Ie4hmDB9%2BMGNmA%2B4eDXHopbAA68e1fS5WlCM7%2BX6nz2NfO42K5s7Yf8ALCP%2FAL5FK9hAjlXto1YdQUHFb%2BmRxWconLxvJGd2Swxx12%2B%2FNZt7I011JM4IMh3DPpXZRxka9VwgtEtzklScI3e5R%2BxW3%2FPCL%2FvkUhsbUhybdNqqWOFHAqyASQB1JxVO6lt5njgluFkiDENCke8O452uwJwp9MckYJwcU8a2qMuXc0wijKqlJ2Rh3QtZZbyOJIdkKK3mAZDDOOw%2FEeoIPesqCzt7m%2BiR9scDsu%2Bby8iNCfvY6n1wOa677O3mtAS4w2WK8CU5%2B83vwPyFUprRnRjEzTsc4dW3Zx6%2FryK%2FJM3lUlV5kj9SyTG06dLkTt%2Fwy%2F4f%2FMx%2F7HhW9kjt5opI1kKpL5PEiZ4O3IIyOcdq25NLt7fTTIPluDiKHaAF3scLnPUfWltrRkuBuG3oCWOPyq5LK1wn2aKM%2BQxUPIXUq4U5woGSckDnjoaeR0sRUxKttfbyuTnOMjUguaV0t%2F66%2Bg5bO2PIgjx2%2BUV1PhuGx0TTp9R1N1sba6aOKGVVG5iCTxweD%2FjXPoCxAAJYnAHqa2m1JvDmj3I1yxS4txPAIYLmaKJFd2cFt7nao%2BX16%2FWv1DHRmsI4U2k%2FM%2FNsJKH1lSqJuPl%2FwTthf6JCWin1C0WRGKt50yq2c%2BhxRXmMnxg0YyM114bHmNzlbm1l3DHXKsf15oryVCR1uaPT5NN0%2Bw0e8bTdPtrISx5cQwLEWx0yAO2TXmMNwsbYkdVCruVe7HJyf5CvWtV3%2FwBj3HmFS%2FlnJUYGa8l2IUCyAnnkcdP8a6KMXOjNLe6%2FUwxGk4%2FMvzXYNu6LI6MoHA4ByOn5YrPZizFmJJPcnNMCqGJA5JySetLXr4PDOhFqW7OCrPneg5cBhkkDuRUMltbk29haum%2BFxIEeZlWMAjdt5OFwcbQOc4%2Bk0p3l7e32fIm95xhjGTtwuM4yQSec9B2qlaTFL8T%2FADuk6%2BTIypkkrvZcKMkY6HPB3g8Yrix1anVWmtun6%2F1%2FwTtwqqUXo7XV%2Fu6P11t326m1bwtAYxKEdiNxKJgc%2FwCfxqOTTo08xyMBU6BgNoBPYf0psd%2FJnc5WOJRsCqSpzjknPX%2BlP1dBdx2iEpuNzCNkjhGYKei568nO3uAelfOTwkKzSlodOGxNSElFPcwiGvXfywBaZKeZuO%2BQD%2B6ew689%2B2OtXYYljUKihVAAAAwAPQVYuI1imaNXEmzgsOn4UzBr6jA5fQwsE4dfxObF5hVxPu9F0%2FrqPgYJPCzHCq6kn0AIrsri%2FwBOaz1u7tra0uoLSxe4MBT92zq0kgyCvUnknHUmuLjZVlQuNyhgWX1GeRXRS3Nvc%2BHfFbWkPlBdLnyPLWPOfNK8KeykD8K3xVNTnG6dvw3W%2FXXoctGbjGVn%2FVmcDH8VY0XCeE9GUHnA4%2F8AZKK4tIdNMMQ%2FtWJcLjD2Z3DvyQDnr1Jor6f%2Bycv%2FAOfX%2FpR8%2FwD2jjP%2Bfn%2FpJ9SXkdwmk3AnkQr5WAgU5H1Ysc15tPYXhmcrY3m0nj%2FR3%2Fwr0aeF49HmLTh1MfyqgXYBnjGAD0q7PbRM77hOfPI3FJmXbt6YwwI%2FDr3r8%2Fw%2BIdCXMj7GrRVXRnl9tp14JomNjckbuQ9u%2BB9eOlQahBJbRPNLb3MMaoWbzYmXLDJIGQAemRXqf9m2%2FHzXnB3c3cp7%2FwC9%2BlVNc0mDWdPWx84okLjcOHP3SNpyfRgea3hjpuspyehl9Uilbc8i1cRvBHNLYhbjbtby5AjccAl%2BAMD1z9O1Fvsa0tEDROyweZLcRsWQscYCBSN7epyFH6V3I%2BG2n7mU3l2bZipNru%2Fcnb0BTOMZ5I6H6VO3gK13M63L72I3ExjoOABgjA6Vy1akZapXfzsvvf8AXnsbz5klGOqXf%2Bn92xxkzzwWpmu%2F39vGrTOCgjYADOBzgjPXJJ9%2BK57RJ%2FEEuqQxT6ZZNM8q%2FbrjyWZ7dHJztfzSuABwAOfTPNetWngqK3Uj7W7sQAS8YOQOx56c9Ksx%2BFlUJm7lwrFgFUKCTxyAefb0rCMnH3lv%2FXkDcnBx5Vd9Vp%2BC0OUj02JOG3ysOcBcAD0NTzvFhVnhjdm5K5O1BjjGenvXSHwviJo47x1DHJzGD%2FWmjwogUZumO3lcxjrnvzzxkfjTnUrVHzSk7nKsNI54pA5w0cezsqLjHHuP8mrqWqt4d8RR2tuPNl0112RruLHY4AAHU5rTbw%2BLZG8y8nYScDZb7sH8M8VraLpwsWkcSM%2FmKMBk2lR%2Fk0Uqk4TTvt0uWsNP7WzueKjw9oyqoXR%2FEPQZ%2FwBDuRz%2FAN%2BqK9wm1WCGeSJkmZkOCVjJHQHr%2BNFd312s%2FwDl9V%2F8DX%2FyJ5%2F9i0%2F5vwRFfXME2mXCRPHvWPJjDKSv1wTV24XdLCcZwT2U4%2FPn8qpXJQ6HMI02AKQV54OeeoBNXLlNuJEj3spLbFVcscdicYNcXQ9pbiySRxyRo7qryEqisQCxxnA9eAT%2BFUtJ%2BabU2%2FvXRPbsqr%2F7LWTdWWo3MzXhtXjvhjyAWR0hAPQfMOTzk%2B%2BOgqP7BrUe37NNPH8oLnbEd8meW6%2Fp0p6WN0opNJ6nTySxxuFd1ViCQCRkgdaypdYS3tb%2B5lAeGG5WJdvXa2wZ9%2BWY%2FQVgXXh3UbuRXvGuJ5EGxZGKAlepzhhzkt%2BGKspot55lt5kU7QRqS8e5MO%2FIycN6H9KE4rpcThBO%2FNc15fEmkRyshvFJCk5VCQenAOME%2Bw5rPHie3ktCyXESzNdBVVkIKxeYPmYHp8mTzis9vDFxvbYkwTquVTj%2FAMepq%2BG73eCYn2BccbMk46%2Fe9f5VKnb7JpyUWtJHawTw3K77eRJU9UII6A%2FyIpLueK0tJri4OyKJS7tjOAK5zSrO50KaSQQXD2kn%2BtX5CVI6OACc8YBH49qsXE%2F9uRqttbNNZxuGcgoQ7jkL97oMg%2FlVW69DCKXNZvRFPxH4imhupbTT%2FLAVQrz9WVj1C9uBjn1%2BlT6Ek03g%2BeOCdopjHOkcpJJjOTg%2BvB5rF%2F4RjUY0CxQEheANyjj%2FAL6rqNAtZ7HRjDOrpKvmHCYZuTwR1GazTk3qdNb2Sp8sDj7Hw14omh3r4mM4zjcLiZce1Fej2yssCB3eRsZLOAGP1AAFFaczOLlRV1Ri2kzsyshKfdbGR%2BVT3SMWjdfLwhyd%2FwDQ44rzq%2F8Aix4Yawkhe5vDIy4LCzcAn6VFefGjwY8LxyT32CP%2BfGQ%2F0r0FlGOkvdoy%2B5mEcZQk9Jr7z0sSDZk7N%2BOmeM%2FXFMjlVi6uYhj%2B62SO%2FPHHGK8nm%2BNfgkyb31HVww6EWsygfgOPzFV1%2BNXgQMSmp6upPLbbaT5j6n3%2FAMKv%2Bw8x%2FwCfEv8AwFm6q03tI9hMp8zgRbM9dxzj6YpXfgCIIxPqcf0NePt8ZPA0xGdV1zjj5Ypl%2Fkakj%2BKvgedljF%2Fq7b2GVMUyh26Ak5HPTv2FS8lzBb0JfczaMVLZ%2FgeuhxtBYKHx0HIz9cUiMfmEioo7YJP9K8qn8f8AhCNfNnvNfjVjtz5txycdgJKhTx94GONuoa5jO7aXucbuucbuuec%2BtR%2FZOO39jL7mdEcFOfwpv5f8E9aaT95gCIp0JLHOPpiglY41SBYto4C%2FdAHtgV5vbfEzwtCjrb6nqYLd5IpJcfTeTUg%2BI%2Fh2WAx3OqX8wPUi3aP%2FANAxSeV4xb0pfczWOU4yXw05fcz0dWBUFwoOOccj88VWlkuZLSdrD7K9x5beTvcmMv2DEDOM4zjmvKb7xT4NutzT3OozSY482W4IPt1OBV3RPiJ4W0qyFtHJPHEGLKiRyPjOCeWAPWsHg8RF%2B9Bo1lk2Lt7tKbf%2BB%2FmegRSa8EUS2mmM%2BBkrcyKM4GePLPfNFcTZ%2FFXw3DDtur28uJNxO%2F7IU4zwMD0orNU5taxsZvJcwTsqMn%2F26%2F8AI9G%2BzR%2Bhpfs6e9FFZWR5tw8hPf8AOjyE9%2FzooosgDyE9%2FwA6Ps6e9FFFkA0WsQ6KB9KX7PH6GiiiyCwfZ4%2FQ0fZo%2FQ0UUWQrIPs0foaPs0foaKKdgsg%2BzR%2BhooooCyP%2F2Q%3D%3D" /><h4>myWindsock - The home of Cycling Weather</h4></div><div class="bookmark__right-side"><q>
We believe you should track key weather metrics, just like you do Speed and Elevation. Connect your Strava to myWindsock, to collect your valuable weather data.
</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://mywindsock.com/">myWindsock - The home of Cycling Weather<br /><small class="text-muted">mywindsock.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD%2FgAIDAAAA%2FmlDQ1BpY2MAAHicY2BgkmAAAiYBBobcvJKiIHcnhYjIKAUGJJCYXFzAgBswMjB8uwYiGRgu6%2BJRhwtwpqQWJwPpD0BcUgS0HGhkCpAtkg5hV4DYSRB2D4hdFBLkDGQvALI10pHYSUjs8pKCEiD7BEh9ckERiH0HyLbJzSlNRribgSc1LzQYSEcAsQxDMUMQgzuDExl%2BwAsQ4Zm%2FiIHB4isDA%2FMEhFjSTAaG7a0MDBK3EGIqQD%2FwtzAwbDtfkFiUCBZiAWKmtDQGhk%2FLGRh4IxkYhC8wMHBFY9qBiAscflUA%2B9WdIR8I0xlyGFKBIp4MeQzJDHpAlhGDAYMhgxkATKVAkTIX%2BBgAAAAJcEhZcwAACxMAAAsTAQCanBgAAADlSURBVHic7dBBDQAgDMDA%2BTcNFtYXIblT0HQOa%2FM64CdmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFFy3DwZ2tPPPBAAAAAElFTkSuQmCC" /><h4>Klimat</h4></div><div class="bookmark__right-side"><q>Automatic weather and air quality tagging for your training log.</q><div class="bookmark__comment"><p>Paid for extra app, that adds weather description comment</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://klimat.app/">Klimat<br /><small class="text-muted">klimat.app</small></a></div></div>
</div>
<p>Additionally, you can use Challenges. These are primarily for motivation, to try out new routes and discover your neighbourhood.
“Wandrer” for example tells you how many per cent of all the roads and paths in a particular country you already have visited. Squadrats and Statshunters tell you about visited “Squares” on a map.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAB4MgIA6AMAAHgyAgDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BEBqGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yMjY0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjEzOTY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K%2F%2BIPrElDQ19QUk9GSUxFAAEBAAAPnGFwcGwCEAAAbW50clJHQiBYWVogB%2BMAAQACAAcAOwAOYWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAASEY3BydAAABjgAAAAjd3RwdAAABlwAAAAUclhZWgAABnAAAAAUZ1hZWgAABoQAAAAUYlhZWgAABpgAAAAUclRSQwAABqwAAAgMYWFyZwAADrgAAAAgdmNndAAADtgAAAAwbmRpbgAADwgAAAA%2BY2hhZAAAD0gAAAAsbW1vZAAAD3QAAAAoYlRSQwAABqwAAAgMZ1RSQwAABqwAAAgMYWFiZwAADrgAAAAgYWFnZwAADrgAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAJgAAAAxockhSAAAAFAAAAdhrb0tSAAAADAAAAexuYk5PAAAAEgAAAfhpZAAAAAAAEgAAAgpodUhVAAAAFAAAAhxjc0NaAAAAFgAAAjBkYURLAAAAHAAAAkZubE5MAAAAFgAAAmJmaUZJAAAAEAAAAnhpdElUAAAAFAAAAohlc0VTAAAAEgAAApxyb1JPAAAAEgAAApxmckNBAAAAFgAAAq5hcgAAAAAAFAAAAsR1a1VBAAAAHAAAAthoZUlMAAAAFgAAAvR6aFRXAAAADAAAAwp2aVZOAAAADgAAAxZza1NLAAAAFgAAAyR6aENOAAAADAAAAwpydVJVAAAAJAAAAzplbkdCAAAAFAAAA15mckZSAAAAFgAAA3JtcwAAAAAAEgAAA4hoaUlOAAAAEgAAA5p0aFRIAAAADAAAA6xjYUVTAAAAGAAAA7hlbkFVAAAAFAAAA15lc1hMAAAAEgAAApxkZURFAAAAEAAAA9BlblVTAAAAEgAAA%2BBwdEJSAAAAGAAAA%2FJwbFBMAAAAEgAABAplbEdSAAAAIgAABBxzdlNFAAAAEAAABD50clRSAAAAFAAABE5wdFBUAAAAFgAABGJqYUpQAAAADAAABHgATABDAEQAIAB1ACAAYgBvAGoAac7st%2BwAIABMAEMARABGAGEAcgBnAGUALQBMAEMARABMAEMARAAgAFcAYQByAG4AYQBTAHoA7QBuAGUAcwAgAEwAQwBEAEIAYQByAGUAdgBuAP0AIABMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG0ASwBsAGUAdQByAGUAbgAtAEwAQwBEAFYA5AByAGkALQBMAEMARABMAEMARAAgAGMAbwBsAG8AcgBpAEwAQwBEACAAYwBvAGwAbwByAEEAQwBMACAAYwBvAHUAbABlAHUAciAPAEwAQwBEACAGRQZEBkgGRgYpBBoEPgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAF5gXRBeIF1QXgBdlfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgD9ACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkAQwBvAGwAbwB1AHIAIABMAEMARABMAEMARAAgAGMAbwB1AGwAZQB1AHIAVwBhAHIAbgBhACAATABDAEQJMAkCCRcJQAkoACAATABDAEQATABDAEQAIA4qDjUATABDAEQAIABlAG4AIABjAG8AbABvAHIARgBhAHIAYgAtAEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEwAQwBEACAAQwBvAGwAbwByAGkAZABvAEsAbwBsAG8AcgAgAEwAQwBEA4gDswPHA8EDyQO8A7cAIAO%2FA7gDzAO9A7cAIABMAEMARABGAOQAcgBnAC0ATABDAEQAUgBlAG4AawBsAGkAIABMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMwqzDpMPwATABDAER0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE5AABYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAAAAAAAACCdgAAPSn%2F%2F%2F%2B8WFlaIAAAAAAAAEw5AAC0uAAACulYWVogAAAAAAAAKCYAAA4fAADIiGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA%2BwEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB%2BgIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA%2BwD%2BQQGBBMEIAQtBDsESARVBGMEcQR%2BBIwEmgSoBLYExATTBOEE8AT%2BBQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe%2FB9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC%2BEL%2BQwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5%2FDpsOtg7SDu4PCQ8lD0EPXg96D5YPsw%2FPD%2BwQCRAmEEMQYRB%2BEJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE%2BUUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF%2FcYGxhAGGUYihivGNUY%2BhkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6%2BHukfEx8%2BH2kflB%2B%2FH%2BogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS%2FHL%2F4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M%2FE0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA%2BID5gPqA%2B4D8hP2E%2Foj%2FiQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU%2FZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV%2BzYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY%2BtkQGSUZOllPWWSZedmPWaSZuhnPWeTZ%2BloP2iWaOxpQ2maafFqSGqfavdrT2una%2F9sV2yvbQhtYG25bhJua27Ebx5veG%2FRcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY%2Bdpt2%2BHdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ%2Bwn8jf4R%2F5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5%2BIBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN%2F45mjs6PNo%2BekAaQbpDWkT%2BRqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5%2F6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS%2B%2F796v%2FXAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8%2B40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1%2BDYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36%2FgNuC94UThzOJT4tvjY%2BPr5HPk%2FOWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx%2F%2FKM8xnzp%2FQ09ML1UPXe9m32%2B%2FeK%2BBn4qPk4%2Bcf6V%2Frn%2B3f8B%2FyY%2FSn9uv5L%2Ftz%2Fbf%2F%2FcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAAClt2Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADYAAK4AAABSAAAAQ8AAALDAAAAmwAAADUAAAFAAAABUQAACMzMAAjMzAAIzMwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF%2BP%2F%2F8x0AAAe6AAD9cv%2F%2F%2B53%2F%2F%2F2kAAAD2QAAwHFtbW9kAAAAAAAABhAAAKAzAAAAANIWbwQAAAAAAAAAAAAAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BgkXxSJVzd6MY%2FMUtlHyE8wZAx%2FFsyM9M4ra1L7VJAo064gimDZJlXcpGDxx74rkfLT%2B4v8A3yKPLT%2B4v%2FfIpRhyq1y6lTnd7Jehvv8A29nCXOkhQqjJRySdoyev97OPbFNP9vmAZudIWYOCSEcqUxzxnOc%2B9YXlp%2FcX%2FvkUhijIw0aEehUVVjO50Cf2wIQTe6a03JIKnaOBjoQeufzFalo8ot0F5JA0%2FO4xZCnnsCSelc2ujwz28LRwwrNtBbKDnuPpxiq93aQI3mQ%2BW6M7IOhxjFFhnZeYn95fzo3rn7w%2FOuS0mW2FuzMVR3PTaB09Djg59avgR3Dx%2BWsbLuJLsCuQOCAep6j8qQG95if3l%2FOjev8AeH51zzEW9z5f2aNLEncsoI4bGSAuO56fjUZzaQz3Mwg2lDK0fAOey9MggYHfpQO2lzpfMT%2B8v50eYn95fzrlrLbc28zSJbLEHPmOsezIIDbhnkdeh%2FTpVqC7s3SNxJbtNjLIhUsMdcD6CgRvmRB1dfzormLye3WchhAZAPnDDBU%2BnTsMUUwM%2BiiimIKMZ4wTnjA60Ugl8q4gwoZmfgM20HHOOATk9gBQBtW92JpliFtcRuBht8X3ByRk9ulVYFtGaZBaGJI5GZ%2FmVVyRx0PJ49PSsjVfE9jpWlSTavdSwG%2FYiB7S3eR1LKTyVDYYKN3sPWm%2FabOJUS1vZL1mXckkh3GQk54OBxyPpUpph1sThQJJGjyEc7gp5x%2BNbMN1bT%2BTFEUZbYDzSVICEjH86zrWxZYED56EKoHLHufYDJNa91aweS4EUXlkYAAxknoPemwRTl33UyQ2katE0u%2BQsMpuwcdxnnnrwRT4%2FO%2Fs9fNjiBADfIueSPqTnPPAFUnvtQk1f%2BzYDdIsZwbkxKy4AzuyepOQK2pV2RRpGhbaVwdvXH1pIqXkU4LuYSuN8HkZKxhbeQc5HUHjpn3qWSMxRsI5SzuQCPKI3c98np9KlKyjGd4bcGLbc4XJIxxxzgEgVLFcoFAdlQ5bPPA789MfjQIrraXc8twyXNqoErDElpuI79dw45oqrLdQ2srpHeuqE7hhw2cj1NFAGbmlpCKKoQtNe3lmAVHiiVuA00JdWOemcjB68%2F8A16he4kEkqfZLrYgyZlC7MeuSw7mm6Os9zMY54dQggQKrxtjbKxJGeWbPv0%2BgpMcXZ6nPah4bt9U3W6xearhpVNn5iYfPzAnOAJAzKeny546Vv21q2kWNp9ukW1SL5YGRm2xhjkAHncMdeAT1Pat%2B9azttPliaWCyZ0MYydpDYz255HpXNXMUtu1zF5KxLNkKbeVFTG1eo2jAyMgHPoOck5qPLqbSmqjStr36%2FwBf1c6NLk6ZZCS6ldpZGwWuH%2BbAXjAx0OCcVGZpTuIZcjGZFJPy%2Bi56DmseTVYYrK6vJ9Q1Bre0QO%2FlQmcr1ydu30HQZP3qg1HVNKWyg1ZdedVvl%2F0eKZ1VJCQMGNDjPT16k1d1uY8rvyvc2NJWax8yWe3neNol3MjBwcMfm%2BZ8jOOwHpjjNX5b%2BOQtGkscV0XBaF5F37Rg5Cgnjv8A0qlpNvKbiQS3nzKRmIwgBwOo68VpJbQwzCZbSCKQDmYKC3pjIGelAitdBPtAubiO8MbDDeVvG3HQkZHH0%2FGrEk%2F2u1crBNsOPmuFMYOehOew%2FwDrVNdq%2FlMkRZTIMF%2BCx%2BgPBP8A9eqaWEsZeZr652KS5jZUIYgDrxx0xxQMyJZZEleO70jz5UODJY2ZaIjGRgk9eaK6hIpURVWRlwOQxBOe%2FaincRzdAMandMSsYBLEDJAA9KVVLMqr1JwKvR2c8SSMsUEu373IYgY5AFMClDM0sEyWh8mcYw0uHXkkZJRsZ4IxmuatY%2FFf%2FCaySm8RdK2EIHZRbqpXCoqL8%2B8NuJYnBAHXOB3lnFDbRkWeJoOMx53sAOBgnnj%2B6enasu6s1vY5ZZ5reV1JEYeFlZFG7PTqenXIHPrUvULJ7m1HAYbZBKiHC5frtzjkgdSP1rIn1aFWMs1rczRHEbKsQby842sxBwufTOR3waoSw3ot4re%2BnjFq4Xd5cjRSHJGDwcAA%2FoKuxR6bDG2mxW815EY8fM6zfIPu53NnGc49%2FwA6LlcrWqKPi7QtO1XSrq2FzPC95H5Aez%2FemQZztPHI7EAgkZGcE1x0fw7jNtp8V7ciEwGWW6W3sdvmozq7pHnOwDaqjHPJyTnNb1x4wgs%2FEWkaHZaPciJgiDY8cRVi5GI4urYMbFjkYH5VtalAl%2FeowtFlnNsCiSOFCJ3GR94kE9enas2k2WuWondXa3%2Fr7v0INKQWKy3NtBLdXEYzKDc7sf3WXkhs85I6EH2ra0e8lvUeVmjkhDKI3PyDJzlSAWGR9c8881naXZ%2F6UzPE6seAGk8wJ8oBIJOfm4x%2FsgD2rbmtoVdSUKNn%2FWZ%2FXnhuverWwqju7sRbq3eQBJopSSAAjgknHABB6%2B%2F51K6MbVI3GXLKDyME55%2FrVK1nhbVJbY206zxjIlERSJ8D%2BFum7k5H%2BFSyNF5wxGC0aNKXkHAyOMk%2BnNMg0FbI5GOeMsORRXMeTpOtKLq5t4b5h%2B7WQPtAUHpx%2BJ%2FGinYQqeX5SNKt2u8kAiEkYAyefWrUJMc0f2EXDlxlgUHIBIz7YqVNOlSNALwiT73lsisuc9uP1xUi751WGVYYPLb55AQW9sd6AKV7qMVu3mRW8jsFJd3DKByB8xUfzxiobq5Z%2Fs09s92kQYebtUiJjycndgY6D2x6gVYurR7ab7TNcDyyCSgYAEY65Izz%2BdUtS1q707wxeatDaJcvbq0kS%2BZsZlyAcnDYABJ9gualuxWlr2Eji1GOU3D%2FAGIzwYmYSW4QEEZ2l87lxuxnB%2BlcB42ub6y%2BIGnatH9pSNmi3IJmgQBCdybVOHLKy%2FMcYHGM4rstF8QDV%2FC0eoSMtnNOk6fuy0sTclfMR9oYggZHHT864L4gzrI3yrJ5Mak7SCxiLABNx6A4zx0GcVyYqpywvFnsZRhI4upFVE1F9rq%2F%2Bav%2FAFsS6Lr9v9sWMiJ1WV%2Fs7kfNHG7YbbnJGQPmycDIPJrpvht4rudZlvDPZwp9mwPNtpjKfnchYyCAAVCdBnhhnnr4p514JIYrV0ErIywoY2dpnOAsShe5zxnpzXvngO0n0xDbW00VzZsm9ZVw25sKGGflPBz16Y96wwc5ys3sejntGjCbhTlaUd1be66P8dOu%2Bx0F7bxiVZhaiRI%2FmkAUEvGc5HvtYA8djVhIJllgayljNpsJkhkjLNJkcEOT8ueOx6VU1R75FhZZkWFOWeIF5HBGD8uMYzirOmC5n0eND%2Fo8u0puVdzIRx0bj8DmvT6ny17r0Hv5XkNkIpTCsNwJU9j7j3%2BtZ8uq2cR2zzWkboFyskwXI3E9D27Uy7t9VZJ4oXiuMRjdNM2x9%2BSCcKuMfd%2FrRZwzzwFr6GOPy2UxiJnbcQDktkDCgEH0OfblklKIXttJMLWXTfs8j%2BbGLiSZ2CsARyGxj6UV1bQW0bEN5MZznBO39M0UXAr3EgsbYy3PluGwMsoDE9gSSABgZznsaitnuLi3knt3jjR9wAOS%2BVONvJx1yMmo9WhS9t5NOtZI1uSA0QdwwjYchgPvAjrxTtKtBp1gINSKO4Zi0qKVicnknGevck9Tk0hmbNpa6oBHO900qNlJ2zGnQcKAcsOOcntxx0j0rQXhLvLfXLSRyNsKyyBTk55%2BcnHI4rollhnhkMFxFKu3KeW6k4A7Y54%2FwqnarcQaldtPexPZbF8uNIwpQdBuY9eMc8UlFblupJq3QlhtfIk3vHLtxtIGGVRjHAAGOPyrmvEtvba5bQ2dvtTT42zdXEUeQuwHK4xjPOM9s9iBXULdwyTeXC%2FmhcM4ikDbeeO%2FesU2Wqmyla0SGOcXTzxJIu8BDzsBAXJLHODxjjPeoqR51ym2Gq%2Bxk6t9Vt%2FXl9xz9j4Jt4Ptb6fOym3j%2FwBG8xQyoTubhsZOPXjr7VuWM8NxbWt6Uis7uNigVHBcORt5zgMCOmAcjae1XY9Ykhtm32tzIwyj%2BVCc71ALYUsT3PHQetcR468TW%2BieFoL2b7VazlIxbiODzfNeNCemeBllBPB4xUKlGn8OxtUxssRFutLXv%2Bfr%2Bf4nb3X24xiQymWNcSJGkADyY5%2B6OfX1659KbcX9wlwlyjbYGQKVFjIr54G4ucg4%2BnrWF8LPFzeLtFurm4uLOS5jnETTWysu5QityjncuCSOeuM4rqb6WBp%2FsETkX08ZZHlieUIozye2cg8ZH8gd07nnJqSujGvrPT7x5HghvjK6bTIYpE5wMHoBn1zTrfSrq3uZ00%2BO3to5IgI3XfNJ%2FCT947cEZ6c8Ct21P2eGKG8kjE%2FR3CmNJCOjAZ47dK5e5mjN4hXTC6iRiskV0hEigkH5geOo4GDimMty6ELpzIJNWlcfLI6XbxhmHU4zxRW3p32SK3ItDPHGWJwgbBPrzRQBiaOFfWQNoURyTk4J%2FeMoTDNk8t85GfQADAzmzcXMi%2BKmt1JCbVb7x5BABXGcY5z0znvRRSGUdQ0qxM4iS1gjhaaA7I4lXBMZyQQM9EA645NP8M2EFvK0MakFo1EknRpMdyB8v5DFFFAixBctp6qlvHHgluWXnqe4rZaZ1QYx2FFFAzP1qGOWCaRkXzIgro2ATnIHOevX9B6V4t8VZ31C0021nI8lYUlUKMFWwBkN16D1x1oornxDaivVfmjtwcVJVbr7E%2F8A0mQ34amfQfFLW9ld3DWcjCB7aVgyMotmdT0yCCTgg9zXrl5q13FbqYXVG8wbm2hi2Qeuc0UVpS%2BE8nCu8DHivpdSCT3qQSzQszxu0KkoQAcjjjn%2BVJFcvYiKCzS3ghYHKRwIoOQM8AdfeiitDpLUOq30caiKfy1IDbVRcAkduKKKKAP%2F2Q%3D%3D" /><h4>Get more out of your Strava activities with heatmap, statistics, badges and more...</h4></div><div class="bookmark__right-side"><q>With StatsHunters you can connect your Strava account and show all your bike-rides and added photos on one map. Show extra statistics about your rides, filter on your gear and more.. </q><div class="bookmark__comment"><p>Free software to calculate biggest squares, heatmaps etc.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.statshunters.com/">Get more out of your Strava activities with heatmap, statistics, badges and more...<br /><small class="text-muted">www.statshunters.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAK6bw%2FpEMlst1dKJC%2FKIegHqfWuZrvdG%2F5BVr%2F1zFa0km9TajFOWo6TTrJ0YNawAHqQgX9R0rg5ggmcREmPcdpPXHavQ7n%2FAI95f90%2FyrzmnW0sVXSVgooorE5wooooAKKKKACiiigAooooAK73Rv8AkFWv%2FXMVwVd7o3%2FIKtf%2BuYrajub0N2WLn%2Fj3l%2F3D%2FKvOq9Fuf%2BPeX%2FcP8q86ordB4joFFFFYnOFFFFAFi2srm5GYIJHHqBx%2BdLcWN1bLungkRf7xHH516AqhFCqAqgYAAwAKCAQQRkHtXR7Fdzp9grbnm1Fa%2FiPT1s7pXhXbDLkgD%2BE9xWRWDVnZnPKLi7MKKmtbeW6mEUCF3PYdvc10dt4ZhEY%2B0zSNJ%2F0zwAPzHNOMHLYqMJS2OWrvdG%2F5BVr%2FANcxXM63o508CWJi8DHHPVT7%2FwCNdNo%2F%2FILtf%2BuYrWkmpNM1oxcZNMsXP%2FHvL%2FuH%2BVcFYWzXl5FApwXPJ9B1P6V3tz%2Fx7y%2F7h%2FlXD6PcLa6nBLJwgOCfQEYz%2BtFXdXHWtdXOytdPtbaMJFCnuzDJP1NVNV0aC6hZoI1inAypUYDex%2FxrVpa1cU1Y2cU1Y82IIODwaK9JyfU0Vl7HzMfq%2FmZd5qyQ6jBZxKHd3VXOeFyf51qVwGnMz6rbMxJYzKST3O4V39XTk5XZdKbndsw%2FFy506M45Eo%2Fka5IAsQACSeABXX%2BLP%2BQYv%2FXUfyNYvhm3E%2BqIzDKxAyfj2%2FU5%2FCsqivOxlVV52Ok0bT1sLUKQDM3Mje%2Fp9BWhRWF4ov2t4Ft4mw8oyxHUL%2F8AX%2Foa3bUEdDahEZ4k1O3a0ktImEkjEZ29Fwc9fXitPR%2F%2BQXa%2F9cxXBV3uj%2F8AILtf%2BuYrOnJyldmVKbnJtli5%2FwCPeX%2FcP8q86r0W5%2F49pf8AcP8AKvOqmt0JxHQ63wpPLLZyJI5ZYyFTPYelbtYXhFf%2BJfK3rKR%2Bg%2FxrcZgilz0UZNaw%2BFG1P4UZ39uad%2Fz8j%2Fvhv8KK4eisfbSMPbyLWmf8hK0%2F67J%2F6EK9Arz%2FAEz%2FAJCVp%2F12T%2F0IV6BV0dmXQ2Zi%2BLP%2BQYv%2FAF1H8jVPwaBm7OORsAP51c8Wf8gxf%2Buo%2FkareDsbLr1yv9aH%2FEB%2FxUdHXF%2BJ3ZtYlVuiKqj6Yz%2FWu0rifEv%2FACGrg%2By%2F%2BginW%2BEdf4TLrvdH%2FwCQXa%2F9cxXBV32j%2FwDILtf%2BuYqKO5nQ3ZPc%2FwDHtL%2FuH%2BVedV6Lc%2F8AHtL%2FALh%2FlXnVFboPEdDs%2FC8ezSUb%2B%2BzN%2BuP6Vc1WQR6bdMTj92wH1IwKfp8P2exgiIwVQA%2FXv%2BtZ3iqcR6Z5eRmVgMew5%2FoPzrX4YGvwwOOopcUVyHEWNNONRtSeglT%2BYr0GvNlYqwZTgg5Br0GxuUvLSOaMjDDkeh7it6L3R00Huil4lgkuNNIhRnZXDbVGSe39aTw7p7WVozSjE0pBYegHQfz%2FADrWpK15VzcxtyLm5hawPEumSXLJc2y73UbXUdSOxFbcE0VxHvhdXTJGVOeRUlEkpKwSipqxw1ro17cPjyWiXu0g2gf1NdnaQi2tYoQ27YoXPTNTUmaUYKJMKagNlXfG6ZxuBFclo%2Bj3D36tcwtHFE2W3D7xHYetdhRRKCk02OUFJpsK47xRdi41DykOUhG3%2FgXf%2Bg%2FCt%2FW9SWwtyFINw4%2BRfT3NcQSWJLEknkk1nVl9kyrz%2Byh6PtGMUVHRWFznuFW9Pv7iwkLQNwfvK3INFFNbhF2Z19veySWnmsqbsZwAcVzOp6vd3ReJmVI84KoMbvrRRW9Rux01W%2BUqWV5PZSb7eQrnqOoP1FdXpOpTXkW6VYwf9kH%2FABooqaTJot7FTVtZubVwkSxc9yCSP1rn5b66luFnedzKvKtnGPp6UUUqjdyardzo9E1W4u8rMIyV43AYJpus6vc2pCQiMbv4iMkf0oorS75TW75LnMTSvNI0krF3bksTyaZRRXMcgUUUUAf%2F2Q%3D%3D" /><h4>Wandrer.earth</h4></div><div class="bookmark__right-side"><q>Wandrer is the outdoor game where you win by going places you've never been before</q><div class="bookmark__comment"><p>Ride ALL roads and paths of your community and track your progress.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://wandrer.earth/">Wandrer.earth<br /><small class="text-muted">wandrer.earth</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACivA49T1LRPFVzq1%2FqOp6gZ7%2B5hsbiw1FLixuG2sY7WWD70ZXAGVGcjr3rNk1o6d4b0PxDbeK9cvPFd%2FHHeeUXZ7O4JkRZLXywNqkbiAByNueOK7lgm9nua%2ByZ9HUV4Tc6zqH%2FCGavjU7pL0eM%2FsyD7S3mJGblR5YOc7cZGOmM1V0zx48nxfF2dbZ7K51STSRpglbakIQJHOF%2B7zKOvXn3pLBTabT2v8AgHsnqfQFFfPGnXV9p3gtfFMXibVjrias9vHp894ZYbpftXl%2BV5Tc5K9xyMZpNE1PVpPHVvDZ3%2BvjUZvEdzDi4us2D2kbsZIwrHl1XsB6Yp%2FUnq1La%2F4D9l5n0RRXzrovjL%2B2%2FiNN5viC6%2Fs%2FXLi60sWcE7I9rFtVYJkHRWZlPI5G73qxHpmp%2FwDCP%2BKZ7LxTqcd5a61JpMCX2rmNJoVeM7FZuFlYZAb%2BXNDwTi7SdtvxD2Vt2fQVFcB8IbxGstW0t5NaF7p91sntdVnS4e2LKCESVc704JBJz1rv65KkOSTiZSVnYKKKKgQUUUUAc5b%2BB%2FDNt4gOtwaJYx6oWL%2FaFjwwY9WA6A%2B%2BM1l654D8E2632s6holnEYwbqeaNWQ%2FId%2B4BSOcjt1%2FGu3qG9t0u7Oe2kClJo2jYMoYYIwcg8Hr0Nae2qLXmf3jcpW0ep5ffX3gWLXpNbv%2FDUsOupIC3m2oWYHy95kxu25C4OfvZxjJpy6hoDeG3sk8OLF4X0y92PvBHQB4mjGQdzSOowTwGySM1v6P8ADzSrWzmh1EfbXkkWQOoMOzamwbdrZGV688%2FTArfl8O6VLHqMclmjR6gVa5Us2JGUABsZ4PA5GDwDS9pN21ZxR%2BtyV5SS%2Fr%2BtjzzS5vAWn6pFqWmeF5G1AsGM0VoHeGR5WjAJLEBi4wCM9Qc4rUuj4QfQbCQaJNcR315NfxW0MDGZZxu82QjcNpHIOD3wM5rrIPDGkQhAlpkoIwC0rsf3cplTJJycOS3P8qbdeFtGudPt7KaxU21u7yRKrupQvndhgc4O45GcHNDq1G7uTLX1m2slf%2Bv0OL8PTaTrd3Z%2BHotGs10C3JubJNrK8eyO3ljbrwczt%2BQ967OfwnoU%2Bn6hYz6XayWl%2FcNdXMTpuEkrYy5z%2FFwORipdM8N6TplylxYWSQzIpRWDMcKVRSOT6RoP%2BA1qyOkUbSSMqIoLMzHAAHUk0KpPua0faRT9o7u5meHPD2k%2BGrE2ehWFvY27MXZIVxub1J6k%2FWtWvN5PjR4Nj1Ga1a8udkbbPtC2zNExzg7SMkj3xjA4zXeaPqljrOnx32lXUN3aSZCSxNuU4ODz7EGqq06sfeqJ69zaUZLWRcooorIkKKydG1%2By1aSSO2MiyIASsi4yD3Fa1JNPVExkpK8QqjrWr6folg97q15BZ2qdZJnCjPoPU%2Bw5rmPiR49tPCFskEUYvNauFJt7QNgAdPMkP8KD8z0HcjyDSfDviD4gayb%2FAFSZruZTgzS%2FLBbD%2B6i9B9BknqfWtOWMVzT67Lq%2F8l5%2Fdc5sXjaeFspXcntFbv8AyXmdrrfxphLtF4a0e4vR0Fzdt9njPuFwXYfgK5e6%2BJPje8bMU%2BmWQPRYLQufzdj%2FACr1Dw%2F8NtF0xFa7Q3845LS8Jn2Uf1zXYWtpbWcey1t4YEH8MaBR%2BlL2kvspL8fz0%2FBHKv7Rra3jSXa3M%2FnfT7j55Hjvx5CQz6tA4%2FuyWEYB%2FLBrW0%2F4weIrNh%2Fa2j2F9EOrWsjQP9cNuU%2FmK9c8L%2BJtJ8U213LpFylxHbTvbSdOqnGev3WHIPcGjVfCuiaopF1p0G8%2F8tI18t%2FzXB%2FOqlOpF2mk%2FVJflZjdLMqWqqxn5OPL%2BK1Mjwl8SPD3iWZLWC4ez1FulneL5cjf7v8AC%2F8AwEmtfxp4dg8V%2BGr3R7qeWCO5C%2FvI%2BqlWDDIPBGQMg9RXlnjb4SusDzaVm9gHzeS4%2Fer7rj734YP1qh4G%2BJN%2F4ZuI9N8Vyy3ekZ2JeyZaa1%2F3%2B7p7%2FeHv2cGpSXJpLt%2Fk%2FwBH%2BJphsw5qio14%2BzqdFun%2FAIX%2Bm%2FzOfk0vX9E1aw8NXek%2BGnuyscdu0srbpxvKB%2FlbPPJII4C5xxXr3wl8I6p4WtNSk1a7i3X83nCxtizQWxyclSxyd2Rnp0HXrW5qWjJqevaFqloLRraGVrmaVeXm%2FdMsWCByo8wt1x0Iq54r1uDw7oVzqNyyBYgAoc4BJP8Ak%2FhW1bFynHla33O2WImlN1bJL8jXorwy7%2BNNlO6tDqaQALgrHbuwJyeeRRXN7Kt%2Fz7l9zOd4yP8AK%2FuMB9Rv5bkyRExqD8qY%2BUfX1PvXY6X8Q9VtI7p7%2BF7txA3kxJtCvKMbQTwVB7k5qOP4fXTtldXl8rH3msZQSfYenvTP%2BFfTGbZDrLySKRv%2FANClwn1Pr7V5sI1YO6Pl6NTH0Jc8Yt69ZRs%2Fx%2FI5zwP4V1Lxd4lur3W5mkndxLe3Hp%2FdROwGOFHQAZr6D0%2ByttOs4rWyhSG3jGFReg%2FxPv3rjvClhc%2BFre5jku%2FtcUzqyJ9klQ78Y44OSQB%2BVdIuoXJUb4VDY5AjlIB%2Buzmu1TlP3p7s9vARjByrVtakt9tF0StdJf16atMnjEsLxk4DKVz9eKyodUnlDMsS7A21WEcp3Y6n7nrkfhStqc4lSPyVyys2fLl4Ax%2Fse9VzI9H6zTte55%2F8BdKuNNt9aM1ysytMqHbGE2yqzl8f7OGXGfU9sV6vXL6ZONMs70Wtsqos8srDZLkkncSTt9%2F5Vqf2hPn%2FAFQ%2F79S%2F%2FE1rXq%2B0qORc8TCUnqaled%2FE7wPFrFpNqOnQgXyAtLGo%2FwBcO%2FH97%2BfT0rrIdUnk3gxKHRtrL5cpx6H7ncYNJJqs6SBHiVQ%2FCOY5cbvQ%2FJ9MetYuzWpxYtYfFUnCp8n1T7rz%2FwCGPIfg%2FwCL38PSz6HrUjDRgPMtLhskW7Z5iPfac5HpyO4wfGHWrHxXNbWFu8lxpttl28tyiySY%2FDIAGB7k1pXvw6uJp5LmTVGd5HLybdPkB5OSQO%2FPao1%2BG5lhLRassvXGbGXGemD6dxVUcRN1ozqaW6%2FLf1PNweMx860IYuC5Fu9Luydm9X1tstzyjUvDmjXtwJbjTGLhQmYpDGMDgcAj86K9Tf4coT%2B%2B1Da46htNlP5HPI96K9X67S%2Fm%2FM%2BieJwj1dvuPUAZbjBRdSjgP8RbDuPYE%2FKPfr6Y61IxjtYR%2B71FUHyqoYEk%2Bg55P%2F6zVq4863iLyXZx0AEQJY9gB3NRw2d08gnuLgebj5V8tSIx6fX1P5V5Fjj5GnZJ3%2BX%2BZXghkL%2BbcJqHmkYChwRGPQc8n1P9KxfG%2Bt%2F2HojvE16l7PmK3Dv37t17Dn64rqXjnRGd7wKqjJYxqAB614H4111%2FEGtSzmRmtYwYoONvyf3sep6%2Fl6VMtEeTnWNWAw9o6Slotvm%2Fl%2FkNj8e%2BIivl2eozOkfyb9saoMcYB25OPYfjW1o178Qdcie70y8MsaEwl1SIYPBI%2Bcj1HavOLdb6xgjgWGO7hiXajRuI3x2yDwT9DXX%2BE%2FiJeaRZ%2FwBmWMNtHIHaQx3UTCQk%2FRsHp2rWVNq7hql13%2B9dPuR4VGrUVRuVWTpLrGXM%2FJtO%2FL84rsdEdP8AigJHZJ2PmcSK3kAPxjs3Bx3FYk3jLxXZzyW11fzxywsY3VRG21lOCPu%2B1a%2F%2FAAtDXf8Anhp3%2Ffpv%2Fiq0fDfhax8aWlxrN5cTwXctw4mjt9ojDcHgEE9CD171k5ORrOs8c1SwFWbn%2FedtPlb8bmV4V8b3%2FwDbsP8AbV7PLaTDyWICoUOflbgDoePoTXrMkYdWSSPUGUjBBYc%2FrXI%2F8Kq0r%2Fn%2Bv%2Fzj%2FwDia6vTba5tESwa9kfyUAjkkjUs6Djk9yOh%2FA96Iprc9nKsPjaEXTxmt9ne79HcijZ4HWKf%2B0SrHEchcc%2F7J56%2Bh7%2FWnywNv8yAahHLxklgVYejDP6jn%2BVXZbSaWNo5bgOjcFTEMGq6C6glSCe7JDcRymMfN%2Fsn%2Fa%2FnVWPUdO2jTt8v8ysbxI%2FluY9Vik7qAXH4FcgiitTybn%2Fn6%2F8AIYoosyvZ1P6S%2FwAyvBYSOwnuLicSYwibwRGPy5J7n8Bx1sfZG%2F5%2Brj%2Fvof4Uf6b%2FANO%2F%2Fj1R3M13BC0jC3OOAo3ZYngAfU09DRKEVsypf2C6gZNPlnuHtmT%2FAEgeZjKnomQM898dh71lf8K78Of8%2Bcn%2FAIESf41vWsN7DGQTbtI53u3zcsf6dh7AVN%2Fpv%2FTv%2FwCPUrLqjCWFoVverU1J%2Bavb7zmJvh%2F4ahieR7OXailj%2FpEnQfjWfqXws8P6novkNDNb3ZjzHcLMxaGTH3gCcde3euu1H7YbVoybf96Vj43fxEA%2FoTVn%2FTf%2BnfH%2FAAKnF8klKO6JpYPDU6inTpJNdkjyr4Y6Bo%2BvaRd2utWJXXdJuWsb4JO4DuvSQDPRhz9c13%2Bj6FaaLNLaaaZ7eCVRNtEpbLDgnnPbbXF%2BGXntPjl4vtIPKUXdhbXbrzt3qAufr8xr0G4%2B1pdWrk24JLR%2Fxdxn%2BaitcRCMZ3irXs%2FvRpLB4ahNTpUlF6bJLf0LP2Rv%2Bfq4%2FwC%2Bh%2FhUF3YyFBJFcTtNEdyAuBn1Xp3HH5HtU%2F8Apv8A07%2F%2BPUf6b%2F07%2FwDj1ZGzjFq1mRwQieFJY7u5KMMj5h%2FhTpbASxsklxcMjcEFh%2FhVdPtdrdbP9HEc5LL97AfqR%2BPJ%2BoPrVr%2FTf%2Bnf%2FwAepEx5WrNMpNDeQHYDd3CjpIsqKSPcEDn6UVd%2F03%2Fp2%2F8AHqKLE%2BzXRstVTf8AearGj8rFGZFH%2B0TjP5Z%2FM0UU2dFTZeqLlFFFMsq3nNxZA9DKf0RqtUUUiI7v%2BuiPLPDPz%2FtB%2BMGbrHp9si%2FQrGf516TqXECHuJY8f99rRRXTit4%2F4V%2BRpiPh%2BX6FqiiiucRX1BBJZyg5BC7lI6gjkEfiKktpDLbxSNgFlDHHuKKKXUhfG%2FQkooopln%2F%2F2Q%3D%3D" /><h4>Squadrats</h4></div><div class="bookmark__right-side"><q>No more boring rides. Turn your activities into thrilling missions!</q><div class="bookmark__comment"><p>The whole Biggest Square game on steroids - With differnt levels of Square sizes and great UI.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://squadrats.com">Squadrats<br /><small class="text-muted">squadrats.com</small></a></div></div>
</div>
<h3 id="maintenance-tracking">Maintenance tracking</h3>
<p>You can also use apps to track the usage of your chain, tires etc. I used to use these more extensively but stopped it some time ago. I just change it regularly anyways.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsSAAALEgHS3X78AAAcT0lEQVR4nO2daWxc1d3%2FP3eb3bN5vIyXxImTOHESICELBAr5V%2F9SGhC8KC1U6tsC7f9R%2B6pSlzdVq0pVhdTSF6U8VYXoItDzpxVpWMKSFpoESELAWRxiSJwYO7Fje%2BwZzz537p3nhXMO1%2BNxFoiDW%2FkrIU%2FuzD33nPM757d%2Bz0UBqFQq%2Fw18K5PJmKqqGlxDVCoVDMNgamoKVVWpq6ujVCqRy%2BUwDIN0Ok0kEkFVVRRFQVEUVFUln89TLBbxer1kMhlCoZBsT1GUGe2rqgqAaZr4%2FX4KhQKWZWGaJl6vF5fLRTabRdM0XC4Xtm3LPsRiMSYnJymVSoTDYSzLwufzUSqVME2TXC4357M%2FC2zbrgQCAaVQKBCPx%2F8rmUz%2Bz89%2B9rMx%2FZq0fhlomsaJEyfw%2B%2F2oqkoul6NcLtPW1sapU6dYv349J06coK2tjTNnztDe3k42myUWi9HT00MkEiESiWDbds32FUWhVCqxZ88ebrnlFt566y06OzsxTZNSqUQ8HmdsbIzJyUnq6uqoq6tjamoKn89HNBplfHyc4eFhli5dyqFDh7j99tvp7e1FURSi0SjhcJhKpXI9pgr1ejzEtm10XScQCJBIJAgGg%2Bi6jm3btLe3Mzk5SSKRIJFI4HK5OHbsGC6Xi6amJizLwu%2F3o%2Bv6JSdFVVV0XefgwYP4fD65G30%2BH8ePH6exsXF6hQO9H3yA1%2BvFNE3S6TQNDQ20xONUKhV8Ph9Hjx6lXC6jqio%2Bnw9N067HNAFwXXaIoiiEQiEqlQqbN29mamoKRVGkirAsi%2Fvuu49z587R1NTE5OQkAANnz7Jy5UpyuRyFQgFVVWsKxbZtFEVh48aNlMtlgsEgiUSCUqnE2rVrCYfDNDY2Yts2TU1NtLa1oes6o6Oj%2BP1%2B8vk84UgEXdfZuHHj9MToOrlcjnQ6jWma10xVXQ7zKhChc4vFIitWrEDTNCzLwuv10traimma2JUK%2BsXrS5YsoVKp0NLSQqVSobW1FZie8HK5LCfeCUVRpB1paGhAVVVs2yYYDFKpVKRqtCyLjo4ObNumpaUFVVVpbGzEsiw8Hg8%2Bnw%2BAUCgk22xoaLjks%2BcD8yoQMTCfz4eiKJimSblcxu%2F3UyqVcLtccFH%2FezweYNow67pOsViUu6K6PfEZPhG6bdvSxjh%2FU6lU5CIoFovYti0Nv8fjoVQqUalUZtmn6ueItuZbKPO%2BQwzD4MKFC%2Fzyl7%2Fk4YcfZvXq1bz11lvs3r2bVatWcfvtt%2FPHP%2F6R7u5u7rzzTn73u9%2FR3NzMt771LTmZ1ZPvVFvOCau%2BBtO7KxAI0NPTw%2FPPP88999yDZVm8%2BOKL3HrrrezYsYNsNivvE8%2BoNfHXY4fMu1G3LIuGhgYCgQAXLlyQ17%2F%2F%2Fe%2BTSCT4%2Fe9%2Fz3333Ydt2zz55JM89NBDqKrKyy%2B%2FjMfjwePx4Ha7cblcGIZx1atUrPzjx48zMjLCqlWr2LdvH48%2B%2BihHjhyR3p9wGq6XrZgL866yRCzR1dUlB7tt2zb27NnDli1b6Ozs5Nlnn2VsbAyfz0dLSwvt7e289tpr%2BP1%2Bstks%2Ff39xGIxduzYgWEYM3bNpVCpVKSHtH37djZu3MgTTzxBoVCgtbWVQCDA888%2Fz0cffcSOHTuk%2Ffk8hTKvO8S54rLZLIZhMDg4yN%2F%2B9jeefvppKpUKjY2NNDc309nZyZe%2F%2FGV%2B85vfcPr0aZYtXcqRI0cAWLJkCR6Ph7GxMVwu11X3AaZ3yNGjR4nFYixfvpzHH38cmF4c5XJZBq6fN%2BZ9h2iahmma3H%2F%2F%2FTQ0NPDMM8%2Bwdu1afvCDH5BOp0kmk3R3d9PV1YVhGNi2TTwep7W1lWQyiWVZuN1uyuUyLpeLYrF4Vc9XVZVSqcQdd9zBwYMHuemmmwiHw%2Bzfv5%2BbbroJRVEoFAp4vd45A8%2FriXmPQ8SEiJjjwQcfRNc%2FeWypVGLdunXk83lKpRKbNm3Ctm3y%2Bbz0zkRgKbyhK1UpYoeapommaWzfvh3TNMnn89x2222USiVp9C3L%2BtzVFVwHgYhJKZfL8lqhUJjhVhaLRZnLSqfT0suptWKvxv10%2FrZcLsu2gRnPsSzrqtueL9QUyNXmbS4VHzjbcw7YGXWLz8II10ogVrd1JX10tiHsQy3XuXrctb6rNcbLtTdXny6ZAqruULWPX%2B3f11o9tSbQCdu2pboR%2F4nfOL%2BrbrPWcy6FT7uynX0S%2FagVbH7a9udaXLUwY4coioLb5aLiuNGyLFwul1Q5TqEIg23b9gxX1LmaRfzgHKhzElRVlQa7XC5TKpXmTI9omiaTiKJ90YZQS4ZhYJomwKwclHMy%2FH6%2FvLfW95ZlSZdZpE5q5bRE33RdR1EUDMOQ9xiGQblcxrIs%2BVnM1RUJRNd1JpJJDh44wJo1azh%2B%2FDirVqygVC4TjUbp6%2BtDVVXa2towDIP%2B%2Fn5cLhcbN26UeSrnlnS73QwNDZFMJgmFQjJJ6PV68fv9BINBhoeHWbFiBUeOHCEcDtPa2kqpVJolWBEj7N27l3A4jM%2FnIxAIkEwmSSQSGIZBPp%2BnsbGR0dFRNm%2FejNfrnbVQLMuirq6OY0eOsHf%2FfhkfZbNZOjs76evrY9u2bfz1r38lHo%2BTy%2BVQVZWvfe1rNW2MyEZks1neeecdGhsb0TSN8fFxmpqa5NiTyaScK6eGuKRAVFWFSoWpqSk0TSMcDhMMh9m5cyfd3d3EYjFM02RychLbtslkMjLvJDwVAeEZjY6Okkwmee%2B99%2Bju7sbn8zExMcE777xDe3s7w8PDxONxBgcHmZqaYunSpVIg1SuxVCoxODiIoigcPnyY5uZmNE1jbGyMrVu3kslkCAaD9Pb2UiwWqauro1wuz7I%2FAGXbZnx8nPb2dl588UUsy%2BJLX%2FoSzz33HKlUihMnTkjPTmR8VVWdtbrFzi2VSvT19VEulykUCixdupTx8XF6e3u5%2B%2B67ZYnhcq71DIEI9RQKhZiamiIej5NIJLj55pvl9m1tbeXs2bPk83k6Ozs5ffp0zS0odHAkEsGyLLZs2YJpmrS0tKAoCrfddhu5XI66ujoGBgZob2%2BvaUuq21y7di3d3d34%2FX40TSOXy9HW1ib7LVItxWJxTl1t27b8bTAYZPv27bJK%2BcgjjzAwMMD27dt54IEHePnll%2Bnp6cE0Tdxu95ztKYrCpk2b8Pv95HI5JicnaWhooKuri0wmg9%2FvJ51OXzbLoMDMEq5hGEa5XMbtdsut5Xa7ZUlU0zTZARFjiICt1oMMw5D6tVwuS%2FXjLPpUbBt7uiNzBn7O%2B2zbxuVyoaqq7FOxWJRFL7GwLiUUwzAolUr4%2Ff4Zz3DaEJiOkzRNQ9M0CoXCJZOOojwsxup2u2UpWMyBiIsqlcqVlXDFFhcTI%2FSr%2BFwr%2ByoGXu2eCjXjHIj43VwZ27liAXFdGNZ8Pi%2BvC0fA6RBU98m2bSzHM0uWha6pJNMpKhWgAqqiYFVsNEUFRaGCjaZolC0L62K1UUBTVVTHWETE73xmLpdDUZQZQe3l3ORZAqn%2BcfXnWt9fKgUu0ifVz7gULvd9rf5V%2F61eAF7Dhea%2BujzY3B2AQiGPXWPh1OqPU6VfbmwzBFLth8%2Fqh2NlO3fC9SIACFyJwJx9cus6w5kp9hw%2FhdfQkWbqUs3UGJKqKpQsi4jbw%2F9dtnLOTMKV9kvsGKfwZgjEMIzPPZdzrSHcUkVVyJSKlCufLYFYsiw8mo6hG%2FAZssMiBnK5XHLOVVWdKZC52BVCB89FMljoMC2L1kg9%2F%2B%2FWO69Zm7ZloV7j6oWiKDMF4sx2Ct0rIlZBGAAWRN3gaiAMvnUN0%2BvaPM1BzeSi2BFz%2Bd3OSNppUyzLmlGluxyqUxfV32maJhdBrTbFb5x5MWd7wpiKe8UkqopS0yBfa1Q7QVeShKzpZQlhmKbJK6%2B8wocffohpmjQ1NbF9%2B3Y6OjpmUWMURZHMEeGeiu9FDKHruowdhP6ET3JFwsDpuo7L5ZL6v7pNVVWlvXMuDo%2FHI3x8SRsV95ZKJalybcdEzadQRNtiDE5vay7BzFqeQhjDw8P88Ic%2F5LnnnuPUqVMMDAywf%2F9%2BfvKTn7B79%2B4ZCT4xif%2F617%2FYuXMniqLgcrlk1OzxeHC5XBQKBc6ePSs7uGfPHoaGhqQAxG91XefVV19FURTeeOMN%2Fv73v89o0%2BVykUqlOHToEC6XSyYwT548iWEYuFwuNE3jtdde46WXXgKm82riu%2BtBaBDq3jAMent7eeGFF9B1XWqRuTBrh4hV9fjjj5PJZGhsbJSrUETdf%2FnLX4jH49x4440zuFOvv%2F46a9as4ZVXXuHkyZNs3ryZfXv3snbdOpLJJP5AAAV4%2B%2B23sW2bkZERuQv9fj9jY2O0trZSyOd54803ueuuu9i9ezeapjE1NUWlMs3xWrNmDYcPH%2BbAgQPk83mSyeR0%2B36%2FrMM%2F%2BOCDvPrqq%2Fh8Ppk3syyLtrY27r333hlZ4vmCM7MciUSu6J5ZuSxFUdi3bx%2Fnz5%2BnpaWFcrnMHXfcQTQa5eTJk%2FT19VFXV8fLL7%2FMjTfeOGNQmzdv5vixY5w%2BfZqmpib%2B9Kc%2Fkc%2FnyebzLFu6FI%2FbzT%2F%2F%2BU9s2yaXy9HZ2cmpU6fIZrP4fD727d3LuvXr8Xg8tLe3A9P63%2B12MzAwQFNTE4cPH%2BbMmTMMDg6ycuVK9u%2Ffz9TUFIlEgnXr1nHu3Dnsi6XibDbLww8%2FzPvvv8%2FZs2dxuVycOHGCe%2B%2B997o6JpfL0Tkxqx4C0N%2FfL%2FMwsViMrq4uXnjhBUkE8Pl8DA8PUywWZc7IMAxisRhfvvtujhw5gmmaPPHEE%2Bzdu5ebb76ZQ4cOEYvFZPIuFosRDAbJZrN8%2BOGHbNq0iWXLlrFy5Ur6%2B%2FtluuaRRx4hGo1y%2Fvx5BgcHeeCBBzh48CBf%2BcpXGBkZYdmyZSQSCQDJUhd84e9973usXLmSQCDAjh07OHz4MG1tbddyri8JoZqy2SzJZPKK7pmRXMzn86bX6zWefvpp9u3bRzQapVAo0N7ezrp16xgaGqKnpwePx0OxWOSxxx6TghMJOIBcLie5sp8FziLRp0W5XJ5BqgBkAWs%2BIYQhyhOlUolgMCifXalUKm63W7Esi1gs9l%2FJZPJ%2Ffv7zn4%2FNSp0AtLe3Y5omlmXR2trKmjVrmJycZPXq1fT09FAsFmlqapKeGEzHJv39%2FSiKMmMVmqYpK4aqqnLu3DnyuRwdy5YxNjrKxOSkJFkPDQ1RH42Sy%2Bdxu92SdG2apkwqnjlzho6ODgqFAolEgsbGRoaGhuju7mZoaAjbtjEMg8bGRlkUEoeEBJyu8nzZENGuqIaKuapVm3GiZqT%2BhS98gRdeeIF8Ps%2BFCxfQdZ36%2Bnp27dqFy%2BVidHSUb37zmwAzAsfz589TX1%2FPiRMnyOVy8hwIwMcff8y2bdsIBAL09%2Ffj8Xrl6h0fH6dcLlNfXy%2FVpaZpNDc38%2F7775NMJonH43R3d5NKpRgcHKS9tZULo6OUSiVGRkZYt24dZ86cwefzMTAwQFdXF4ODg6xdu5ZQKDTLgF%2BPFJGzDC6eebk4ZJZlE%2FbgO9%2F5DrZtk0gk%2BOCDD3jzzTeZmJhgbGyM%2B%2B%2B7j61bt8pDLTDtLkfDYYZHRrgwMoLH42F0dJRiscjExISk3eTzeUzTZHx8XNqGYrFIJBJhaGiIYDAonYtSqUR%2Ff7%2Bko8In6iZfLFIqFIhGIuiaRjqdRtM0li9fzsaNGxkaHMQwDAKBwOeW7qkuK1R%2FrnkPfGJDisWiqaqqIcgJqVSKl156iQ8%2F%2FJBSqURzczPbt29n%2Ffr18tyEk4CQSqUwDEMGbcJd9Xq9UodOTU1hmqaMH1KplCwXj4%2BP4%2Ff7JUHA7%2FczMTEhnQnx%2B7q6umluF%2BDzekmn09TX18t6vSDAicEvBM5uNWzbvrwNgZlFp1AoxDe%2B8Y1ZjYlouHoLRqNR%2BdmyLFRVldfEpIoDlOJZTU1N8nNzc%2FOsvtTX18%2B41tDQACCzAhcHJHW1KFKJ4FOwWxaSMC6FOYlyqqpSKBSAT2xLNe3GKQxN0%2Bjt7SWfz7N%2B%2FXrJAhErWwiwXC6Ty%2BU4f%2F48nZ2d%2BP1%2BMpkMZqmE2%2BORdJnx8XHq6%2BtxuVz09fVhGAYrVqxAVVUGBwcxTZPly5dL50PAmRStvvbvIJQ5K4ZCDVUXVZzCcKqrXC5HJpNhw4YN9PT0EAqF6O%2Fvlx5OsViUqxqmdeXk5CSxWIy2tjbeevtt6urq8Ljd5ItFioUCS5Ys4dSpU4RCIYrFIh%2F19RGMRChd9PKcfa4eQ61x%2FTtgzmxvrc9z%2FUYcGXO5XHz00Ufouk4ikWDZsmWEQiFSqRTpdJpoNCp3nqZpjF88XuB2u4lGoyxZsmSaYlSp0NjQIG1NJBKRJOlYLEYikSAQCFzjqVgY%2BMxka7FLbNvmhhtumMF0FAyReDwumRfwiUr0eDw0NDTg8XjYunUriqIQv3g8WaTe165dKz054WKLQNTp5f2n4DMLxOlrC69GGFYRCInvhMsqUvwi4ecM2pw0HHGvk8YqrjsZHP9JuKbHEa6EDSI%2Bz5Vwm4vxcqm2%2Fh1xxTSgq4XTwP%2BnqY%2F5hJPY4Lx2zVRWpVIhm83%2Bx6mQ%2BYI4uVUsFuVuMU3z2qosEYwt4vIQfADdkc2ec4dUF%2BWFrhfbq1bhXlAmF3fIlUHMn%2BHgZem6PlsgThVkWZasd4vvqhkntYz1Ii4PJ1PGeW3OSN3JIkkmk5imSTgcltQgcVCzOqclTlUBMqnn%2FCtcV2c63Oky1%2BrHXL%2BZq%2B%2FOfwuWi5P9Ur3D5xOSOanMJINfsZflpOz09PSwc%2BdOhoeHsSyLUCjEli1b%2BPrXvy4rhWJwYhc5XyQjgkTxF5iRQhGCcdqeWsfMnHSgS3G5isUibrdbClIkFZ0pG1HwupLaxGeBVEmGQTKZJJPJ0N7eXvMwkhOzRiYoPXv27OGxxx5jdHQUj8eD92JBadeuXfziF7%2BQD3MO6le%2F%2BhVPPfUUiUSCs2fPomkaiUQCTdMYGRnh9OnTMpU%2FMjLCH%2F7wB44fP87g4CCZTIZ0Oo2qqkxMTPDTn%2F4UgCeffJJf%2F%2FrXnDt3jgsXLsgt3tfXJ9%2FGkEqlKBaLvP%2F%2B%2B%2FLYHMBvf%2FtbHv%2FNb%2Bjt7aVQKPDxxx%2BTy%2BVmJDvnE2JBXLhwgRMnTshrl8KsEq7H42F8fJxnnnmG5uZmyuUygUCA%2Bvp6Pv74Y1pbW%2Bnt7WXnzp3cf%2F%2F9M1ZsKBQiEAiwa9cuUqmU5GG1tbXR2tpKXV0do6OjvP7662QyGQKBACdPnmRiYoJSqcTJkyeJx%2BOEQiF5%2FuPs2bOoqsqzzz5LNBrlzOnTfOHOOzl8%2BDDFYpGnnnqKYrHI0NAQK1as4B%2F%2F%2BAeVSoUf%2F%2FjHnD59mu41a%2Fjzn%2F%2BMoig0Njbi8Xh49NFH5XivhxOiadoVe6AzdoiQ3ttvvy11diQS4Z577qG9vZ1bb72VXC5HNBrl4MGDANKzsm0bj8fDyZMnGRgYwDRN%2BX7D1atXT7%2BfyutlcnKSoaEh8vm8fEPQwMAAq1atQtM0Vq9eLdsCJMHC5XKRz%2BeJt7ayb98%2BMpkMPq%2BXQqEg2ysUCtOeysWcWTgc5lsPP8zdd9%2FNli1b5ORcLwhha5o2i2gxF2rSgMbGxmQD%2BXyecrlMKpViYGBAFn%2BSyaR8CVihUMAwDO666y4eeugh3njjDXw%2BH7fccgupVIpQKERifByP18s9F99P5fF45MndiYkJwuEwd955Jx6PR57FA%2Fj2t78tD1smxsdpbGpiYmKCSCRCMpkkHA5LKqqwHyLP9aMf%2FQiArVu34vF45Pseq8c7X3AGfJezHQI1xSaqe6IMu3fvXpYvX87%2F2b6d%2F%2F%2Fcc%2Bi6jtvtlpRMMWGxWAyAL37xiwAzKoT1F78DZpzr0zRNVgHFtq6rq5P3C69M0zQaL9ZARBVSsAGd3Flxll1cF2rYtm3q6%2BtlMnO%2Bi1Zi7kzTpKuri66uLpkBh6vMZa1bt47du3dL70mcmD0%2FPIzL5WJqaooNGzag67qkkiqKwsGDBwkGgzQ0NKBpGoFAgHQ6jdfrJZ%2FPEwqF%2BPDkSXKFAqtWreLChQuk02laW1s5fvw4GzZsIJvNMjw8TEtLC8PDw0TDYZYuW0Y2myWbzVKpVAiHwxw%2BfJiNGzei6zp9fX3ouk46nWbTpk0cO3YMmCaorV%2B%2FnlOnTrFkyRIikYhM2V%2BPeEkIvNZpgbkw65y6aZqsX7%2BeDRs28N5772GaJrt27cLn8zE1NSVX11e%2F%2BlV5nzPSzOdyHDt2TLq0sViMXC7HmTNnuOeee7CZVomKorB06VJ5hHhycpLz588TDAblsex8Ps%2FH2SxLOjrYv38%2F6XSaNWvW0NTUJNnsx48f54MPPmDTpk0UCgXJaAnW1TE5OcmRI0cYHByko6NjFvvj88KlBFMzDgH47ne%2FyxNPPMG7774rYwFFUSQdtKmpSQaHMK0ufH4%2FqWSSumCQxliMdCYjVUhraysej4e2tjZpQ8Lh8DR9R1FoaWkhnU6zbNkyUqkUbrdbHlkQxrqjo0Oqs3g8TrFYpLm5WcYaguTQ0tLC6tWrGR4e5ty5c6xatUoe7b6eqCX8yy2EmjQg52Gd%2FtOn6bsYO7S0tMjXaFRHnbquS%2BYHfELhFOfYhT0QSTXhxQmBOvWr87COqDqKZ4izJc7ninsE%2Fd%2BZfxNtCr7vQsm1XRUNSLwQQFEUlnd2sryzc8ZvnGkTmFnJE9RRMVGapk27qD4f%2BYsU0cnJSWnsp6amMAwD70UXVmQJ0uk0dXV1Ujiib8JQut1ucrkcuq5L7pemaaSmpqi7SI7TdZ18Pi%2BzBf8O7JM5s72i8yLqFVBVdZZRVFWVYrHIwMAAbrebbDZLJBJheHhYkuM2b97MgQMHJOUzGo3idrtJJBLyJcqJsTHS2SzhcJiBgQFuv%2F12isUiiUSCkZERtm3bxsGDB4lEInR0dPDuu%2B%2FS0dHB0NAQ8XicQCDA0aNHMTQNq1JhzZo1HD16lLvuuuu6q6tPi1mpE2H4nMlCIYRqCpBTZSmKIqlA586dI5FIMDU1RSqVkkcLotEohmEQufha73K5zJIlS8jlctOvcF29GsMwCIVCZDIZyuUyAwMDHDhwQNqxTCbDyMiItEsZx04SNNjOlSspFAocOnRoRtwhxreQMWf4eClDVP1vEVmHQyHKlsXmzZvRdZ1wOIwKqBfVV0tLC7ZtMzk5KV%2FFNDY2RiwWk4TopqYmwuEwN9xwA4FAgEAgwPr16wldbHtddzepdJp8Pk9dMEg8Hqe%2Fv59IJIJhGNx0000Eg0FJyqt%2BS9FCR02j%2Fmkbc%2BZrnLq6UqlIA129A53CFVQhp1F3phyc50Wcnp%2BzNiMMevVh0YW2M67YqF8tnBMr3qNenfMXk%2BZ8EWZ1G%2BIeUUtxMuCdCcwrXe1z9WWh45qxTsTnq1F1l7suvvu0CcGFtiucmDcakNMjW%2Bgu5UKFc86uHeukUqGQz9d6ic4iakAEyuJ%2FoQHXiAYka9Wahv8%2FlAA9L7Bt9IsvPBA7xDCMa6eyFsJ70%2F%2BdIBgm1fN2Tamki7hyzGXUrwkZd1EY1w6L7OgFhkWBLDAsCmSBYVEgCwyLAllgWBTIAsOiQBYYFgWywLAokAWGRYEsMCwKZIFhUSALDIsCWWBYFMgCw6JAFhgWBbLAsCiQBYZFgSwwLApkgWFRIAsMiwJZYFgUyALDokAWGBYFssCwKJAFhkWBLDAsCmSB4X8BRqs5KUWzUh4AAAAASUVORK5CYII%3D" /><h4>ProBikeGarage - Bicycle maintenance tracker app</h4></div><div class="bookmark__right-side"><div class="bookmark__comment"><p>(paid app) Tracking maintenance of bike components semi automatically (by connecting strava for distance). Has information about common components and the intervals.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.probikegarage.com">ProBikeGarage - Bicycle maintenance tracker app<br /><small class="text-muted">www.probikegarage.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKK9X%2BHHh3wDqfh0TeJNaNvqXmMGiCN8q9ulAHlFFfQH%2FCGfCn%2FoYW%2FwC%2BXo%2F4Qz4U4%2F5GFv8Avl6BHhtjpN%2FfwTTWdrLNFD99kGQtUiCDgjBHavvL4X6No2neFPI0RY5rDyiY5SnMg55Oea8a17wn8PrnXtRm17U%2FsV68pJiVWx%2BnFAz5xor6A%2F4Qz4U%2F9DC3%2FfL0f8Ib8KByfELY%2FwB16BXPn%2BitfxVbabaa5cQ6LdG6sVP7uUqRn86yKBhRRRQAUUUUAaf9hamOtnMPqprPljaGQo%2FDDqK%2BnNbdk0i8ZDtYRMQfSvma8YvdzMxyxc5P40ARZPrSqTuHJ602tDQ9Nk1XUY7WEhXbJyfagD7c%2BCH%2FACTyw%2F69T%2FWvlX448eO7r8f519QfCe8TS%2FCNvYzAmSKAoSBkZ5r52%2BNehzza%2Fc6orL5JzxnmgDyfJ9afDG80qxxgl2OAPWo6taW7R6jbuhKsHGCKALP9g6n%2FAM%2Bc3%2FfJo%2FsHU%2F8Anzm%2F74NfSdqxNnCzHJ2An8q427%2BJOkWtzJBItxuQ4OEoA8dfRNSRSzWc%2BPZDVGaGWE4mieM%2BjqRXuumfEXRb%2B7jtw00ckhwpZMDP1rV8WeHrLW9OmFxCpnVCY5AOQccUAfONFTXkDWt1LA%2F3o2Kn8KKAPpfXv%2BQLe%2F8AXJq%2BZ7n%2FAI%2BZf98%2Fzr6Y17%2FkC3v%2FAFyavme5%2FwCPmX%2FfP86AIq0%2FDmpjSNUjuym8KCMfWsyigD65%2BHmryX3hOLUkms4hLGT5cjYYe1eM%2FFTxSJ7uew2Izd3TpVr4VQ3o8LauZEm8p1%2F0fd0PB%2B7XluqQ3cN4636yrNnkSdaAKlWNP%2F4%2FoP8AfFV6saf%2FAMf0H%2B%2BKAPp205soR6xr%2FKvKtU%2BGWpXd%2FNOlzbhXbIBJz%2FKvVbT%2FAI8of%2Bua%2FwAq8h1T4ka3aanNAq2vlo%2BP9WScfnQBf0P4YT29%2FFNf3KFI2DgRnqQc16RrN%2FBpunz3F1KkaqhI3HGTjoKj8ParDrOlQXsPSRcle6n0NeRfFm31O31lmuZ5JLGU7olBO1fY%2B9AHGapci81G5uQCBLIXwfeiqtFAH0FqPi3w7dWFxbrrFupkQqDgnH6V4LfqiXswilWVNxw6jAPNV6KACiiloA%2BpfhVqtha%2FDfTopLq1RjGQUkTcw5PevD%2Fi19mPicyWkyyq6biV6ZzXoHwu0bw%2Bvh1t%2FiFFurmIzyQNGf3arnJz7V5Z45sdPstY3aRqY1K1nXzFm2FO%2FTBoA5yrelCNtStxNMsMe8bpGGQo9aqUUAfQ0HjPw4kCR%2F2vBlVC5w3p9K8O8TiD%2B2rhrS5S5iZsiRBgGsqigD0b4VeIbXSUuotSv44IGIKo4J5x29K63xTrHhXxBpMlpPq9urfeR8HKt27V4ZRQBPeQpBcyRxTLOinAkUYDe9FQUUAKAScDk1N9kueP9Hm56fIaiRijhl6g5Fd54V1%2FU7nTtXaa6Zjb24aLIHynOKAOFlikiOJY3Qn%2B8pFR11Gh3UviDxPZRaw32lCWBDcA%2FKfT6VsTaVbPBcvdWFhbWkeczW8xdlPYYoA4a2up7YsYJWQspU4PUHqKgrpPCWnQy%2BZe3ts1zaowiKAEnLd%2BPSpToCf8JLPbuGS2RGnQEcsgPSgDlqK3rvUrCSOeCLR4IyAQkiltw9zWponh%2B31bw7ZvmKCU3TJLMzYYrjoPWgDjaK6dY7O48UW1oLBYYEJVlOQZMDqfypdDtLKTxVJDc26tagN8nOBxQBy9Fdpp2g2r6s08aC50uW3lkjJ%2FhIHG70OaoWNvaafosd9c2qXkszhVSTIRQfcd6AOaorshp%2F2wCWLSbRV6YjkLDNFAHHE5JOMVo6Tq0umwXsUUcbrdRiNt%2FYe1ZtFAF7R9Rk0vUor2FEeSPOFfpyCP61NYaxJaC6TyYpYbnl43Hy57GsuigDXTXryGwitbRvsyoPmaI4L%2FAFqSfxJeTG0dwpmt1Ceb%2FE6%2BhrEooA3rjxCssUqrpllG8oIaRVO45qk2rTHR4NPVEVIZjMsgzuyazqKANybxFNLqFpetbwfaIBjdj7%2FGOagtNZlttTkvUhiLuCNpHAyMVlUUAbOheILrR0njhCyRTKVZH6cjrTNM1qSyt2t5IIbqAncI5hkA%2BorJooA6iHxjc26bLaztYU67UBxn1orl6KACiiigAooooAKKKKACiiigAooooAKKKKACiiigD%2F%2FZ" /><h4>mainTrack.app - Bicycle and Components Maintenance Tracker</h4></div><div class="bookmark__right-side"><q>Create a maintenance plan for your bicycle and components based on usage, keep track of all services executed on an elegant and easy to use interface.</q><div class="bookmark__comment"><p>Not tried yet</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://maintrack.app">mainTrack.app - Bicycle and Components Maintenance Tracker<br /><small class="text-muted">maintrack.app</small></a></div></div>
</div>
<h2 id="calculators">Calculators</h2>
<h3 id="geometry">Geometry</h3>
<p>When you plan a new bike, there are a couple of nice small apps, that help you with comparing different frame sizes.</p>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD%2FgAIDAAAACXBIWXMAAAsSAAALEgHS3X78AAAWM0lEQVR4nO1dy3MbZ3Lv%2BeaBGbxBEgJBUiAp6mHLXolUaaWNLStlW5S24lRyyim1qdQmlUdtjvtv5JJLcskxVTlspbKuVGRZlFellSxZ8mqtoihFTkgCJEAQxBuDmcG8c2jx84hPvKjHrn8Hl4iZ%2Baa%2F33T31193z5hxXRe%2BR3sgr1qANwkdk%2FWmaqLr9i4586ZOvhO4rsswTO%2FjdKxZtm07jtP7jV8OUBUYhjF0o1Cp9DhaZ2QtLi7eunVrY2MDXm97dDeBCvX4ydMHf%2FsX1z%2F91N082t2w7ZKFN3Bd17Kser3e3c0OGl6OEACwUSg8Si%2FryTEpn3u6nOllfK6jsxOJxNraWr1e75cX6BeoudFfCoXC4uLi2tqapqo%2BSSr96GLLMJ89eXxycrxrydslC28QCoX8fr%2BiKLIsh8PhV04Z5YiKUSqVFhcXc7lco9EghDAMYztOS1FYno%2BvLjcA0ufPTwwNdSd5B5qFN4hGo41Go1QqhcPhTm%2FWL2znqFwuLy0traysyLKMhwghrusGg8HR0dF33n67yZC7%2F%2Fs%2F409%2Bu%2FD0RxMfXOjuGXdmhgAQjUaz2Sy6rZesVts5qlQqlCPXdVmWxaOBQGBsbGxycvLQoUN4ZhAgcP69lXBMyWUrpdJAV8rVAVk4dCQS8fl8iqK0Wi1RFF%2BOJVKfjX%2FWarV0Or2ysrLlmUmSNDIyMjExMTIyQq91HIcQAgCsaZrRqFStzC9n%2FnBoqAsxOtYsnucjkcj6%2Bnq5XB4dHe3ilu3A3Qy4cZ5IB3KUyWTq9brjOBzH4ZmiKI6MjExNTQ0PD3tHgE17BIA7d%2B6srKwEB4dOfP7LZwzTnD4V5PlOn3RnZOHoSFa1Wh0dHe2vWtEABX0z%2FijLcjqdXl1dLZfLAICHCCE8z4%2BMjExOTo6NjW0ZgaohCjw%2FP%2F%2Fs2bNQwK86Tv7dabNaefr06Q9PnepUvI41CwAGBgZ4nm82m5Zl4ePtHd61H%2F%2BradrS0lI6na5UKnTP4Loux3Gjo6NTU1OHDx%2FeMoLXVBEMwywtLT148MDv9%2BumdfHcqflAICYIlu1Yts2xbEfK1dlUcVxJkoLBYK1Wq9frg4ODvbgtGkzTEVRVTafT6XS6XC6ju0GTlCTp0KFDk5OTqVQKLQt2opgCry0UCr%2F%2B9a8DgYCqqhcvXpycnOSj0covf%2BEYxv8NJ99KJg7QDMETQFSr1Wq1Ojg42OkIsBNHuq4jR5VKxTRNtDWGYXiej8fjR44cGRsb43nee%2Fl2PfKOTwiRZXlubs7n82maNjMzMzU1BQAjsVhpNCXevFZay7YiIdHvb%2F9hd2lEAwMD2xejfbGdI8MwMplMOp0uFouWZaHK4FSHhoYmJyfHx8cFQfBevgdH9DSGYUzTvHbtGgDoun7s2LHp6ennIzPM8Nlzi%2F4Aw8BSJn3y7ZMHZYbgCeVFUVQUpdlsBoPBfR%2FOlu2I4ziZTGZpaalYLBqGgYds2yaExONx5Mjn83mvhfaeCpXk2rVrrVbLtu1kMvn%2B%2B%2B97Dw3HYoVAyHr2pHzkWK1ej0YibSpXl5pFCAmHw%2Fl8vlKpBIPBPUSHF9em1dXVxcXF9fV1XdfR1qgepVKpqakpURS910KHmosnf%2FHFF%2BVyGYW8fPmy9xD%2BI3Xy5MY%2F%2FyOIwnIwNBOJHKAZ4v2GhoYKhUKlUkmlUltuRiXzcrS0tJTP5zVNY1kWNhnsC0cUeMm9e%2FcymYzP5%2BM47pNPPvHK8%2Fwc140J%2FMZf%2Fp1VrRpyfT2fH04m21Gu7hf%2BcDgsCEKz2dR1HU1mu0%2FJ5XJLS0u5XE7TtOdhNMsSQgYHBw8fPnzkyJFAIIBn9sKRF48fP15YWAgEApZlXb58WRCE7Sy4AAzA6Pn3Sg%2Fuc8CsrOUTiQRD9s9WdUMW3tvn8%2Fn9fgwgcAvm5SidTq%2BtrWmahgEky7Isy4bD4fHx8YmJCe8mHF0V9EwTACwtLT18%2BDAYDLZarUuXLkWjUbrX2Sq%2F4wQJOVJYLS3MV%2F%2F4z1bS6fEjR%2FZVri41C8eNx%2BPNZnN1dRXJwhRSLpdrNpsAQAhBWUOh0Pj4%2BNTUlJcjKhlaZe8oFAq3bt3CZeeDDz7Ardh2pp6DYQAgMftJbeExr6trzcbI4cP8fhugnuLvVqu1tLTEsmytVpNluV6vE0IIIRzHMQwTCoVSqdTExEQsFqOXbHFnvQOfhyzLN27cEEVR1%2FUzZ84cO3Zsn8twYZHE4E%2F%2FvpRbY1xzeXn5%2BPHje1%2FUE1nRaNSyLL%2Ffn8%2Fn6bbO7%2FejPxoYGKBnthkidQpcSQ3D%2BOyzzwCg1WrRkGpfoByHE4fU%2F%2Fj3yg%2F%2FoFgqjQwPB%2FfMaHZJFg63vLzM8zzDMIIgCIKA29p4PO6dDBwAR3Rwb0jlOM7IyAiGVG3OARwHCJlg3frCvPWDM%2Bn08runTvfZDFHKZ8%2BePXr0CN2QYRhXrlyJRCL0BDgwjihw8Lm5uUqlwrJsNBrdElK1MwQA%2BH76M%2BnRNxY4tWqzUqkMDAzsNgIpl8uKoti23aaIOND6%2BvqXX36JK7TjOIZhrK6uAgCOc9A0Udy7d291ddXn8%2Fl8vitXrkBHTMFzzwUcN5lMMnKDhILpdBp28qe2bauqSmRZ3tjYyGaz%2BXy%2BXq%2FvzRqKoqrqF1984fP5TNN8%2B%2B23BUFgWXZlZQX6t7S1g%2Fn5%2BSdPnkiSZJrm7Oxsd2lbxnEAIFgrR67%2BJ%2Fj9aqOxtrZGjzqO02g08vl8Npvd2NggHMfxPM%2ByrGmatVotm80Wi8VWq7V9XCrK3NwcAOi6Pjk5OT09LUkSwzD1eh13eS%2Bn%2BLqysvKb3%2FwGcy8ffvghhlTdqDM%2B3ZOnUhc%2FBFnmfL5cLgcAtm2jDlWrVdM0WZblOO67MISGjpqmra%2Bvr6%2Bvb6GMbruq1SpuUC9cuAAAqVTKtm1d17PZbE8EtAF8EsVi8ebNm6IoYpYKM6W7hlTtDAsQ%2FKM%2FTaZSFstapvnkyZP19XVVVZETOjKxbds0Tcuy6JUYKBmGkc%2Fni8Wi1zAfPHiQyWQ4jhNFcXZ2Fn9MJpOCIDAMg5Z4cEDVVhTl888%2FFwRBVdXp6emjR4%2F2a%2FzEf%2F1CsC1WFBv1umVZNDUEAJZl2bZNUqlUIpEIBAKO45imSRO4mOTWNC2bzWIxbnFx8fHjx5Ikua47OzvLsiw%2B50gkEgqFCCHFYhEOrD5Gs1RXr15lGEbX9ePHj8%2FMzPRlcAZABlBYLppbtXmeAajVagzDOI6DK1ggEBgaGuIYhvH7%2FX6%2FHwBkWW42m61Wi%2BoebllUVS0Wi%2Ffu3ZMkSdO0jz%2F%2BmG67cA6jo6OVSqXVahUKhUQi0ff6GB3w%2BvXrhmGYpjk8PIxOoC%2F3KpdKsqpxV%2F4kwPKN4obNMK1WS1XVYDCIOfTnbHivCYVCyWRyeHiY4zjUMtd1MS177949Qkir1Tp37lwqlYIXfcTY2Bhm7w7IbVF3ubGxYdt2NBrFQAF6VmTHcfL5vNxscuC6gsBl07FGzZYkcBxZlhOJRDgc%2Fs5nbb8eS5VDm2VI27a%2F%2BeYb1MlkMvnOO%2B%2FAtowKGjLLshhtHYQl3r17N5PJiKIoiuKPf%2Fxj6G3ZxWtN01xbW9N1HWtUhBCz2Qx%2F%2Fqk%2FHHZdV1EULL7RG%2B26guA2OBqNPnr0SFEU7Bt49913s9lsq9XaTkc8HnccR1GURqPR40y2Y2Fh4dmzZ5IkGYYxOzvr8%2Fl6tD50f%2Fl8nhZrgWHMRoM5%2BYP4T%2F76eHLEdl2GYbbEqLuShbNdXl4uFAocx3EcNzMzw3Gc4ziFQkHX9S1nplIp13UNw8A4pS%2BgMty%2Ff1%2BSJF3XZ2dno9Eo9Ky8lmXl83nwOBPTsiLh8OjQIBw56ufZxFgKXBfXNyrJrmQhrw8fPhRF0bKsU6dOiaJoGAYmzrEY4z1%2FZGREEASO4%2FpliRhkbmxs3L59W5IkVVXfe%2B%2B9ZDLZ47AA4LpuoVCATaawQy8ej9NUkv4v%2F3TYR0ggyBGSzWYty8Lp7EAWslir1W7fvi2KYqvVev%2F999966y1VVfEEXCIxUABP4hRzMuVy2TRN6NmnEEKazebc3BzLsq1Wa3p6ev8sVXsoFotYmsQb2bYdj8efl11wb3t6xlevJcfGbMdxLAvjR9d1t5KFvsCyrLm5OVz%2BTp06NTExAQCJRIIGqIQQXdfR%2F8EmL6Ojo7ZtG4axvr7ey2SoDLTwd%2FToUQypeneF9XpdVVXadYBM0VIA7n6ECx%2FCiXdSQ4O8KBKOw80MwzA75acBrl%2B%2FrmmaaZqpVOrMmTMopSRJg4ODqDUAwHGcLMuaptFrx8bG0Egzme5bN71ZKlVVTdMcGRnpV0il63q1WqVMmaYZi8W%2BY2pTAgAwn84z8w%2FH333XbLUAAD39DmZ4%2B%2FZtVI1YLPbRRx95pQyFQuFwmHorQkipVKJHY7EYKjN6hC4m5i38lUolAKAhVX%2BCz3KZenTLskKhEM3BbQEbH9b%2B%2B9OEKAYjEQAolUqyLG8la2Fh4dtvv5UkieO4S5cubZdycHBQEATcFRFCbNvGIj61RNd1m83mlgilTeCN7t%2B%2Fn8lkeJ73%2BXw0pOqdqUajgZVdAHAch%2Bf5oR1b2tCXD8V9%2F%2FBzAJg8cgTDi0wm8wJZuVzu66%2B%2FDgQChmF89NFHfr9%2Fx7yH9x4cxzUaDdu28TTa3oZrYhdYWFh4%2BvSpJEmO41y%2BfNnn83WZe9mGRqNB022O4%2BBytMfjJIGgnVmORiKxgQHHcZrNJqEXNJvNX%2F3qVzzPy7J8%2Fvz5RCIBu%2BQ9BEHAHCm9ca1Ww39jAEEIwfCk00murKx89dVXuMHCLNVuMnSKer1OG08sywoEApIk7SWhawOA%2Bm%2F%2FCitLkydPurbNMMzznbBt29euXSOEWJY1PT194sSJve89ODhI3STHcTQxTQgZHh5G%2BhRFgfYsEY16Y2Pj5s2bgUCg1WpdvHixjz2Yrutipzf%2ByTCMtzq3CwgABP78r2zd9AMMDw%2Fbtv28G%2FHGjRuqqtq2PTw8fPbs2XYkCAaDXuXCwipsui3cTLQ5E0KIoig3btwQBEFRlNOnT2MvVe%2FAR6WqqletgsHg%2Fg2L6LnGJ8mxEwCQOnr0eejw1Vdf5XI5QkggEKAFkn3leGE7Tggla2xsjOM4mpXfdzKo15999pnjOJqmnThxol9ZKti0MlmWqbdiGGa3FXC7cABgPXrY%2BvQXPMMkE4fI4uIipv0BoKNSEpKLykUIMU0T09B%2Bvz8Wi7muWyqV0DfvRj290dWrV1VV9Rb%2B%2BrgPtyyLLoKWZeFC3%2F7l%2FFvvOKtpABgbnyR37971%2B%2F26rn%2F88ccYJbXDFE4mFAp5f6T7IWxDVxQFA67dQEOqcrnMsmwkEuljSEWFxJQJvSPOsa2HgTL4fNLPfu4CcCwh2Elx9uzZ4eHh9p8nTkYQBJ7nacxFUxHYR9yOJd6%2Ffz%2Bbzfp8PkIIMtWvQIEKqeu6tzkLG8E6uIXrMgDmvTsAQGRZPnHiBKb0upAS4yDYtERcE4eGhrB3cu9Q%2FunTpwsLC4IgmKZ55coVHKovgQKF67qULNu2RVHseHz0XF9%2FaXzzNYnH4925CTzf7%2FfTC7E0jf%2FGMK1Wq%2B2WC8SQCrNUly5dwrW8v0wBrcpsJhi8TXftArvZf%2FI33PgkwYpWN7VchgEAnudpaQMA6DYbc4Gu6%2B64qS6Xy1j40zStX1mqHWEYhnde%2BwSiO4JhwAUmEmH8AdJjihar2Y7joAVRzUomk%2BgdMHHKbDaXAkCz2bx27RoW%2FmZmZvqVpdoRuq57vTvtpO8QNgDYT%2BZJ7w7Vazs0TOV5Hi0LXwKAFzNlOI3jx4%2FT9vReBNgDNAGHm%2BEuZ8qwAMDN%2FPB5czVFF0N5m0HQ2eM4WFWnDTY0S1Wv103TpNV%2F6EcOejdQhwX9cIjP3%2Fqg2HIYGaSFWYRt215ykSzqROm1%2BJINwzA0A4FZKp7nBwYG2t8q9ALv%2BL13%2BHB37twRRVGSJOxykiRJkiSe59G8mc3%2Bzz0eC%2FVZmM%2Bmdo2Zwkajgdn6hw8fYns6y7L9DT73gLv50iItOnQP2%2Ba%2B%2FfZb8NCBEyCE%2BHw%2BjDlFUcQuSL%2Ffj5z6%2FX48ilV%2B7BMRBAF1fkulen5%2B3nGcW7duraysYCT1ySef7Nie%2FrqDZblAIGCapmmaXuld11VVlW5f8JctasyyrCAIGHwDACqjIAiJREIURSz2xONxpC%2BXy2FnzuXLl3Ef%2B3KY8sbuvX%2FohMHChGEYqqpqmtZqtTRN0zRN13XLsgzDsCzLsixsfUC%2FhrR%2BV9Te1Cb8ERcgJBe78fBoo9G4cOHCgQYK27G%2Bvo61TsdxBEHwvhfcBTjsHgCA3d4ctG0byUJCKZuaphmGYdu2pmkYKFOHhQRhNR99vKZp586de8lMwaY%2FpXn3Hkfj9liPmM03IFiWxY2Ct7WdIp%2FPYyyq6zpqk6Iouq4js4ZhKIpy%2FPjx06dP9yhrR6DOF%2F9EH9%2Fj3nOfOG3vpR3zdrZtYxzPcVwsFsNWr1cOuhujv9BtRtdj7nMlszvwBGwtw0K0ruuo6lsCMXhZXbnb4W11RG%2FQizDdv47izRZRg0X3t2XdfIVRApaaqBh069odet0B0BcJcfO1Y8b2FcZT2BlLM26Y%2BO5anp7IwtiCkkXfRn1NgOaG9Vp4sVDQHbokiyZbvPaPrv1VuaftQA3asuBgNbM7dEkWyoFhFP5CHdbrtonBvRpVLkVRug64ujdDRVGoDeJbh68bTeDJfVOyaD24Cwvonqx6ve6tXL7Cb4%2FtAZr%2FoA%2BSEIJlgS4ebZdkybLsbd8RRbHbjO3LAMuy3nqwbdu0k6UjdEmWV60cx2m3IP7qEI1GqSqxLCvL8pYG4nbQDVmlUmlL%2B87rFjRsB8dx3k4W7C7odJCOyZJlWZZlGny2177zWiAWi6GDh80AtdMPrnZGlq7rlUrF28AajUb79b2xgwYhJBaL0XoPx3HVatXbQLz%2FCO2fatt2qVQimx%2BYcxxHkqTX31t5EQqFvMbIsiy6lDYvb5csx3HW1tZM06RMAYD3qwRvCoaGhjAjCJup3bW1tTb52ocsjNxs28bPXHgt7tChQy%2Fz9fF%2BgWEY7BeihR8AQD2A%2FSLV%2FfNZrVYrl8t5q5Xoql7%2FFXA34KfxMOkGHr7wM0N7XLjPx%2FPr9Xq1WvUWuEzTHBwcfD3j9Y6gKEqxWMSP5sLmSzzRaBRbpHfErmRZllUsFumLi7D59tTvBlMIRVE2Nja8PRCWZWERj35Ez4udyapUKrIsexP%2BWHAeGhra%2BqbLGw5N0zY2NrbPNBgMRqPRLU75BbIsy2o0Gpil8p6HH2%2BNx%2BM78v2mw7KsQqFgmqZ3%2BcJwLBgMRiKR7yJwXBdUVcX6leM4XpqwK0QURawtv%2BRpvDS4rlsul5vN5pb2A6TM5%2FOFQiFJkhhcNW3b9n4aA2FZFsuyg4ODr0l166ChaRr9pKyXClpDYzKZzBaO6LFwOLzH0vC7inq97v0quBeM9%2FUt7L3ied7v90ciEbTHN6%2FdpVvQmeLHjTAVzDDMdz4rk8mg%2F8c2o0AgsOVVgN9nqKoqyzJ%2B9g1Z4wRBkCTp9Uyiv1rgh2ccx8F2mN%2BL%2F%2F1Vv%2FA7Gw0cBL4nqwN8T1YH%2BJ6sDvA9WR3g%2FwFjDtbz%2BSzaXQAAAABJRU5ErkJggg%3D%3D" /><h4>Bicycle Geometry Terms – 99 Spokes</h4></div><div class="bookmark__right-side"><q>Descriptions of bike geometry terms and measurements, visualized and explained.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://99spokes.com/bicycle-geometry-terms">Bicycle Geometry Terms – 99 Spokes<br /><small class="text-muted">99spokes.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqGZVGWIA9zilzUU1vDMVMsaOVIYbhnBFZ97pdrqU5S6t3UQ8KyuVDBgCeh9u9ONr%2B9sBpucKcZzj0qq8N21uii7CSj7ziEYb8CePzrC1bw7Z29hI1vpZ1E4O6F7p1LL3A6g%2FTirOkWGj6jYx3FtApiYY2ktlCOCpycgjpWzpw5eZN29F%2FmK5qyi7R4vLkicEBWV0Iye7ZHt2xVn5%2FRfzrNudPtbS1le0gjikEbAPzxwc8jmrtixNnAXYFii9%2Fb3rF26DJfn9F%2FOq1z9u3D7KbYLjnzN3XPt7Va3D1H50bh6ikAyR2RGY7dqgk8npTLaf7RAksRVkcZB5GRU24eoql5CyyTJLNJsBG1AwULx1BHPOe57UAWGaYTR8R%2BUchiSc57YpftMG5l86PcvUbhkc4%2FnVR7K0j8tDGjpI4DeZ824qpxnP0qWWOybeXS2JI%2BYsF9c8%2FiM0AW6KzotXs2QFZVZeMMrAhhgcg56UUAaNNPEin14p1Nk%2B4SOo5oAdXNaOjWvijVbISyJE5F7GgAw28bWzkZ4IzxjrXQPMBMkQBLupcHHGARnn8RXP%2BImew1jTNSSMyP89syKQNwbkDJ9x%2BtaQqKEZKWzRUKbqSUY7nQup3J87dfb0%2BlHlD%2B8fyH%2BFYzajq8jL5eilef%2BWlwo7e1L5%2FiB%2BlnYRf78zN%2FIVjzo1%2Bry6tfei89srXW8Xk67SC0SldvToRjPNWMJ%2FfP5D%2FCsVLbXjLIyzabC7Y3FIiSeOM1J%2FZ%2Bsyf63WVT%2FAK524%2FrRzPsHsY9Zr8f8jQEn%2BkOjqVjABEh24b2xiue1qTUB4htIrK%2Be3tbqIpu8lWAdTnjIByRV46BcPIJJtYvGfG3coVTj0ziqWuaObKyF7Fd3k89s6ygSy7hgdePpTjVlD3kvv1KjQpyajz7%2BT%2F4A600fMonub29vZlfynSSSMhAW%2B9gcDoD64963L%2FTo7rYVCI4PLbQePSlBt7mJBGxja5TzA0fDEDHOfxqXTyptVCSvKAWUs5ycgkHP0IIrSdSU9ZHNa2hmvYeW5S3jDIuASQOuBRWsUcMxRwAxycjPbH9KKgCl5upnpBCB6E5%2FrTTe3kP%2FAB8We5e5jb%2FP8606KjlfcjkfRlG2vYJkGx8Oh5RhhgPp3qp4ot2n0K6YBjKgEqhRkgqcjAFOu7CS6vCQYkj5IZQQ%2Bf8APf8AwqaxunZza3oHnYwG7OO%2F40m%2Bki6dWVKabJLC7W8srS4UMRIgbp7Vb3H%2B436Vz%2Fh2U2lvc2RSSRrS5MYVBk7G5U%2FTmtmG6aV4x9mmRWXJZwBt68Hnrx%2BtVF3RrWgoVHFbf1YZcvdgn7JFEzdxI5HbjoKsRmUou8IHwN2CSAaigu7ea4kjjlRpB1UHkY61ZqjIbh%2F7y%2Fl%2F9eqt3EbgBGlKw5Ikwowwwfl56D39qnmkVVYswWNBl2PaswJJqTqXBiswcLH%2FAHuO%2FwDnj61MpW0E5cu25keHb1khl091lnms5TGixthTGeVbI5II%2BtbNu1%2BgdYrdFUsXw7lsZOfbjOaz9ZjXRtZsNUhXZbPi0usdApPysfof510MsiRMjSOqA8fMcVrVp6KUdE%2Fz6%2F5%2FMl8023J6lPzdSHW3hP0OP60VogggEEEHoRRWPL5hyebCmux4VfvH9PelYhVJPQUiA8s33j%2BntVmgjAKFI6Kayru2upBI0rQgx%2FPG0YO4c%2B%2F%2BfzrXYblI9RimA5KMe4waTV1YmS5lZnP2k%2BzxJDNgKl%2Fb7WHYSIea6KPo3%2B8a5PVVNvDJOg5sLpZs%2FwCyflb%2BVdLbwwlpJlRd0pyzf3gOn86im%2BhtJ89OFR%2Bj%2BX%2FAsSoqiRyFAPrihnDsUVhnoSDz9KZsVpHVVHbJ9KYmn2qXBnWBBMc%2FPjmtDPYq3%2Bbm7is4%2BIxh5MfoP6%2FlWhtCeWqDCjgD8Kz9LRZbu8mZQSZCoPsDj%2Bgq%2BLeITiYRr5oXZu74znFRDX3jKGt5dyLVbWK90%2Be3uBuhkUq49j1rN8PubzTDbX6rJe2Lm3lLDqwHDf8AAl2n8a3DyOa5%2BYf2br1tdjiC7xZz%2B0g5iY%2FXlf8AgS100%2Fei4fNev%2FBX6Fvub0QURqEACgDAHYUVSudUsbGUw3d1HE%2F3grHBwf8AJorEYupWhu3gUXFxAVJbML7SeO%2BQc1XNjqcZ%2FcasXHZbmBW%2FVdtXLpbhpoxD8qdWkBBIwemCO4754qXLdy4%2F4Dn%2BVJpM0jUlFW%2FRMyzJrUP37W0uR6xTtGfyYEfrUTatLEGF3pmpREHOUUSqPxU1qTXcEJAmukQkZAYgHH0pLrfF%2B%2FE%2BEVCCm0EMSRg5%2FP8AOk011K9rD7UV%2BP8Aw34HPDUtMuTqMVxdiJblNoE2UP8AF6j3FT6ZdXC%2BFydzw3cMRy0oOAMnDY7ggZFW9LsYhpWbs%2BbE%2BWImAYbe2c%2B3r61JpUVqjzJBIGZ3ZwCdxxxwM9hn9amCe4lUh7Llimtb6u%2F6IvW0iO8sfSRAu9OTtJGevepoySgz1HFVbW3ngZ2mvXmUjgMijHvwKsRq2wZY889K0MijovH2pD1WVs%2Fma0qxJLmLTdWkW5uEijuF3qW4yeh%2FX%2F0KtbcO0mfoM1ENrEU9FbsS1j641nNZXcE8oKuuMJ8zBxyOBk54H5Vp5bsXP%2FAaqXkLx20r2sYSTO9gAq%2BZ1yCeeuTzVl7FqOON4kLJn5R98ZP45oqVAQihuuOec0UALRVJdUs2GRMPyqN9Xt87YQ8z9ggz%2FLmp549yPaR7l%2BREYEyKpGOdw7VkzAanc%2BTEuLVDmRhxu9vx%2Fl%2BFSeTd3xH2g%2FZ4P7g%2B8f8AD%2FPArRhiSGNY4lCoOgFLWfoLWfoRTx7omjSZ4SehwCPpyMe1VbdoZLhpbeVQiO8LqqDO8EA84z2ArSqq%2FmicxxQxiI%2FOXzg5%2Bnv61ZoTbN%2F3i%2B33OM07y17jP15pVO5QR0IzS0AUtSsUuoBsRBKh3ISo6%2Bn0NLp14Lhdknyzrwyng5q5VS9sVuGEiMYpx0cf19ahpp3REk0%2BaJbpk2PJfPTac1ni7urX5byBnUf8tI%2BR%2Fn64px1e2MbFJBvAyA3%2FANajnXUFUj10FOr6fEkfmXkK7l3KS33hnGf0oqBNViK5klWNjyVHOKKfPHuHtI9zSa2gY5aGMn1KipFUKMKAB6CiinYqyFooopjCm%2BWn91fyoooAcOBgUUUUAFFFFABTJIYpDmSNGP8AtKDRRQA37NB%2Fzxi%2F74FFFFKwrI%2F%2F2Q%3D%3D" /><h4>Bike Geometry Calculator</h4></div><div class="bookmark__right-side"><q>Web app made for recording and comparing bike fits and frame geometries.</q><div class="bookmark__comment"><p>Very simple and easy to share via URL. No user account needed, but also no models included.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.bikegeocalc.com">Bike Geometry Calculator<br /><small class="text-muted">www.bikegeocalc.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Geometry Geeks</h4></div><div class="bookmark__right-side"><q>The world's biggest open geometry database. Find bikes by name or numbers. Easily compare bike geometry side-by-side.</q><div class="bookmark__comment"><p>Great for comparing different frames side by side</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://geometrygeeks.bike/">Geometry Geeks<br /><small class="text-muted">geometrygeeks.bike</small></a></div></div>
</div>
<h3 id="other-calculators">Other Calculators</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><h4>Bicycle - Bartosz Ciechanowski</h4></div><div class="bookmark__right-side"><q>Interactive article explaining the physics of a bicycle.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://ciechanow.ski/bicycle/">Bicycle - Bartosz Ciechanowski<br /><small class="text-muted">ciechanow.ski</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Graphical Gear Calculator for Bicycles</h4></div><div class="bookmark__right-side"><q>Graphical gear calculator for bicycle gearing systems. Includes derailleur gears and internal gear hubs.
Grafischer Ritzelrechner zur Berechnung der Entfaltung von Fahrradschaltungen.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="http://ritzelrechner.de/">Graphical Gear Calculator for Bicycles<br /><small class="text-muted">ritzelrechner.de</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>SRAM | Tire pressure guide</h4></div><div class="bookmark__right-side"><q>Der optimale Reifendruck ist ein wichtiger Faktor, damit du schneller fahren kannst. Dieser Reifendruckrechner liefert empfohlene Reifendrücke für Zipp Laufräder.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://axs.sram.com/guides/tire/pressure">SRAM | Tire pressure guide<br /><small class="text-muted">axs.sram.com</small></a></div></div>
</div>
<h2 id="indoor-cycling">Indoor cycling</h2>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAAvGQEA6AMAAC8ZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A4fwT8NbHT7eO512JLy%2FYZMT%2FADRRe2OjH1J49PU%2BhW9vDbRiO3ijiQdFRQoH4CpBS1%2Be18TVxEuao7n6nhcHRwsFClG35%2FMKKKKwOoKKKKACiiigAooooAKKKq6nfQabp9xeXbhLeBC7t7D09%2BwHrTScnZEykopt7EGoaxp2nzCK%2Bvra3lK7gsrgEjJGefoaK%2BavE2sz6%2FrVzqFzw0rfImciNB91R9B%2BZye9FfS08gi4pzk79T5CrxPNTapwTXTc%2BpqK5XwX4y0%2FxLaoqOkOoAfvLZjg57lf7w%2Fl3rqc187VpToycJqzR9XRr068FUpu6YtFJkUtZmwUUUUAFFFFABRRRQAleMfGjxP9pul0Kzf91AQ9yQfvP2T6Dqfc%2B1ei%2BO%2FESeG9AmugVN0%2F7u3Q93I6keg6n6Y7181zSvNM8szs8jsWZmOSxPJJr38kwXPL6xNaLb1%2F4B8vxFmHs4fVYPV7%2Bnb5%2Fl6jKKKK%2BqPihVYqwZSQQcgjtWzD4q16FAkes6gFHQfaGOPzNYtORWdgqAsxOAAMkmonThP4lcuFScPgbXod94Cu%2FEniXX4rZtZ1EWkf7y4cTMMID0B9SePzPaveRXLfDvw2PDegRxSqPt0%2BJbhv9rsv0UcfXJ711VfE5liIV6z9mkorRW%2FM%2FRcows8PQXtW3KWrv08v66hRRRXnnqhRRRQAU12CKWYgKBkknAAp1ea%2FGTxP%2FZ%2BmDR7STF1eLmYg%2Fci6Y%2F4F0%2BgPqK3w2HliKqpx6nLjMVDCUZVp9Px8jzn4i%2BJW8Sa%2B8kTE2FvmO3HqO7%2FVjz9MDtXK0UV99SpRowVOGyPzGvWnXqOrN6sKKKK0Mgr0n4N%2BGf7Q1M6xdx5tbNsQgjh5euf%2BA9fqR6Vwmh6Zcazq1tp9mMzTvtBPRR3Y%2BwGT%2BFfTuh6Zb6PpVtYWgxDAgUZ6se7H3Jyfxrxc5xvsKXso%2FFL8j6Dh%2FL%2FrFb2017sfxf8AwN%2FuLwpaKK%2BQPvQooooAKKKQ0AUNd1S30bSbm%2FuziGBCxA6seyj3JwPxr5j1vU7jWNVub%2B8bM077jjoB2A9gMD8K7j4xeJv7S1QaRaPm0smPmkdHl6H%2FAL55H1J9q85r7DJsF7Cl7WXxS%2FI%2BCz%2FMPrNb2MH7sfxf%2FA2%2B8KKKK9k%2BfCiiigD3D4N%2BGf7P0w6xdpi6vFAiBHKRdc%2F8C6%2FQD1r0qmxoqIqooVQMAAYAFOr89xOIliKrqy6n6ng8LDCUY0YdPxfcKKKKwOoKKKKACo54zLDJGHeMupXehwy5HUe9SUUCauefH4UaAxJabUST1JmXJ%2F8AHahuPhJobxkQ3WoRSdiXRh%2BI2%2F1r0eiu1Zjil9tnnvKcG%2F8Al2j5z8ZeBdS8Mqbhit3p%2BQPtEakbc9N6%2FwAP5kdOa5GvrW5giubeSC4jWSGRSjowyGB4INfMnjLRv7B8SXunqSYo33RMe6MMr%2BODj6g19HlWZSxV6dT4l%2BJ8nneUxwTVWl8L09GYtFFFeyfPn11RUFndQ3lrFcWsqywSqGR1OQwNT1%2BbNNOzP1xNNXQUUUUDCiiigAooooAKKKKACvBPjW6N4xQJjctrGH%2BuWP8AIivbdY1O10jTpr2%2FlEdvEMk9yewHqT2FfMniHVZdb1q81GcbXnfdtznavRR%2BAAH4V72Q0JOq6vRK3zPmeJsRCNCNH7Td%2FkjOooor6s%2BIOi8K%2BL9X8OPssJ1e2ZstbzDdHn1A6g%2FQivobQL2TUNMhuJlRXcZITOP1NFFfLZ7CMZppas%2B04aqTlTcZNtI0qKKK%2BfPqQooooAKKKKACsHxjq8%2Bi6PLd2qRPIgJAkBI%2FQiiitKSTmkzKu2qbaPnzxJ4l1TxFcCTU7gsi%2FciQbY0%2Bg%2Fqcn3rGoor9AowjCCUVZH5biJynUlKbu7hRRRWpif%2FZ" /><h4>Virtuelle Trainings-App für Indoor-Radsport und - Laufen – Zwift</h4></div><div class="bookmark__right-side"><q>Zwift ist virtuelles Lauf - und Radtraining. Übertriff deine Ziele und messe dich mit anderen Sportlern aus der ganzen Welt. Mit strukturierten Workouts und Gruppenfahrten mit Anderen.</q><div class="bookmark__comment"><p>No.1 app for indoor.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.zwift.com/">Virtuelle Trainings-App für Indoor-Radsport und - Laufen – Zwift<br /><small class="text-muted">www.zwift.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8AraLrV9fapa2racEEz7SwWQEcH1GO1dc1vIoVJA6%2BisCKveEp7eLSWdLq9nt0m%2BeS8bLfdTPQnjBB%2FOte8vbCVQkdxBJngANk59K4cr4jrYhSdSF0nb8F5F5jlNDmToe5dbavq%2B7uc4tt7U9bX2qxb3cTXX2eYGJmPyFuAfY%2BhrVW1x2r6mjioVo88GfO1MPKlLlmifw1oA1G3m3bo3U5SQHpjtWhq3hy%2Bt7aGNJ5bhmJLAcKoFaGg6na6dZPFJFIzFsjaK0oPEFq27ekyk9mwQK5KlStztpaHdThR5Em9TzyW1uduxw4Uc7T2qt9l9q7LVZ%2F7Qn2WkTYY84GS5psHhy6kt2mdCoHRP4j%2BFdMa6irz0OWVBylaGpyK2uasW2kXNy2IIHf3A4%2FOu407QrcorX5xt6DOK247uwiYRRSRIEGAoOAKynjLaQVzangb6zdjzGHT5bPVbRZoyrrPGcZ%2FwBsd6wNf1FtF0WXVVtoZ3DriOQnad747fWvTdfmtpp4TAoZzInz44A3A8V5b8QbfZ8OCeOPs38xUqq5Xk9Hb%2FMbpRhaK1XN%2FkVrPxP4lubdJbPwfYNC6hlYT9QQCDzJ3BBorMt77R7GztIr%2FU%2FF9lcCCPfEVdVyFCnaMD5QQQPYUVy%2B1n3OxU49ivc23iTw7pkXiTUdLu7TR9Pug1013qi3OYyFQApGzBhvbsucY9M1pS6jNNrAglgsoZZRHJElvewuJFYAqVVDkbl%2BYbgM1r6546Hja01vwnc%2BENQtbOfR1vGvRMWjt5JLX7RCJFVBhcggkkjcoyPTxn%2Bxr3w%2FoWga5d2jzveolxbiF2UlSqlVcquFU54BYMRyPbglalpCJvOUt3qe6f2aNT11YQ7IGR23CMnO0FgPz49q1dLu5f7M8y6EBKfZhkXEcm4S7c5ZSR8uTyfv4%2BXORXht34g06%2F0037%2Fa9Iv2VoI4re8do5AEyMRyDcE7HDjPPFd74N8a2t1owg1Fo7Oe5ayitFhhUm5MZVThUTG4cHBPyA5XpWOFqOlto%2F6%2BQTcKztNHoulzSXud9o0ACK%2BWlR85LDA2k9NuT%2FvD3xpRW4Ei7hxkZqho9tHp0LXVylvZxmIITLAluRh36nPT5uM%2BpPelvPFOi2yq7azpX3gp3XI5%2BhBxXqwxa5bSepy1MG%2Ba8FodBZxRQ3KyIxM3JBQcLWlLqEkMShbdySudx6fWvLtU1rxVcXEVx4WuPDFzaxMWkt47ovLcLnO0MeFOOOO9QD4uSWcFxH4i0HWLC8tztMZX5GPszAEDB68j0NZSr03L3n941z01Zqx31xI9w5dwD7dhUK2xJBKHHqRxWFd%2BKtPiuUto4mOoRwi5lV5lWCPMW8Bpc4I%2BccgEcH2rE1nxNbtprTaR4ZGr3BML%2FaoQHtDuCszGX%2B7ltuCAWPPAyQq%2BYRoOMYxbu7adPv7GcaDq%2B82eg6nLaDThFC%2Fmyqw%2FeAfKhwTjPfp2zXK%2BPdHk8QeB0sNJjje6dLY%2FPIEU7dpYZP405tauk1R9Nvns3to90gCRgFSEdvJ3bh0TYx%2BQZ3Hp0pbK81HQNJ0GPxCJWjlRIJbyVQNzlm64PB27Tz1A9qypYiStKrtLt00uv1%2BdjrlTdS0KKu%2FTfb%2BvvODufCvji8ZGvYdJndF2IZHtztXJO0fLwMk8e9FX%2FHfxo0zwh4mudGutKnnkhVG8xbhVDblDdNpxjOOvaiux04J2bOaFWpOKlFXTOg8G%2BOfDXj%2B21uz0Nprm7h0okvcQ7XjLK8bAN1wcKxHqSe9c38V7afTPhzpQ80rJa28STR4BjOI%2FmBDAk4AwDkda5LRNe01vElh%2FZySyazDZGwt7gMikw4KhAMqrAIP4vukDbVnxX4jefSrPTdSimngtoVnn8rY4lQrIABIMjgEEg9dpFeRHSXs3O%2BzV9%2F08tT0uZODf%2FDbPqeSWepamLtbNxFOJL0p9mnUGJiVKEFjjaACBwRgHOa%2BgvDtydDGk2PhXwismuXtp51zcTTC0SKGN%2FKKr5haTCHqmFzndk81554J0ldQvLJ7YJbiOcM9y48wedFtcHcMjGVUYzyODXQpYaxHvvLd5ItRt72aa2uUCKu2ZyZMls5T5pCFOR830rWTdJXi9VotOv9P%2BrGNOjCreFTY9M0nxbrRn1bSte8PPYXMFhLeJPBeRXUUUah9krLwy7ipAUbicc4HNeF6h4uvp7TytXvZLhV%2BfZNblW3gdiGPPzfrXovhbxZc2Vvq8XiaONri8tjA1yLuINJtBCZCZIO04%2FDmvL4PD0LxaZ9vuWDCIRXYs0RQAMY2YQBj1yT175row9Z2lGvG9%2FTz38tiJ0Ix5fY6Jf1p%2FX%2BQiXWly3EUjRTNKyMHcxZ2jggemTjjA4%2FOtzSLiyK%2BXHqmpQ2kbqsm55Au3zMgnHA6HHHQGsq00dY5ZEt2ubhjcAwoDlmgHVWAXO%2FHpxXQaZpL2E91BrVpcxPNh7OVAWTfvcKhOckFSQMdcnOMgjzlSkvda021O%2BFSz5jS8HHTpb%2B6tZL1b1bqIxfvQcxR7jufG3k4K8Hr%2BNdJ8Ob2xa%2Bsd0Wp6ffz3ggjtr2VgWTYZFlRAFUbkwTlTg%2FLngZx4%2FCl0LLStQFvLJOz7EtHULIMOoWQtzkLsXgE4Bz2p0OuX93qFrfMJbKzt3uXE8oG%2FCo0ZcYJ4BiGDnnBq3SlZKmlezey6a%2BY37OpK9R2jdL5vRXt56GpqV3a%2F8LW8R2siIdWlszIkhj%2BaSJYXQ4boAGPIq78RfFmjeJfhuLTQLtri%2FW5skto2ja3kZhcQgSKrgN5Z5G7GOcVXu9PtdN%2BIV7qbW88jyaYS2pyPiN12F3jw3JwCrbhjA6jpWpYWfh%2FSWu9RTSLJLi08y5t5ILJlF8piLxsjFcKGIIxljuTg4wKqrN8kXOza3d9L6P8AP7iKUNW1dP537J%2Fk%2FM%2Bfv2jPs158RBdRafcbJrKKQEAcg7sdCe2B%2BFFRX3iSS9S0bxHoX2m%2BjgEXmwW5dSgJwOD8pHKlTyCpzRXr%2BxoVffdXfzPNp1MZhY%2Bx%2Brv3fJHd79B091aK3iSZBgvbukrHjGCQNv4bqr3Gvw7DHa2eYsYImYFcYxjaAOPxrk%2FN3EFyWPqT0pRIMkA156pR5uZrU7ud2stjfbWrvaFjeO2QcBLeJYwPyGaaA9xEbm7nbydxUNIS7O3ooPU%2BvYd%2FSqej2i3Uks1y7x2VsokuJFHOCcBFz%2FEx4H4noDUd%2FfSXlwJGVIlUBI4k%2B7Gg6Kvt79Sck8mtNtiN9y4Jh%2FyxURqO%2FVj%2BP%2BGKVPMmlWOIbpGOAP8A69Z6uwXPGK6T4d2UOoeKbJbmbyyJQIEyv7%2BXBYRndkAFVbPB7etN3SHBJySex0ngG4tYr6701nRbyeNGgKtneADvjB9STux3x7Ct7VLBrmS2kS5MbW9ws6ZXcAQCMAHjkHrzVLx14Ih0yx1HV4Xkg2ATuIWG2MqQNy8Bh26HtkdKztB8Wx3bJY%2BI5Ut7tgBFf5xFcDtvP8LH%2B%2F0PfBrmafXc3bhzPk2KKTX1r4h1O1iaSYBdyCRuPmCFiACAOwOecGpJNGt9Vf7VcSxQ6lHbPaxSWkxUwIwYYADFTjexG4HBJrfn8P2kF80ssDiYgkh3LKd2OQCcHIVefarBiRItkaRoPTAAob0GkZEF0U32N0tyt%2Fp9jeB3n3uW8wwBSAcDAWNTjOfTAJrnfitq9x4pmg8NadNcvbywebf3MkxD3UiglYo0kkYxjIGckDJ%2FE95b3EUVs0Fzp0FzknDlgDg44wR04H5Vi2%2BlxBppJoIWkldmJCjuc4HsBUytLp3fzbuOnFw2OIGr6GQF8caP4p%2FttAEkuNLIRblRwssgJGZCOC38W0N3orujp8ScRyzxL2WOVgPyBoo9jhHvCS9J2XyXI7elzr%2Bv4taQqWXRW28tzxcS%2BhqWMklVRS8jkKqqMkk9APcmqcZAGSOa6zwPEtn9u8Q3cQeDS0zAp6SXLcRj8PvH6Cuq55VibxHImlWsOgxOjSWx8y8dTkPckYYD2QfIPfce9c2snzDOPwqOeZ5GJkdmZiSzHuTyT%2BNRc5Bzmkhl5ZgVcYyRkjFa%2BsGGLWNMh8P7pf7PCk3cc4Ae4%2B9JKmRkKMFQfQe9YEUgX71dd8LrG21nxgdHvc%2FZ9Rs54GZXCMrDYylWPRsrxSk7a9hx7dzovEnxK1S5t5kkvbELewSN9lWJCI0zjYQRk5B7159BOqRCGYGW0b5gB1TP8Sk%2FqDwf1rKv9GWWyi1HSZF%2BzCFkvBLIvmRSrMY2JzztbKED1JHQCoBqMChkDN5cfAIUn8B%2BVHu1I6f8MKzi7s9F8P8Aiq80CGC2uR%2FamhscRrnDRevlsfukd0bj0x1rvbK4tNXsjeaLdC8t1%2B%2BoGJYj6OnUV87XGr3UQ2RCaKCQ4dWyvmgdj9PUcit%2FRry5j8vV9Du5ba4jB8wI254uejZ%2B%2Bh9SMeuKylBwXvff%2FX9fkaRnd6Hsxk6%2BoP5VC84yRznrkjpWLoPjTT9Z22uviPTNSbhbpP8Aj3mPbP8AdJ9%2BPQ9q2tQs57E5uVJTH%2BsHKn8ah6GykmN3qCcYorPYBzuDkAj%2B9j9KKVyrHjCAuQFGSegHJJ7Cuz8cxx6Fpuk%2BG4WRpLaP7VeuBy88nY%2BwH8xUHwwtILjxB9uuhiz0yM3Uh25yw%2B6P5t%2FwGud1rU31jVrzUbjh7qVpMddoPQfgMCuo4yvuwDnr%2BVKzAMp6%2BpquXz0pcnHP4UAT7%2BOB1p1tq02k6lp9%2FbOVmtrmOaPnjerBlyDjIyOmeah7deajmRXjKsAQaAsV9N1R7zU9buWiBF68pDiMgq2Q3AHHOD8vt7VUuizJJMzNtLiNctnOM5NT6ZHPaXy2tuXFlPMjuvBG4KwHv91m5qhYqqskMiEz9Cc5A4%2Fya0jZaoht7MtRWss6hnkxGeV3Hca1bJmsthtnZZEOQwPOe9VYQBc3HlAKg2jA6bsc%2FpipWPPUVMnzaPYaVtTYQ2%2BpDYPLguyMbCdscx9s8KT6dD7Vq%2BHPGGreGn%2Bxyq11Yodr2NySCg9EJ%2B79Dke1ckGByDnmtKK%2FjuIhBqW4qoxHcqMyR%2Bx%2FvL7Vyyi4bar8V6f5fd2Nk7%2Bp61Z694S1K3W5TVY7At963nkETIe4wc%2FmDiivIp9Mukf93AbqMjKywDcrD%2Bn0oqVOm9VJF3kuh1FsgsPhRdT2%2BRLfXHkzE913hePwGPxNcNIT5mKKK6kYCHkc08gYxjiiigYo%2BXAHTFK3PJ9aKKQijbTSLrQRXIXyc499w%2Fw%2FnT2hjgha5VQZAhIyOBj0%2FOiirETRII4FAyTwxJ6knkmnMPlLd6KKT3H0GPSBjjJ5oopdAW5JDczwqVhnljXOcI5AzRRRWfJF6tFczP%2FZ" /><h4>Best Virtual Indoor Cycling Training | Virtual Cycling App - MyWhoosh</h4></div><div class="bookmark__right-side"><q>MyWhoosh is the best virtual cycling app for cycling at home. With Virtual Cycling, experience real-life cycling routes from around the world and take your indoor cycling experience to the next level.</q><div class="bookmark__comment"><p>A new contender, financed with Saudi money. Also usable on free account.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://mywhoosh.com/">Best Virtual Indoor Cycling Training | Virtual Cycling App - MyWhoosh<br /><small class="text-muted">mywhoosh.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Trainer Day - App </h4></div><div class="bookmark__right-side"><q>Workout Sharing Platform</q><div class="bookmark__comment"><p>The successor to ERGdb. yYou can search for work outs, adjust it to your FTP, download onto your Wahoo (Garmin probably, too), and then ride indoors with ERG-mode without all the Zwift/indoor training subscription apps.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://app.trainerday.com">Trainer Day - App <br /><small class="text-muted">app.trainerday.com</small></a></div></div>
</div>
<p>Zwift seems to be the standard goto option, but I find it relatively pricey – Same price as Netflix or Youtube Premium for a mediocre video game with 2009 graphics, which I play twice per week for 2 hours. So, I also tried a new app MyWhoosh, which has a free tier as well. In the past, I also used Sufferfest (Now Wahoo Systm), Rouvy, Kinomap and BKool, but none has a good total package IMO – ok graphics, some other riders, interesting routes, useable free tier or cheap subscription for low usage.</p>
<p>Alternatively, you can just use your Head-Unit: In the past, I also just made custom workouts or downloaded them for free from TrainerDay (formerly known as ErgDB). You can upload these workouts onto your Garmin or Wahoo device and use them to control your indoor trainer via ERG mode.</p>
<hr />
<p>Let me know, if you have any suggestions for other apps or websites!</p>Stefan WienertDev-Links #22 - Ops/DevOps/SRE links2023-04-21T22:30:24+02:002023-04-21T22:30:24+02:00repo://posts.collection/_posts/2023/2023-04-21-developer-links-no-22.md<p>This time with links around the topics of DevOps, SRE, and Ops. I hope you enjoy it.</p>
<h3 id="postgres-links">Postgres links</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BICHElDQ19QUk9GSUxFAAEBAAACDGxjbXMCEAAAbW50clJHQiBYWVogB9wAAQAZAAMAKQA5YWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZGVzYwAAAPwAAABeY3BydAAAAVwAAAALd3RwdAAAAWgAAAAUYmtwdAAAAXwAAAAUclhZWgAAAZAAAAAUZ1hZWgAAAaQAAAAUYlhZWgAAAbgAAAAUclRSQwAAAcwAAABAZ1RSQwAAAcwAAABAYlRSQwAAAcwAAABAZGVzYwAAAAAAAAADYzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABJWAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1YWVogAAAAAAAAAxYAAAMzAAACpFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA%2BEAAC2z2N1cnYAAAAAAAAAGgAAAMsByQNjBZIIawv2ED8VURs0IfEpkDIYO5JGBVF3Xe1rcHoFibGafKxpv33Tw%2Bkw%2F%2F%2F%2F2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj%2F2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj%2FwAARCABkAGQDASIAAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL%2F8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4%2BTl5ufo6erx8vP09fb3%2BPn6%2F8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL%2F8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3%2BPn6%2F9oADAMBAAIRAxEAPwDzey8OLOQTpk5z%2FfkzTbzwHqdxc5toFiiPYtXqloQBVwyjqTVXNuWx5Xb%2FAAxvim6e4A9lFY%2Fifwf%2FAGPbiQvuzx1r1zUdagtUO%2BRfpmvL%2FGGt%2FwBoSbV%2B4vSs22noWoxa1OFNs2cCg2koGduR7VbRuc1p2E8YO18YPrVqoluQ6LeqOe8iT%2B6aPIk%2FumvQ7KxsrlRgqDWgvhyBhldpqudEezZ5Z5Mg%2FhNBjk9DXqbeGI%2F7oqNvDEf92jmQezZ5f5b%2BhpNj%2Bhr01vC6f3aYfCyf3afMLkZ5rtf0NFekjwun90UUw5GdCdW1Pa2yGGFcZzI%2B9vyHH61lXWo38gIlunIPZBtFXZi8ik4%2BWs%2BZOwrnnJrY7IQT1ZiXxKgs5Zz7nNY8rGWMkrgV1E9qxjJdcCud1WaONCiYz6Cogm9x1GltsY7ZBoBNVzMc0qOznABP0rbkOdVS9DeTQnMbkVp23iW8iwM5%2FGqltoeo3Kho4GwfUVsWfgbWJrR7jycIvTPepsti%2BZvodX4N1WTU0%2FeDmur8keleXeF9QOkSvHL8pUkHNbtz4yhXP7wfnVxi2TKSR2RiX2prRr7V5%2FL42TPDj86g%2FwCEyLH5dx%2BgJquVke0R6GY19qK8%2FHiyUj%2FVy%2F8AfBoosHMjoYYZLmYxwAt64PT6%2BlaH2ex0qIy3biaQDgZ%2BUf41zereJ4rO2aCzSJVXoiHagPv3b61yF9qVxqZDXN1EB0Cl8AfhUcjZq6ijvqbHibxMJ3ZLVcD1FcZNK8jFnNaEsKOvFxDn0WNjS6XosmofamhzMYACYkG12z7HpxyDjBxjjIquWNNXMnKdZ2RDpmj3eoTBY4nVMjLMpAGa9F0LwpZ6fsnuIGumHJ3cKPoO9aHhe21yOxQXqgzBtuzGcL2Of6V1JtDd2kiXsYikx8ssZ%2BYfTP8ALpXBXxMr2X4M9nDYGnGPO1d%2Ba%2FQrm7s7O1RFtnwRlQO3uDWjb%2BMZJ9O%2By2%2BmRbwMGRmIH5YqvBYT3Glwrc6rphMI8pElYo5UE4JBHvWNcSX1pKyx2SyqP%2BWkcqlT%2BZFZQdteZa%2BZrVjGXutXt5Mwr3RbMzyTT2yGViWJJJGT7VCZrW2XYlvagD%2Fpip%2FpUutTateRlYbIBucMZ41H55rlpNL15OZNPlcesEiyj9Dmt1yveX4nLNuO0PwNK71NVJ8uOFT7RL%2FhWXNqVwx4lI%2F3eKozfaUbE1vcIw7PEw%2FpULyN%2Fcf%2FAL5NbKCOd1WWnvbgtkzy%2FwDfRorOZ2z91vyNFXyIy9rIhUqxBLKvskIFW451jGRJPx12qi%2F0NQW9jLPIyxqSFyc7e1bGiWZlJijhMkp%2BSRCvUHvW9zjsSajazQ6czefP9pyFEYZXCsSCueMFWGRkdDXeeC%2FCMsyQ6jqSXlldJH5AhwwYoOit1DAfwnIIAAPStjwZ4OtrBYpLljcOi7ULjlV%2Fu%2B9d0sSgAKAAOAK86vXbTjE76NNQkpbGFNpFyVAtjP6fMdg%2BvXNV71ZdGEa6tfrHHJ93I7%2Bme5rtLa2McfmydOwNeNfGLULjVLyygtGYw2rs27PDPxyB7VyU480uWTsej9Zmo3iuY6JRpU7eZFcLL1zluc0zVY4UtP3QjJPp1rxKOS6t9UIWeXzGzvYMevWta18Qal5SmVoihOAxGDXX9UUdUzD6%2B5OzVjr7q5Qx4jwQBWRJcDJwxB9jWBeXz2Thlk3q3JUds%2BlR%2FwBppNyrYPpVfV7C%2Bt30Nx7ib%2BGeQD%2FfNQPPPnmZz9TWat2fWpFuVJ5o9lYPb3LfmS%2F89DRUQlUiijkH7RG%2FoeiE28ZUfveHjkxxg9Qa77QtEitQJBEok%2FvUmk2cdugC52%2BlbsLZwBV1qvN7sThpU%2BXVlmIFQABW%2Fo%2BnNIRJL%2BVVdKsDIwZxXQXVxHp9mxyAQKyhTW7LlN7I5zxxqSWFiYYmAYjGfSvDdYuRcNJJzgcKK6Tx5rbXt06q3BPr2riZ7pCQhPTrTo4f2tW%2FQ2lX9jSst2VobJTOGI%2Bb1rn9QnWTUzHF%2FqojtGO57102oXiWmmzzqR5m3Yg%2F2j0%2Fx%2FCuKsBmcd%2Ba9GpS5GedGrzKxfv1aTAAqCKwd%2BgrqLTRbi7UNFESPXFbFt4cuFUb4yPwojTnJe6hTlBP3mcdBpcrDAkI%2BozT20q9X7gST6HH8672LQynJFOazji%2B9ito4GpLczeLhHY89NtfxnabaTPsKK7S4miSQjePzorb%2BzX3I%2BvrsegQMSQq10%2BjWO8hmHNY2h2ZdlZhXZWxSCIV4cYWPScjQjZLWHtwK8%2B8c%2BIQFeJH471f8Va%2BtrbuFbnpXj2uX8ly7Fmzk5NaPRBBdWZuq3xZ3cnrXOSXLFiSepqbUJizbc1myttUmtqS5UZVpczH6ldNNGkeTtXn8ah0vi5UnoDUDnK1JYnEma1m2zCG57n4RvrH7LHuZc46GtXU9WsYlOHSvBk1KaCTEbkU%2BXVJpB8zk%2FjXo0sRTUVfc4qlGTk7HpGp%2BJYVLeWRXI6jrzyMcNgVzUl07dTVZ5CeponjOkEEcMvtGlLqLs5JY0VklqK5frE%2B5v7KPY%2BubBQiDaKi1S5kjhbaQKKK86J6DPJvFN9PJcsGbgVyrys2dxzRRRLc0jsZs6hmORWRqHyyYHSiitKe5hV2K%2FUVJbcE4ooraRhHcST7%2BaUdKKKaE9xCKYwoooAaaKKKQj%2F%2F2Q%3D%3D" /><h4>Some indexing best practices - pgMustard</h4></div><div class="bookmark__right-side"><q>We all know that indexing is important, but it can be difficult to know
where to start. In this post, my aim is to collate some of the best advice
I’ve seen for indexing Postgres, and simplify it for folks just getting
started.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.pgmustard.com/blog/indexing-best-practices-postgresql">Some indexing best practices - pgMustard<br /><small class="text-muted">www.pgmustard.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A9E8XyY8V2OVI32vRe53MOa53V4kexh2gqVQ4I%2F3RWh8QfEWkaVq2ly3E0tzfRqBPBCMeXHludx437uq%2Bnp1qlZ3mkavFANO1KW3cphUvAEYkAgglcgHkdff0qGrK7N467GOsMwlOEZvLZXDAYAGByD3qsmoppSQMIRNOk0pW26M%2B9FUDcfu%2FMOT6ZrtP7JaxEPnGHEpVUdZVIcgDheTnqa4rxFpslzq1hbwq6PJIFLxrzjPYfTNZ7vQuT905HQvtOv8AjP7Vfu0l5M6lQh%2BRGXoAOygDA5%2FPNfR2nWgjhAdUU8bmxjPHWvNvAvh610q5kuLqW2gsrZ%2F3007eUuQfkOT%2BHXvXqmlato%2Bo20s1lqEEtvC3lvKVZVJ%2F2SQNw9xxVO1zHW2hGLUhzthbJOWk468GqN34ZS4ULMEk25CkRgN1yOefQflmk1z4i%2BFtDtZQLhru6VeI0UqGPoWPQetU%2FCPxg8I67rw0ppGs52VPJnnYeTLITgxq%2FHI4xkDOeKuMb6ol8y3JD4FeYMtvCqhxyzDBGP596lay0jwZaS3AiUzxKcy7fmOey%2Fyz6V6Y5CREk7FAyT6V5F47v0n8TfZ5FcW7WjFPl4Zt2Dk5wD9eemKpT5Fcnl5nY%2BefiNZ6t4kv59evX3SzFY0t0UkRICQAp9OM%2FrXIwQ3VlayvuVUM2zO4bieRwOv4%2FSvpW9s449ElEc3luYVBQtgD2%2F2en%2BNeOapFaxa08N4xS0ktx5sjLhl%2FeZBzjnvz7VzSnKS1NuVLY5C8uWgkSNpLuMKoCjOcgcZ5BPaijUXh1C486C2ulQDZhpR2J6fL06daKuMFbUltm1ca1dz6vJfvKz3MrGR2kJfJJz3qzBr9yC3yxbu2F4HQ%2FXtWGihc%2FKwbAzv%2B90%2FSmw3KwyI5iLLu6EdR1P5gGttehR6H4PufEniCeTT7WBJbctyrLkD3BOcY45HSvbrTQbPSre0u%2FEJjF6irhY5Nm5gvOT%2BfamfCMaboHhWyu3jaJL2OIqwALBeAMnspY%2FjV34uahBolss0Nt590xUrl2G9ieASoJx0PSsFF1HeOhrKajaMtfMzvF3hm38XeFdmhTw219FcC5AnlDocKRgMv%2B9wTyPxr598U%2BIPE2i30mi3cv2dYzncF%2BV19V7Ee9b0vxIvdPja3gtYIrou24KXKldx4yee557153rmpJfaxLqUgIeROIQxZEkzglc9BjkD3q1GcX7xN4290rXksl03mzSySseSWOSTWeJAjYP3e4qc3ShcDcBnIIqvL87ZVic9B0q%2BZrcXKnsfTPwS%2BIV54i0KfQ9XummvtPRTBO5%2BaaA4XDHuynAz1IYdSCa6S9gjn8VxXIhE8MdkQX2hgMyHJ%2BuVA%2FpXhv7P6TN44lSP7v9n3AlVuAw%2BXA477sY%2Ble7Ot2fE8cDxAqbTBZjwyZG4qD0bdtyTnHPrWc3zEuPKzjPiN5FxZqyGCN7dgx%2BXGRjgZ9exHPWvJ9UeC7F5M8bxqYwFAOfm3jJUcc5P07V9B%2BL%2FDraxoc8Uhd5iioEiVc7hluM%2Bgx0%2FCvn%2FWdJk0Oa6tdRjEaxMu0SLgyKWONqnntnv0qbaCbOUSS7iBWK4faWJ6kd%2FSir2l6XJcQOyWkhVXKjzwwboM%2FwAPTOaK0JL%2Bv6fJpd7PFJFs8uRojvGH3Z6MOxGDmsp4FfeSvynIOOMepr6V%2BJfhWx12e0kmLW9wHbdPCo%2BZvlCl%2FwC8Bk%2Bh7ZrwfVtMn0rWJLa9haFZWIQnB8xOMOPY5FJScNzWynsezeEr6O8%2BFui3s13cW7afi1EMa%2FLciGQ5jfkYDKUAJ49c9D2Hju%2FtdH8BNAkktxPaBXlZHVNoIPGWx6gcZrx%2F4YML601jwdNc%2BTNekXOnyF9qmYDBjPs4x%2BKit%2F4qw3UPgaSW6hAVxaRqkkKh7d0UxyITnJO6POR2YcCojO0hyjoeQ6zfjU9YkuI0CoxIVCQcYGBnH0rl9QGZFX%2FloMlv941txlYt88xOyMbiB6f54%2BtYkzfvXZ15znA7e1aKfNO5DjaJXMjRgFT83oRVi0YksSfkIzyOntVrw9o154i1630nToRNf3LYWMvtCqRksx7ADnNfRXgr4Labol5b3utXbardIoPkCLy7YOOjYPzNj0OBkdKctNClNLUsfCXwXHoPh%2Fzr%2BENqOpKksynH7uLGUiIPOecn3%2Blasmkwrr0UEuliWOWKbZIZ8KoMidAGyOpHHIx712Bh2MfMlaSQtnLcEc7s8AZ%2Fzmufvb0W3i3TrSRnEskLsrkDDEPnaPTKqefbis7WIcuZ3ZyPxE0C2ikhit47mylaRI4poFkCSFicITuIJPX19%2B1eWeI7WTR74WlyfNWcLjf8xEgbqG6gd8fWvonxG8UMUUjM28FueoB9c9jk8H3r578fCaXUo5Jo28lN%2BVR8DG7jkZwenNFr6C6HFw5nlunmiaV%2FOYF3YsT%2BOaK19LjlWKXECsDKSDu2kg4Izx70VQrH0p4zY2xtwrkO28sB0OWUf4D3NS%2BH%2FDmma34fkn17TbTUTJcr5XmocoFQAhTwVycZxxxUXiyRJp4jCqORHIQpXg%2FMvX0x%2FSug8MNJaeBklPFwgmYAkj5s7R%2FIVNTY1hufP3xA8L3XhTVWFrd%2FaI1JlhuY%2FwB3IAScAjOQR0z0PXim3viTVPEPw21SPWrtrua3urZkmZQC4Yupz7%2FKKTxjqE%2Bpa5cxylyIiEbqdpxjB%2FXmqJs5rXwlqqlB5ElxalCDk4DP1%2FpWLu%2Bh0NJI4i8lmawCKubZZFkfGBuIIOPfAFdB4D%2BHOteLdT827j%2BwaTDcBLh3cLKQMFkVeuSCOTjG7NZV5GV0%2BGIL94Z6Z6%2F%2FAKq9a%2BHmqXFhFpdqrzstwEDmUBGPzEEgdHBUqNwJ%2B7g4IreneJhV1ses%2BH%2FDuleH7FYdF06zsIlTaTCnzMP9p%2FvN%2BJNbQd4xtOHKjhzgbR6GmRHKgFQTnoRwPwqvIFZSyEBlJViDzn%2FD3qmzAmkDMXffJtHTAxjHXvkivOtZuL6LxxbvJKhaBUVQiBvMQkklhxxyBnPGc16A9w0UMrMxMZbOQckDABH09q4%2FxNPF%2FwAJdZu8LSRBArNHhwykDjB9M%2FqOtIaJdel823iNsFZEByY2LseTkKcnng4A64xxXhXiyWCHVS8QnRSrIqyKd4%2BYHLDJ28%2Fzr2TX7lLcRReWkKySbQ20AoxzggDp0rxj4gQr9twGSR2Od654BPIxnkn19M0kgexhw3arLc7IbYgyE5lJJPA6ZPSis%2BwS48t9ziE7uUDbew7UUwR9F69erFdXEccYZ2idjg9%2FU%2BuAP5V1lrNJB4NtmnmEZnuXQAjdn94x556Dr%2FwGuL8U2zfb9tsp2MJF56ksCSPr2rd%2BJM9vo2hW2mNJ%2B9toGQMeP30gIPI643n26VM1fc1jozxaGY3upXdwxAnmnd0ccgjJwPwFbd5al%2FCGoBUIbzYCccAHfyMetSfDtdJg8SpP4gjSawWMwhG4DOxIHTuMZ49K9R8SeEbbTCYdMmBs7zAWN8Fl%2BYHCknsfWsXda9DfmT93qeIWWjT3FlbTSTRW8DAKZpGxtJz0HUkAE8eh71tfD%2B3N34o0yVYpEPmo4d5C7MTy%2BT2JJZj0%2B8a7fWdPt4PCdnbWrSSRSPJcHPy4U%2FKM46dM9%2BfrXPeDLWWPxVpjxRTfZ2lwrZ%2BnJ7HHI%2BtdFPWNzCpvY9puJAq5PABwR6Vm3l%2FFuhCKzLI%2B09uc%2FwD6607m2YoAjEBjnGR0rnr%2FAExplCtdXMbphgVK5H9cfnigyI9X1dVkmihUeX5nzujAvnGMAc55Hp61xbXkdrr9vPe%2BY6ICc5DgqeuMnp3yAMflXRx6dH9smmhvZyke1iVIKjkE5GBkHGDn1z1rj%2FENjb2etQPf3LNbPEUDfL5iNkDCk545HI56g0AdlerFKsckUEcgRdyrID8rEjBGehwT%2FKvK%2FidaXF4WuVH7iNBgquO4OPcEY5%2FSunu7W6ist41G8dVONhkCgAdMcZA9h64rhvFskaaXOLnUZmd3DBXcsCOgyRyuOwxg8GhbgcPfm5tL2ZRCspYhznnaSBkfpRVGWJpZ5JMvIzNuZipySeaKsk%2BuNGtE1DxBpkUrhxDIJnB5AUZf%2BVeb%2FEnWW1LxZdQR7lhEzOWPVyD2B%2BgwPTJ7mvSfCE0NlHqOozP5UNvFIPMG7ABKqMcH5uowATnpXkunaa%2FiHxvHEq%2F8fty0fBxhMljwSScgHk5PSsmr6m0XYueGNHN42nxfK8TzqZACNwJIOAOuBzXs2iLZ6jY6jp1wr3HnWysZQSsgGcsq88bVZRnvjnpXmGkyRf25ug2Ltd5FO0qGAUcAdcDaOfbtXoXgIv8A2%2FE8qsyiOSMsRgfczjHboeen40khyegXdrI7C5jnnTEYiWXox7gemDjn2%2BlZ3hTTY11LT8pEVSTg87t2D09umR9M10N8kcCOs1shRWO4KeH%2BYAgexJ4qx4WtoftSMhZijH769xkN9ORVxVkRJm3NHtXEWeQcDGccVz%2BpWzbHEUhVtpbeOoJrq7lFOOVXHXP%2BNYmrp0IXexzgDg%2F55FBCOKubY2zARzsBnBUtnPfmuG1GBZddsoJJvtMqlztY8HoeB2Ga7XxDIYIv3SsJed4VSeAMYI7kelef6zqLW%2Bp2EskrKIiysjHLBSoHABoGdF4jlAuRCWCnhYwsZPO3jIGQOefwrx3xvJm9lhEX7yPJB6fLjGMZx6n2z%2BFd94l1OOYzTRzzFGHJC4AIwOAfX%2FPWvLPEF9HNcyvCZJCRjc68cnoR2%2FCmtxdDIinnBfbcpHzyCM84A9KKIr4RArEYVXjhotxzgZ5zRQB9S28jReBdakiLRuSF3IxU481%2B45HQVhfDyMf8JDpc4JEv2uJdwxnD5DD%2Bv1NFFQzUsTWqQalG0RYDfhUz8qAv%2FD6dTXU%2BFCU8Qecpw628oHt8jf4CiigGa87NJJDliN8zKccZB61F4Elkjv5UDkxkSfKegwy4x6feNFFWtiGdrM27YCBjJ%2FnWTqgH2dyeTvAz%2BOKKKCDhNTwreWADnKhiMsPXB964C8t4JJoWaCLf5mCwXlgUY8%2FlRRUlmBcWUVxaSBjIqKwYIshC5Yc9%2Fauav9EtVeRAZSFjyMtnpmiiqQmQ23h%2BykV94kO1to5HTA9veiiigk%2F%2F2Q%3D%3D" /><h4>Is your Postgres ready for production?</h4></div><div class="bookmark__right-side"><q>Craig gets you ready for production with this quick checklist of Postgres essentials.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://crunchydata.com/blog/is-your-postgres-ready-for-production">Is your Postgres ready for production?<br /><small class="text-muted">crunchydata.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKK1dE0C%2F1l%2F8ARIsRA4aZ%2BEH49%2FoKaTk7IaTeiMqun8P%2BD77U9styDaWp53OPmYey%2FwBT%2BtdtoPhPT9I2yuPtN0OfNkHCn%2FZXt9eTXrfgr4Z614lEdxMh07TW58%2Bdfmcf7CdT9Tgema6o0FFc1RnRGioq8zzfQPD9rp5jt9LtWkuZDsBC75ZCe3AyfoPyr2nwX8Hby%2BCXXieRrK3PItYiDK3%2B83IX6cn6V6x4R8F6L4Vhxpltm5Iw91N80r%2Fj2HsMCujpTxGnLT0QpV%2BkNDzTW%2Fg54du7MppX2jTroD5ZBK0qk%2F7SuTkfQivFfGPgvWPDDsmr2gezc7VuYxvhfPYnHB9mx%2BNfWtMnhiuIXhuI0lhcFXR1DKwPUEHqKiGIlHfUmFaUd9T8%2B9f8D212Wm0thbTHnyz%2FAKtvp3X%2BXtXnuo6fd6bcGG%2BgeF%2B2eje4PQ%2FhX3b41%2BDtpeeZd%2BF5Fsrg8m0kJMLH%2FZPVP1H0rwzxN4dns5pNM8Rac0UnXy5l4PbcrDg%2F7ymtXTp1tYaM0cIVNY6M%2BeqK7nX%2FAALLFum0djKnUwOfmH0PQ%2Fjz9a4mWKSGVo5kaORThlYYIPuK5p05QdpHPKDjuMoooqCTufBHhWK8gXUNTTfEx%2FdQngNj%2BJvb2%2FpXsXhHwfq3iSVYNFsgLdPkadxshiHpnH6DJ9qx%2FDenJcXWk6YGKRyyQ2u4dVDMq5%2FWvsnT7K206yhs7GFILaFQkcaDAUCu6UlQilFas65SVFJLc4bwT8LdH8PmO5vgNT1JcESTL%2B7jP%2BwnT8Tk8cYr0GiiuOUnJ3ZzSk5O7CuA1X4gPb6hPBaWKPFE5j3vIQWIOCcAcCu%2FrwTUv%2BQlef8AXZ%2F%2FAEI1dKKle5VOKb1Ox%2F4WNd%2F9A%2BD%2FAL%2BH%2FCuw8Ka6uv6e8%2Fk%2BTLG%2Flum7cM4ByD6c14rXpfwo%2FwCQbf8A%2FXYf%2BgirqQio3RdSCSujuaz9c0bTtdsWtNXs4rq3PO1xyp9VI5U%2B4INaFFc6dtUYJ2PAvGnwevrDzLrwzI19bDk2shAmQf7J6P8ATg%2FWvFfEPh611QSQahbtFdR5TeV2yRkdiD%2FI19z14x%2B0To9qlppmsxxql2032WRlGDIpQsufXG0%2FnXZSrc75J6nTTq83uyPh%2FV9Pm0vUJrS4A3xngjow7EUV6l4h0K21O9SadcssYQfTJP8AWiolhpX0JlQd9Ds%2FB%2F8AyNGgf9f9t%2F6NWvsKvj3wf%2FyNGgf9f9t%2F6NWvsKqxe6KxG6Ciiue1Lxho9hdvbSzu8sZ2uI0LBT6Z6ZrlSb2OdJvY6GvIdb8KavFqV28Vo00DSPIsiMuCpJPrkGu0%2FwCE80X%2B9cf9%2BjUc%2FjrRpIJEVrjLKQP3R9K0hzx2RceaPQ8103TbzU2dbC3ecoAWC44B6da9Q%2BH%2Bj3WkaXML5BHNNLv8vIJUAADOO%2FWuL8Ba1Z6HPdvfGQCVEVdi7uQTn%2Bddl%2Fwnmi%2F3rj%2Fv0aupzPRLQupzPRI6qiuV%2FwCE80X%2B9cf9%2BjW%2FpepWmq2gubGUSxE7ScEEH0IPINYuLW6MXFrct15V%2B0V%2FyKWmf9hBf%2FRUleq15V%2B0V%2FyKWmf9hBf%2FAEVJV0P4iLpfGj52uf8AWD6UUXP%2BsH0or0XudzNzwf8A8jRoH%2FX%2FAG3%2FAKNWvsKvj3wf%2FwAjRoH%2FAF%2F23%2Fo1a%2Bwq5MXujmxG6CvIfAWl2ms6pcRajG0qCEyD52U7tw5yD7ml8SeJNVbXL2OK9mgihmeJEibaAFYjt1JxnmsCyvLmxkZ7O4lgdhtLRtgkelTCDSfmTGDSPWP%2BEI0H%2Fn0f%2Fv8Ayf41HceCtCSCVltH3KpI%2Ffv6fWq%2Fw41e81O0vIr6UzNAy7ZG%2B9hs8H16frXGa54k1WfVLsLezRRLI6LHG20BQSAOOtSlNu1yUpN2uWfh7o9lrM94uoRGRY0Rlw7LgknPQj0rtv8AhCNB%2FwCfR%2F8Av%2FJ%2FjXlFjfXdgXNlcywFwAxjYrnHSvUfh3qt1qmlT%2FbpDLJDLsEh6lSAef1p1VJe8mVUUlqmR6p4O0S30y8mitXEkcLup85zghSR3rL%2BErHGqrk4HlHHv8%2F%2BArxHV%2FHXiTVby4uJdXvIY5if3EEpjjVT0UKO2OOeT3zWda%2BIdas932TVr%2BDfjd5U7LnHTOD7mtlQk4tNmnsZctmz7Bryr9or%2FkUtM%2F7CC%2F8AoqStf4K6%2FqHiDwjLLqsxnuLW6a2EpHzOoRGBb1Pz4z7c881kftFf8ilpn%2FYQX%2F0VJWFOLjVSZjCPLUSZ87XP%2BsH0oouf9YPpRXe9ztZueD%2F%2BRo0D%2Fr%2Ftv%2FRq19hV8NeFtUN3pdjfW0u2eMKSw6pIuP6jP5V9VeA%2FiTpPiaKG2uZEsdXICtbyHCyN%2FwBM2PXPp1%2BvWubExckpLY566ckpI4XX%2FwDkP6p%2F19zf%2BhtVCvTdZ8BJf6lPd29%2BbcTMZGjaHfhjySDuHeqX%2FCt3%2FwCgsv8A4Df%2FAGdSqkbbiVSNh%2Fwl%2B7qv1i%2F9mrhdS%2F5CV5%2F12f8A9CNeweFfD0Xh%2B1ljWYzyysGeQrtzjoAMnHfv3rA1T4fJdX89xbagYI5XL%2BW0O%2FaScnB3DjNRGpHmbIU1zNnmtel%2FCj%2FkG3%2F%2FAF2H%2FoIqp%2Fwrd%2F8AoLL%2FAOA3%2FwBnXWeF9Ci0Gwa3jlaaR33ySEbcnGOB2GBRUqRcbIc5pqyPkFfuilr27Uvgekt9PJp%2Bti3tXcskMlrvMYP8O7eM4%2BlVv%2BFF3H%2FQwxf%2BAR%2F%2BOV1%2FWKfc6PbQ7m7%2Bzr%2FyJupf9hJ%2F%2FRMVN%2FaK%2FwCRS0z%2FALCC%2FwDoqSum8L6Rpfw58KSRXmooIfNM09zNhA7kAcLk9lAAGTxXjPxZ8dReLry2ttNSRNMtCzK0gw0znjdjsAM478nPoOeCc6vMtjCC56nMtjza5%2F1g%2BlFcN4y8Sy22tNb2LKyxIFk%2F38kkfqPxzRWsq8U2jWVaKdjmPD%2Bu3eiXBe2IaJ%2F9ZE33W%2FwPvXpeg%2BJ9P1kLGreTdHrDIeSf9k9%2F5%2B1ePUo4PFctOtKnp0OeFWUPQ%2BwPBXxU1jQPLttRLappw4Cyt%2B9jH%2By%2Ff6Nn0BFe7%2BFfFej%2BKLXzdIu1kdRmSB%2Fllj%2F3l%2FqMj0NfnpoHjW9sSsV%2Fuu7fpkn94v0Pf6H8xXpPh%2FXobl473Rr147iLkNExSSM%2FzH8jW%2FLTrfDozXlhV20Z9vUV4d4K%2BMksXl2niyLzY%2BgvoE%2BYe7oOv1X8jXs%2BmajZ6rZR3em3MVzbP92SJgw%2BnsfbqK5p05Q3MJ05Q3LVFFcb41%2BImi%2BFg8Ekn2zUgOLSAglT%2Ftt0T8efQGojFydkSouTsjsXdY0Z3YKijJYnAA9a8t8a%2FF%2FTtMMlr4dRNSvBwZyT5CH6jl%2Fw4968m8ZeOta8VOy304gsM5WzgJWP%2FgXdj9ePQCvKdf8AGtnYhotP23dwONwP7tT9e%2F4fnXXGhGC5qjOhUowV5ndeKfEt5qsz6j4h1EybOhlbakYPZV6D8Ovua8w8ReOi6vb6MCoPBuHGD%2FwEdvqfyFchq2q3mqz%2BbfTtIR91eir9B2qjUTxDatDREzrN6R0QrEsxZiSxOST3opKK5jAKKKKACpbW4mtZ1mtpXilXoyHBFFFAHq%2FgfWLrWNNlkvdhkifZuVcbuM5PbP0xXbaB4g1Tw5dm60e8ktpD99Rykg9GU8H8enaiivVh70Fc9GGsVc6HVfiz4p1q1a1NxDYxkbXazQo7j%2FeJJH%2FAcVxf9eaKKKcUo6BBJLQ8j8V%2BINQv7y4tJJfLto3ZPLj%2BUNg9W7n%2BVc5RRXm1G3J3OGbbk7hRRRUEBRRRQB%2F%2F2Q%3D%3D" /><h4>explain.dalibo.com - PostgreSQL EXPLAIN</h4></div><div class="bookmark__right-side"><q>Visualizing and understanding your PostgreSQL execution plans made easy.</q><div class="bookmark__comment"><p>Free tool to help understand PG’s explain charts</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://explain.dalibo.com/">explain.dalibo.com - PostgreSQL EXPLAIN<br /><small class="text-muted">explain.dalibo.com</small></a></div></div>
</div>
<h3 id="containerorchestration">Container/Orchestration</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BICHElDQ19QUk9GSUxFAAEBAAACDGxjbXMCEAAAbW50clJHQiBYWVogB9wAAQAZAAMAKQA5YWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZGVzYwAAAPwAAABeY3BydAAAAVwAAAALd3RwdAAAAWgAAAAUYmtwdAAAAXwAAAAUclhZWgAAAZAAAAAUZ1hZWgAAAaQAAAAUYlhZWgAAAbgAAAAUclRSQwAAAcwAAABAZ1RSQwAAAcwAAABAYlRSQwAAAcwAAABAZGVzYwAAAAAAAAADYzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABJWAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1YWVogAAAAAAAAAxYAAAMzAAACpFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA%2BEAAC2z2N1cnYAAAAAAAAAGgAAAMsByQNjBZIIawv2ED8VURs0IfEpkDIYO5JGBVF3Xe1rcHoFibGafKxpv33Tw%2Bkw%2F%2F%2F%2F2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj%2F2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj%2FwAARCABkAGQDASIAAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL%2F8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4%2BTl5ufo6erx8vP09fb3%2BPn6%2F8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL%2F8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3%2BPn6%2F9oADAMBAAIRAxEAPwD5hCnIG0Hj0oIAPMYrpZfB2shlKrYMQOq6jAc%2F%2BPVC%2FhTXCdotY2PbZdwt%2FJqrkl2ONYui%2Ftr70c%2B2MgquKVGxwCQOtbR8Na4n37CYj2Kt%2FI1C%2Biaqoy2n3Q%2F7ZUuSXYpYqi9pr70Znmc8GldiCJF%2BhFXxpWoBsNZXAPvC1MksrgcPaTD38pv8KLMpVqb2aIY3Dr0H0qK5xtBA5FT%2FAGZw3%2BqcHp90%2FwCFLNavxmN%2FqAf8KLMFOKe5ViZXXH6U7DRMHhbBHOKfHaliSitx1odSvDKw%2BopWZfMm7ItIba%2FjxORDP2kxwfrWddWkttJtkXB6gjofpU65I%2B6T7ins5ZAkgYqOntT6ExvF6bGdRWkmmtMoeOSLaf7xwaKfKynXgt2fWMHwt1x5GaP4g3EjiYKGM6SYA%2FiIMdSN8MPFkkqk%2BM7Zi%2FmZ8yzt2wAfeLvUVt4qE1vcNb6npvnwqpKNqYCuXTcu0hMlWGcNjjB44rNX4jQWutnQ11ywkvPJ2wT3xIj8xgrIJJFhAI5Zdwx0U85rsae58jB3ulB%2Fh%2Bq%2Fq5pS%2FCzxlt3L4p0hl2qQH062J%2BY4wT5XOPWmN8JPFpUAeJNAyGcMz6ZAc7ecjCDA7Yq4vxRjka7s4r3QRqUBwLd7qRVYgYbDBSRg5PQ8VT1Hxt4ssbja0unraSKjJdNbNsXIG8cgMwHUMFwdpFNKfT9RTq0I25o%2FhH%2FIZ%2FwqHxfk51%2Fw1vLLjOnoAMjPYU1PhF4tIO%2FXfC5JC7f9CGMk9%2BamvPG%2BtWyt9p8XeHoMM6l%2F7KnKgqBuIOMEDIb%2FAHSfSotE8f8AijWJ4IdJgs9TjM00VzeOHtoLdkTcQ2Ax2kYZGHUNg9KalNdfzG40Hqo%2FhH%2FII%2Fgv4pJy%2Bq%2BFSCOosyOfzq9pvwd1mFD9pl8LSysOW8p%2Bv0rKsvHHjd9OF9NHBNaF2VbmxRLiCQAkZVlyfwOCO9QHx9rs9xADqb28G755IrVHZB67T1A7itEqrWjX4nPUqYWMuSUH%2BH6F1%2Fgv4kR5Ct%2F4TCH7oNu4x7VSuvgdrk%2B7ztS8Iq3YiF%2FX3rZ8XeMte07ULG2s5rh7e5iBivUjjlilIGWBAGVPXv0rSma91OyS50%2FX79UkTYJMIBE%2Fo6il773aH9ZoQfuQd%2FVHHp8EtajUq2q%2BEc8HJgaluPhFeRLi78R%2BDbd1GSDCRx%2BJrO8U3PjfTlm8jxBcZjX50eJfk%2F2uOSvv2rj%2FAA%2F46u21OSw8WZW%2BLY81%2BjHt%2FwDWPQ0JWdpO1yvaupTdSjBSa3V9fusjuH%2BDLynzIvFXhJkbnKw5H86KdHb2ci74JLi3VuStuwCE%2BuD0%2BlFa%2FVWcf9sJacqOck8PaHpnhCaax1u21aexmSNbhGSQWsTMckqFO3y2YNjdgqX46iuBl8d67BdtHP8A2HG0RMbodJt2KkHkZKE8HPeuzsvENjdatcWmsTJ9vul%2BzTpHabRdJtPzs5VSTtIAz615l4gt4rDUzFdWomZJDDLKzPubbjD7Qw%2B8hRuvJzXDPRJo%2Bow1Pmk41Vdnsuk%2BMNX1%2FRUfTYNJj1uRPIjuYbKMObxBlVZsDHnJkKRjD7R0JrnWsPird3PnyaX5krEFnmWEs2PXc%2BazvCxtNP0q8eCaeJxcpbyWEMkokbIJSYDcVboNrAAq23nHXvrDxHcyw2A1TURbxtIBJcPeh1Aw33VDjBb5WwcEAkHFaRhKWzscVWEaUmo01Jea%2FwCCYei%2BH%2FjFG4aCI26dMJJCo%2BmOQRzXSX918SPDdimparp8FxbrNH9pS1hh891yFDL5Y3bhxzg%2FlViXV0m08XkSSsY5Hil82fexAYhXO1iAegIzxkDsa0dLubBhHPcJNHec4aGZoii%2F3cqQT60nhpOSlzsxdZWcXRjbyVjPs7rUfD2h6le2N7o2k6bfzi5S4FndSLbZPDSxsdsO75lIUH5uO4rbvvCPiHVLmOS%2FvtFbA3iSCPbncMggqvzKe2abf%2BKpEuoFJxogPlyRI6p854QyswKmJ2OxtykKSjZwTjz7xD8Z72PVbKK3tb%2BA2aNBe2l04hKncNyosRTBGD94HB6d60T5He5l9VliY2tf%2Bv6%2F4Fzv7jR7zS9NvdHvdObVrS5G2O3z5KB8Zykx4XIyeRwR9ap%2BG7S68LaNLqH25dXshx5FvE0uYieBJJ9wsvqPTisy61661bT4ZbS7glimXzLW4bzGVufutljjng5%2B6afoPjCS30G%2F0280%2BW7vHdEitLONInL52FSNwHAIIHPOOoIzs7bnB7OSTh279P62%2FM9DS3sdWsYLq0nWa0kG63nHWLP8DeqnnINcj4i%2BG2jaoRJc2ayvbg%2FufMKlM9MMOqHt6V0mkyFFuYNH05WiimDbIYlEV1E3U7woxKrA7lPQ9D0NS6%2FqqaKkf2lLhEfcLd0QPh%2BcJuB2sGwcjJx14NKK%2ByDSi%2BeN011X%2Bf8AX3Wa8mtvBOuxq8Xh%2FXrA2MbFBFqYIngYdY29cdj3Borplk0zxKz3mqeGtWtbyNvJkTy2OSOQQQuGGCOaK0S00f4%2F8EJVdfeim%2F8ACn%2Bhxng%2Be78V%2BDtSXUriOe7tn862uWKq5ZBuIDE5%2B43YD7ven6bDBqkstlqDWyTXMfkgsUBMgyY2GeQT80Zxk%2FMuMnkef6dLY%2BDfGFnJY6jBq9rARO0sKgb4juWWM4J5MZf8xXpeseF7SW2m03RNYvbYWUCBZYUlkM5VFBjAUgfcMcikD5vMPUA48txa2Ppp1YQd%2Bj1Tsefx6Tbtod5cPqRN1psrWtwoZT50BGY5FIY5ICnpnBVR6mtu5sFl8OW9tJ4ea31OUNuuo7RDGXGcMxK4IOQQ392Q%2BnPdQ%2BH59LvReXHiHU541ilhjjm8pYdwRSjFGY4GQwIGCCwG4DJrnLjTrf8Atu0ubXUNMSPdGsEFxfyT5uB9zLxD5B87RY3cDy%2BTmp56kC44inUe9zk9G1q8sLC4M8kAfIjmUzp8rjjOFz95Rg8dV%2F2q1U8TXcUsMNyhiSdd0bbflkHfBwPUZ9iDV%2FxDJ4Y8Oao0eq2Frf3ckW6ea1b7Wsw8zcGb94qbuCGBwSAp461zt5r2lajGmj6dayQJIFit%2FLjjBDq2U3Y3dQQpYEZ4JzjFaRxVSKs1oU6FKq7pHWLrKeW0b20TxspUrISwdCMFWGeQRkH2%2FCvP%2FG1gbpjdxSPJe28e4u3LXFuuAGJ7yRjCt%2FeTa3ZjXRaNpOq6lZuy6TqULRsR%2B9gZcDsdxAHsfcfSo7nR9Rj4aW1tZo23xtJdRbo2H%2BzuJI6gjHIJFaSrU6is3qKjQdKXNFmv8NruRfCMdlodhpL6o8gkmk1ba0QaQ8AL1B2KNoGd3z%2FxLg9rdx%2BOI9Jjkm1qx0uUMS5trBBbiP5cY3opHRuS2Pm7Dp5TpGmPp%2Br%2FAG2y1OysGQlWj82bzIScbljIjPHQq4zj5e4NbB0zSLzVv7Uu31G4vQyzGaO3kSIsuMPtcKqjgEjdtHOOMAXB3Vl%2BZzV6FpuT9drneX9%2FAYrWOPS7W9cRtJqk%2BnXNuoiI4MyxeYW7EsOBjPvU0Ol22qWEmnXUMT2c0i3FpfWWrsY5MZ%2FeCJW4cEdRweR1609N03w5NfyahD4cQ6gH3szEuysMjgJ5mB1xgdgOuM27DStD0i3lsbzR4ho1zKZWW5nYCJz%2FABIHeJU9cKOQAR2rbW1nseXKlBPmho%2F68%2Fu%2Fplm48Fu3l%2FZvsVwgXBe4jmLE5P8AtHj8fWityW8sI9g1HT9Hu2KgxXCxoyyx%2FwALA4c889WzRVc7MfYHx5bSQDU4XCBLfzF3K5ONufmyRzjGelfWuraLFrGiaRaXOrvIY5VtkWzhMhkVQTvx5oLDyyg5zjANfIMTASIzZ25BIHXFfR%2F7OE2najpOpaaFiivSzIJwn73BX92%2B485Hzrx2rioNO6Z7%2BcU5JQnF7afftr%2BHzNyx8EaJquo65Fp9l5I0544omW9hEpkYEkXAKFkIxxtPOfWuT1Dwnq1lqV95eiX%2BpWMkiqjtYzXIlUjdGf3bod6%2FcYsQPkiPUV19lZXuufabXUUlvrJzLBeI12I2Y4xxnr356jA4raudKttKtLWC%2BDiHaEhjubu8u2YAZwEiCKeBnmtp0VseFQxcmubVf1v%2FAF%2FlbzO48O%2BI0uGuzoNhpyzMXZ7m106wIJ6nMrTOPwqxaeHtbu5fKPiW2kicYaK0u728x7bLWONP1rtrLVtEN1JFo1qJbmKMysLOwtbYov8AeZpS7ge9WdP8WaHqllqAudcslubZCxiutVmmjUdA77NiYDYBAB%2FCsnR7nXHFyk7RSv8A18jm4%2FBCwX0V%2FeyX7ShAkzyadb2wmI4zuu5WccBe3UZ71rW2i6VK7hBO5BAVU1CSXI91tYsD6bvxrhbzx7qNxBcnwnbSNe26q8r2fh6NYo16lmkZ5HxjkEgZrh9Q%2BJHiG%2FBF74lvpFPVIpGUfkm0VDpQ6nbBYiauv%2BD%2BCPd7vwtZwRvPDa2lrIygM01v8zoD90m5mHQkkZWufvNR0222xy%2BI4gRhVihu0%2BgAW2hz%2BAavBbvWYrp%2F9XdXE2eC7gk%2FzNXtItNaub2JrbTGgMZEivLESNwII%2B%2BQDzUezgn7rOhQqRV6r%2B%2F%2BrnrtxcLvIistZumKnGbGdgRgk83EmOit%2FD2qnqGq6ppAikGkvHbzZYzCeALEvXe5gQlRyTnP973rpbiXxFf20U8%2Bg6jFcIQ80k0gWFJBuztdsrjc3r0wOwrmNZurS2%2B0Pe654bsot4YW0l79uZeMHCQh%2Bc5P41rGpKPW5grVHZxNW38VeJ7BWhtdW0SKIsWCtLcTHnvuZv8A63fvRXF23irw%2Fp0Zt7fxPfmJWYqttpAaJATnau91YAdhjiitPrAPBP8Al%2FD%2FAIB5x4x0v%2BxvFerafjCW9y6p%2FuE5U%2F8AfJFdh8EtdbTPEoht8C6mCmEhAxZkbfsyegYbhwM11A0HWfEMsd%2FJ8Phc6klnEtxc3dy3lybFCCQIMdRt4zXRnwv4h0WKRtU17w14ViiiSVEtEiiZt2OAx3PkA%2FpRTpqM%2BZPT%2BvQzxONdbD%2BxlHWy1ut11Vua%2Bq62uaXjC3vPD3ivU9Y0%2FWJEWBBfKj3SrIqv1URkoD17k15prfxZ1LVnjR%2Ft160QPlebKqBcjH3Ylz0%2F2s1s6tF8LrWWe81bxJqniW%2FDou%2BCIyM%2FGSMyHGByMiqbfFTwxpC7PDXgaHIk3JLqd1njsCiAAj6mrnV87fiY0MDdO9Ny8vhS%2B7f8Do%2FAHiOHStNiGgeH9ds1uIiuoQWdvHHzgYdJ3beNpXPcEE5rZ1Kw%2BIuvX2oTaPp39h6VduX%2FANLQSSbZFG8F2wmw4ztB2j0rzY%2FF7x%2FqzNa%2BHBHYRN8gh0awAI5%2FvYJ%2FWpk%2BG%2FxU8ZL9o1ePUDDjd52r3xRQPXBPH5Vn7X%2BU2%2Fs%2Bz%2FeyXo9X%2BN7nc6la3CiaXxV8U7OwnaHy5bfT7pUZwgxlkiD5JGeQc9sVwzT%2FAAn0dyLS31nX5F6GO3EMbcd2lZu%2FotTw%2FCTQdKJbxP4%2B0qFlHzW%2BlQtdyfTI4B%2BtOM%2Fwf0Lbt0%2FWfEVwnVr66EKE%2FwC7Hk4%2BoqJSb3N6VClC6g2%2FTT70v8ijL8ULCyiWLw%2F4M0Sy2%2Fx3s73Dn6omxfwxiren6z8VPEmU0G11WC3k%2FwCgPpS2iAenmhVP5tS%2F8Loh0gFPB%2FhTQ9ICn5JYrNTKPq77s%2FkK5bxD8WPGGvK6Xus3PlMeY1kYL%2F3znb%2BlZNnXTw9vhhb%2Bvv8AwOn1H4V%2BL9RufP8AGur6bYTqoGda1gSy7R0%2BRNzGqx8K%2FD%2FRWB1jxo946j54NJ0wDB9nnPP1C15dc393dZ%2B0XM0gPUFzj8ulVvpxSudCoSas3Zdv6%2FyPVT4h%2BGVofKi0DxHqCjnz5tXMTH%2FgKRhR%2BFFeU0UczH9Vj3f9fI7LWfib4x12KRb7XrwRMoUxwN5KkccELj0FcfPK8rl5WLuerOSx%2FM0UU5yb3Y6FKEEuVJHq%2FwALPh3pHiqNJNTuL9eRlYZFUH%2Fx0mvdpfhX4L8JaRJfWmg297cR4Ia%2FZphn6ZFFFa0UnG55mOqSVTlT0PHNf%2BNXiq11GfTdFTStGto2IBsLNUbH1bdXmviDxn4g1u5P9q6pdXZB6zSs%2FwCQJIH4Ciiom3c3wkIytdGFNPLLxLI7gdmYkflUdFFZHppJaIKKKKBjVYkn2paKKACiiigD%2F9k%3D" /><h4>How We Develop and Operate Pirsch</h4></div><div class="bookmark__right-side"><q>Learn how we operate Pirsch on Hetzner cloud using HashiCorp Nomad, Traefik, Letsencrypt and more.</q><div class="bookmark__comment"><p>One (German) company’s stack based around Hetzner cloud and Hashicorp tools</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://pirsch.io/blog/techstack/">How We Develop and Operate Pirsch<br /><small class="text-muted">pirsch.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPJfidPqDaBJrNnqdzY28Oq2MDXMUPmAW0cw8yUqP4fMYsccMsag8GsfVPHni2DW%2FEsUUkCCyi1ExWbWrM6RQwF7e4UhOd7BT8zbTu2gZFeueH%2FEWk%2BIo55NFvY7yOB%2FLkaMHCt%2FdyR1Hcdu9YOg%2FETRdS1G70%2B7uYbDUIby8tlgllzvW2dgz7sAD5V37Scgc9OaYjlrnxH4t0%2B7ujcXwuIbLw6usSpBpe5pp3aYCNBuHyrtTIzuO0cjJrkLjV9f8AGEOmaVqepGeCPxDZxtJFaDbcwSW5lVnwArIro444PfJAJ9R1L4p%2BGLS0s7iG8a7S5vYrPEUbBo%2FMG4SMpAOzbyCAd38Oavn4h%2BFUnvoZNZhikssG4EqOnlgyiIEllHBdguelMDzKX4g%2BLlg16VH3XkFhqM81idOK%2FwBlyQyAW43n%2FW%2BYpJxznqMAVreJPEPjPSrvU0g1OCb%2BzE0uRgdNytw1zcPHIow2QqrtOASflGTyc9yfiD4WGm%2Fb%2FwC2ITb%2BfJbfKjlxIi7nBQDcNq%2FMTjABBPBp114%2B8LWr3qza5Zg2cKzz4YsEjYIyNkDB3CRNuPvbsDPNIDK8E6x4nu7XUbe5is9RmsNWuLF7qd2sy8S7CrhFjcMcMw42j5R6nHeiuFsPif4fmOove3UVpb2949rbyMzObrZBHKxVQuQQJMFevymteHxv4cmvrCzh1a2knvo4pbcJllZZATHlgMKWCnaCQTg4oA6OiiikMKKKKACiiigDltC8E6Vp%2Fh6x0rUba21VbSSaWOW7tkYhpJGkJAIODlsZ74rHuPhlZ3UIgur%2Bd7dtR1C%2FkRUClhdxyoyZ7bRMcN7V1o17T9yhpiu4AglDg5JHB74xyegp76xaRyBZGkVTEs4cxnbtOeenGMc56ZHrT1FocDZ%2FCk2unBItb2X8d1Z3ENzHYRIB9m3BFdRy%2BQzZJbqeAOhsXHw2urt9eF94hkuI9Wuobpy1mnmRmGeOSNA%2BclFVCgXoNzN1Jz202s2cLKJJGXciOCVwNrk4PPT7pzmmxa3ZSBmVptgON%2Fkvg%2FKG9PQ%2FnxRqGhxOvfC2HU9QvNQi1Nor2e9nulaW1SaNFlgiheMoThuIVYN2PYjipn%2BGFqumaraWmpT273U1jPbypBHm2e0jiWM7QArDMQJXAHJAxXaQ6vZTXCwRT7pWIAUI2c4zjpxx19O9Vjr9sgjMsU8fmJ5i7lH3cZByDxnoM9%2FqKNQ0Ob0b4fGx8RW2s3WsT3l3Hfz6hJugRBI8ttHARx0AEeR35wc9TnaN8K%2F7KufDz2%2Bu3CR6TDbxMYrdI5ZxCXIUyKc7G34ZG3dOCuTXodlepdtKqJIjRNtIcAHvzjOccd6tUXCwUUUUhhRRRQAUUUUAVRp1kGyLS3ByDnyx2p8tnbS7fMt4X24A3IDjHT%2BZqeigCNreFhhooyMAcqOg6D8MmoV06yV1dbS3Dqu1WEYyB6foKtUUAQpaW8cvmJBEsn94IAf88mo106zSN41tLcI%2BQyiMYOcZyPwH5VaooAiht4YC5hiSMucsVUDJ96loooAKKKKACiiigAooooAKKyrzWVt78Wy208uCoZkUnlv7vrgcnpgHjPSrZvUGqCxMcvmGHzg%2B35CN20jPryOPcUAWqKKKACis681WO2vVt2inYfL5jqhITedqe7ZPHy5x3wKiv9bjsr1reW1uWCiNjIgVlw7qg43ZHLdx0VvSgDWooqhq%2BojTYUleCWVGYqTGB8p2kjP1ICj3YUAX6Ky9T1iPTrWGa4tro%2BajtsjQMVKxtIVPPXCkD1NaUbiRFdejAEUAOooooAKKKKAKV7pdjeyB7u1imcADLrnoQR%2BRANR3t5Fa3YZ7V5JAoG9E3MFJOfwyF49xWjRQBlLrCvG8i2tyFUISGTafmbHT9av2dwt1AJYw6qSRhhg8HH9KmooArzWVrNcJPNbQyTpjZIyAsuDkYPbms%2FULyCC6lWewMq7ULuqBiwGSuR7Hp7njvWxRQBVsr1bppFWKaMpg%2FvFxkHOCPyqW5t4rmLy7iNZI9yttYZGQQQfwIBqWigChqksaGNZ7T7RFh2J27tvG09fUMR24zTbXU0kmSEWtzEC2xS8eBjaTn6cYrRooAKKKKACiiigD5TwKMCiivuj8YDAowKKKADAowKKKADAowKKKADAowKKKADAowKKKADAooooA%2F9k%3D" /><h4>GitHub - timohirt/terraform-provider-hetznerdns: Terraform provider for Hetzner DNS</h4></div><div class="bookmark__right-side"><q>Terraform provider for Hetzner DNS. </q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/timohirt/terraform-provider-hetznerdns">GitHub - timohirt/terraform-provider-hetznerdns<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>6 Docker Compose Best Practices for Dev and Prod — ReleaseHub</h4></div><div class="bookmark__right-side"><q>Docker Compose is an excellent optimization tool for development and production. Learn best practices for Docker Compose</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://prod.releasehub.com/blog/6-docker-compose-best-practices-for-dev-and-prod">6 Docker Compose Best Practices for Dev and Prod — ReleaseHub<br /><small class="text-muted">prod.releasehub.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A9%2BtT0rVg6Csi17VqwdBXBSZ6ldF%2BOp1qvHVha7InnzHUUUVZmFFFFABRRRQAUUUUAFFFFAHJWvQVq2%2Fasu1FakA6V59I9SuXY65nx742h8IR2YNoby4uSxEQkCbUXGWJwe5AAxz6108Qr5z%2BJms%2F214yvpY23W9sfssPORhCdxH1bd%2BlPF13Rp3juzfJ8DHG4i1RXild%2Fp%2FXkfRumXsOpada3tsSYLiJZUJ67WGR%2FOrNed%2FA%2FVftvhN7F2zLp8xjA%2F6Zt8y%2FzYf8Br0SuqjU9pTU%2B55uNw7w1edF9H%2BHT8AoooNanMcT43%2BINr4V1ezsZbR7kyIJZ3WQL5MZbAIGDuPDHHHA612qOsiK6MGVhkEHIIr5d8b6qNb8WapfBt0LymOL08tPlX88Z%2FGvbfhBrP8Aa3g23ilfdcWJ%2ByyZPJCjKH%2Fvkj8jXn4bFurWlB7dD6LMsojhcHTrRXvfa%2Bf%2BWx21FFFegfOhRRRQBy1qOlakA6Vn2y9K0oR0rhpI9KszL8a6z%2FYHhXUL9WxOsflwe8jfKv5E5%2FCvmcDAAyT7nvXsXxple7fTtMSXYiA3TjGQzHKrn6Dd%2BdeS3NpNbcyLlf7y8ivKx2IjOt7NPY%2Bu4fw6pYb2j3nr8tl%2Br%2BZ2Xwe1uLR%2FFbR3cyQ2l5CY3eRwqq6%2FMpJPH94fjXuH%2FCSaH%2F0GdN%2F8Co%2F8a%2BVSMjB6Umxf7q%2FlV4fHSoQ5ErlZhkdLG1fbOTTsfVf%2FAAkmh%2F8AQZ03%2FwACo%2F8AGsTxr4v02y8K6lNp%2Bp2U155JSFIbhWbe3yggA54zn8K%2Bb9i%2F3V%2FKlCqDkKAfpWssznJNcpy0%2BGKMJqTm3Z7W3BQFUKOgGK9A%2BC2s%2FwBneLDYytiDUY%2FL5PHmrll%2FMbh%2BIrgVUswVQWY9ABya07Cyure4huklEE8LrLHjkhlOR%2BorzoV1Qmpt7Hu4yhHE0ZUZfaX%2FAA34n1VRVfTrpb7T7a6jGEniWUD0DDP9asV9WmpK6PyuUXFtPdBRRRTEc7bjpWjF2rPgPSrsTVz04HbVZ5r8V7dk160uCD5c1sEB90Y5H%2FjwriSAQQQCDwQe9e3%2BKdFi1%2FSmtmYRzofMhlIztbHf2PQ%2F%2FWrxrUrC60y7a2v4WhmXnB5DD1B7j3r5jNsJOlWdS3uy6%2BZ9hkeNhWoKlf3o9PLuc%2FfaYRmS1GR3j9Pp%2FhWXXVVTvrBLnLrhJfXsfr%2FjXJSxFtJnvKXcwamtbaS5fbGOB1Y9BVu30qZn%2FwBJVok647t9Pb3rXjRYkCRqFUdAK0qYhR0jqwcuxFaWkdqvyDLnq56mpycAn05o6da7nwD4QnvbqDUtSiMdjGRJFG45mI5Bx%2Fd7%2B%2F0rCjRqYqpyR1bOTFYqnhabq1Xp%2Bfkj0rw5avZaBp1tKCJIbeNGB7EKM1o0UV93CKhFRXQ%2FMqk3OTm%2BoUUUVRBzMT1ajkrKjlxU6ze9bxpHRNmoklVdY02y1m0%2Bz6hF5iDlWHDIfVT2NQrN71Ks1VOhGcXGSumRGcqclODs0eV%2BI%2FDF7osu7BubNjhJ0X8gw7H9DUFlpwjw9wAz9k7D6%2BteveYrqVcBlYYIIyCPeuX1nw9s3T6aCy9Wg7j%2FAHfX6V8bm%2BR1aSdTC6x6rqvTuvx9T6jCZ7KrFUq%2Bj79%2F8v62OWuII7hNsoz6HuPpWPJptyLhIYInnaQ7UEa5LH0xXUabp1xqM%2Fl26cD77twqfX39q9A0TS7XSoiIRvmYYeZh8zew9B7V5eVZZXxb5tod%2FwDL%2BrHRiM1jglyrV9v62Of8IeBIbIpea0Enuhhkg6xxn3%2FvN%2Bg9%2Btd7mqwkp3mV9vQw1PDQ5KasfK4rFVcXP2lV3%2FJehPmjcKrmSmmX3rW5zqJY3UVVMtFK4%2BQ4tZ6eLj3rIE3vSif3r31RLZtLce9Srce9YYuPepFuPeh0SbG6lxU6T%2B9YKXHvVhLj3rGdILG6s%2FvUyzVhpce9TLc%2B9ck42KUDaE1L53vWQLn3o%2B08da5JuxpGlc1TP70wz%2B9ZZufeomuveueUzeNE1zP70ViG696KjnNPYHKbjS7jRRX2pwChj61IGNFFSwJVc%2BtTI7etFFc9QpEyu2etTCRvWiivPrG0R3mN60GRvWiivMqnVBETSt61C0r%2BtFFcUzrgkQmZ89aKKKyNrH%2F%2F2Q%3D%3D" /><h4>21 Analytics / GitLab Runner cloud-init · GitLab</h4></div><div class="bookmark__right-side"><q>Set up your own GitLab Runner within seconds using cloud-init on Hetzner, Exoscale, Azure or any other public cloud provider.</q><div class="bookmark__comment"><p>Comes in handy to auto set up Gitlab Runner like this.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://gitlab.com/21analytics/gitlab-runner-cloud-init">21 Analytics / GitLab Runner cloud-init · GitLab<br /><small class="text-muted">gitlab.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPPNf8X6lf6X4hbw9ppay0%2BxLTXUlyYZxI9uJgIo9pyVR4ySzLy2B0NXrO%2FuruHwtZx3MrSCzTUr2QSEM6LGAqsf8AbkYH3CNU%2Bq%2BBra%2Bm1HydV1aytdThEN%2FbQSqVuMR%2BWGLOrOr7AqllYZCjOcVr6RoFtpfneTLPI0sMNvulYErHEm1VGAOOWb6sfoGI8z0j4ta1qUPhmaLwnEIfEMcsdkf7RGTcR5JD%2FJ8sfyn5uW4%2B70Bmi%2BLd%2FJpWjtH4a87VrzVrjRpbNLwAJPErHKuVwVJAySBgZPOOem0n4baRpdr4Tt7e51Bk8NSSyWheRCZDIGDeZheR8xxjFNsvhno9ndWVxFdaiXtNXn1pA0iYM0qkMp%2BT7gBOB19zRoGpgzfFK%2Ft%2FGy%2BHrnSdNgmimtreaOfVBBNM0iqWkt0kRVljUkj7wZscDPFY3gHx%2FfDxNqfhaAyavrE%2FiG%2FJ%2B2XbKlnZRuACCQSehCxr752iu41%2F4cWGu6q9zf6trT2Ml1FeSaYblWtmljIKkBlLoMjlUZQaib4W6IJDcQ3OoQX41mTW472N4xNHM%2F3kB2YMRHG0g8d6NA1O9ooFFIYUUUUAFFFFABRRRQBRi1azlcqkpyFLkFGGABnPI9Dn6VGNc08x7xcfJt3Z2NjpnHTr0468j1qeLTbKJVVLSABVKD5AeCMEfjS%2F2faBERbeJVRg4CLtwQQR091U%2FgKegFVde05mwtwCuCS4U7VwQOT26%2F5yKfFrVhK8SpcZaVgqDYwyTjjp7j8x61ZSxtI1KpawKp6gRgA9P8B%2BQpPsFpsVPs0G1fujYOOMfy4o0As0UDiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRWVeaytvfi2W2nlwVDMik8t%2Fd9cDk9MA8Z6VJLq8Eetx6Wyy%2FaJI%2FNDBflx83GfX5TQBo0UUUAFFY19r0VneSwyRgrEyq2JF38ruyE6kD19j6UureILPS7hoboShgIipAGH8x2XCkkZ27ST6CgDYooooAKKKzrfVYp9Re0WKcYLKsjIdrMv3h6gDK8nAOeM0AaNFY0PiKyfUEspPMhuJJpIYkkXBkKdSB1wQGIPopPatmgAorG1nWbjT7pIoNH1C%2BVkDGS3ClQckY5I54%2FWinYVy5e6XY3sge7tYpnAAy656EEfkQDVe%2BmtbbUFmksjJcKoUTJGGcKc9D1wDx%2FwKtWikMyl1hXjeRbW5CqEJDJtPzNjp%2BtX7O4W6gEsYdVJIwwweDj%2BlTUUAQXFnb3H%2BvgikOVOWUH7pyv5HkVm6jcWwuZEutPFwoUBm8sOSB8wyCOmenPWtmigDLbWYVCkwXRJ7CPp16%2FlSf21HtLfZbwgDccR9v8AP%2BeK1aKAGxsJI1YAgMAeRg1DHZW0Vy9zHbwpcPkNKqAM2cZyep6D8hViigDnxcWMV3IX0nEnnkiSOEMWfP3s468A5%2BlbVncC6gEio6DJG1xggg4%2FpU1FABRRRQB%2BdPlp%2FdFHlp%2FdFFFecfaB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFFFFAH%2F2Q%3D%3D" /><h4>mrsked/mrsk: Deploy web apps anywhere.</h4></div><div class="bookmark__right-side"><q>MRSK deploys web apps anywhere from bare metal to cloud VMs using Docker with zero downtime. It uses the dynamic reverse-proxy Traefik to hold requests while the new application container is started and the old one is stopped. It works seamlessly across multiple hosts, using SSHKit to execute commands. It was built for Rails applications, but works with any type of web app that can be containerized with Docker.</q><div class="bookmark__comment"><p>Very simplified approach to deployment. Used it on a side app already and happy with the result. Comparable with docker-compose, but for manual orchestration.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/mrsked/mrsk">mrsked/mrsk<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A9nooor8ZPqQooooAKK53xr4u03wjpy3Oos8k0uRBbRY8yYjrjPAUcZY8D3PFeM6p8ZPElzK32CLT9Phz8qiLzmx7sxx%2BSivTweU4nGR56atHu9jGpiIU3Z7n0RRXzfZ%2FF7xZBIGmmsLtO6S2gXP4oQRXqvw%2B%2BI9h4sk%2BxTQ%2FYNWClhAz7kmA6mNuM46lTz9avF5LisLD2kkml26fkyYYmE3Y7uiiivJOgKKKKACiiigAooooAKACSAOp4op0f%2BsX6igGfOPjm1vfFTeK%2FFrGU6Zpl3FpVkiru81vMCYHsMlj6s6iuE1fT7jSdSvLG9TZcWb%2BXOByEbAyCfYnH1FfW3wp0K2j%2BEuhW19AkkdxGNQn3jAMry%2BcGJ9Qdv8A3yKS98JeCPFl94iSOezu7zUPs7362d0jvG8RPlyYGdhPIPZsfWv1ejSjRpxpx2SseG5czuz5LGmXpa%2BX7PIDY25urkEf6qP5eT%2F32ox716Ynwa8S6f4SHiSK9hg1S2j%2B2pp6owlRVG77%2BcbwBnbj2zXu82meD9M8X6jcXM%2Bm22sa1bIlxaXFwii4jU4DCNj3IwSOu315rsAgcgSLlH4ORwwPH9a0aT0Fc8z8Fa8viDQbS9JG%2BWFJTjuGH9DkfhW%2FXl%2FwXYw6HYQZ%2BVGubcfRJXx%2FKvUK%2FMMfRVDEThHZN%2FmezSlzQTYUUUVxmgUUUUAFFFFABSocOpPQEE%2FnSUh6UAZuveBNL1Pw4si6VBq2o2dl5FjbX13KLUtHkIGjDBOe5xz6jrWn4N0mXRtF01f7D8P6PqVxEPtkOmwhEDgEkAqOQOO55zyetafhi7%2B02t3EceZa3UkTAdgcSL%2F464qPXdf0rRb63Orahb22Y22oz%2FPk452jnGO9fq9OoqtOM47NJ%2FeeHy2Zh%2FE3Q7%2FVtDVrDwz4a17UhNHH5epoMLCSd5VzggjOeD3JwTwdfwt4N0XwrevNocd1ZwMm1rUXsslsvIO5Y3JCnjqMcE1sabqFnqlt9o066guof78LhgPrjp%2BNYPxK1f8AsfwffPG2Lq6X7Jbgdd7jBI%2Bi7j%2BVaJiaR554DsxpekeGFlULNcWzXMu05%2BeaWVh%2BjLXf1yOhQma%2Bs18sLHawxx4XoojQKv6iuur81zSrGriZTjsz16CcYWYUUUV5xsFFFFABRRRQAUlQahdxWFjPdT58uJdxA6nsAPcnArzi%2B8UardSsy3LW0Z6RwfKAPr1P1rWnSc9jqw%2BEniLuOyOvv9Vn8I%2BIV1gwvPpN6iQXsSkbldM7JFz7Haf%2FANVcLrFrcP4ftPE2n6pp7Xdxu%2FtGO4ijuHWcu2MKwLYxgYA4AzjFUZXeZy8ztKx6mRixP51kXduYHLiMsnZlGSPY19llOYQVFYes7NbPy7fIxxeUVaEva0ve7qx3OmWuo%2BG9Ft%2FFWoy6VFeGeE20VnEkLXUJbEgYIcMNpOBjIIzxiq2ueJ08V%2BKIprl1trG1B%2Bx20h5Y%2FwB5j03HAJ9MADua4eJJJji3hOf7zDAFallaLbKTnfK33n%2FoPatswzOEKbpUndvqTg8oqYiXtKy5V2R654Zt9li0%2FBMxyCDn5R0%2FrWtXjVvPNbPvtpZIX9Y2Kn9K6HR%2FFt7bXCrqErXVsThiwG9B6gjr9DXxtWjKTckz0KmVTgvcdz0Wio4Jo54lkhcPG3IYd6krl2PNCiiikAUUUUAc34%2Fl2aAqf89Z0X8ACf6CvOa9judMtdVaG3vYUlTf8u7Pyk8ZGCK82%2BMMWl%2BBVtbkrN9mkTLCMbzuLkDAZunHrXsYLCTrUXOHR2t1uz1MDjqVJexno9Xfp%2FWhi0Vw3%2FCz%2FD%2F9zUP%2B%2FC%2F%2FABdaGg%2BOdI1zVIrCyW8E8gYqZIlVflUk5IY9hXTPL8TCLlKDSR3wzLCzkoRqJtnVdetJUpgmEImMMohP%2FLQxtt%2FPGKiBHqPzrkcWtztTuFFeheGvANvqmi2WoTXko%2B0R79i4AHJGM4PpW2Ph7pkEMjkeYVVm%2Bd2PQH0Ir1KeT4ipFS0Seu55FbO8NSk4atrTRf52MTwVOzRGMn5WiV8e44P9K6iuX8J2pD%2BdFsWFF8srznkA8V1FfOYi3PoeNdSba2uFFFFYAFFFFAE1j%2Fx%2B2%2F8A10X%2BdeU%2FtTRwywaLHc7fIeSJZNxwNvmtnJ7CvVrH%2Fj9t%2FwDrov8AOvJ%2F2sLG5v8ARraKzheaVYRJsQZYqJTnA79a%2BryK31eV3b34%2FoZxbVa6V7Rlp30ehwcnw70xEmku1h%2FtG2e3iiS1gEtu%2FwBo3BCWH3sFDyqt7Zra%2BC%2Fw30m8%2BKus3Gow2VwmgQwsYIZFlhNzIzbW44ICoTj%2B8RnoRXiFjrOu2ulSWn2G4kfgRytE2VHuMYYjtnp716D%2BzR4g1Twx40vTe2d02kX8O29lZCDGynKOM%2FeOSRjuGJ7V9LTiqN51JWS8y8fi4YuEaVCF5Sab921na1tN%2FwDLqfZ5ZmUqxJUjBU8gj0xWf%2FYulf8AQL0%2F%2FwABk%2FwqtH4n0GSNXXWbDaeRumCn8QcEU7%2FhJND%2FAOgzp3%2FgQtaOpSlu0%2FuPMjSrw2i18macMUcESRQRpFEgwqIoVVHsB0ptz%2Fx7Tf8AXNv%2FAEE1nf8ACSaH%2FwBBnTv%2FAAIWs3XfFenLYTxabdxXdy6lAYTuVMjqT06dqiriaVKDk5KyJdGru4v7mc94S%2F48Zv8AfX%2F0EVu1jeFo2SxkYjCu%2FwAvuAMVs1%2BZ1vjZ6kNgooorIoKKKKAJrH%2Fj9t%2F%2Bui%2FzrkPjH%2FyF9L%2F69m%2F9GGiivocv%2FwCRfV9V%2Bhtgf99h6P8AJnAb3%2Fvt%2FwB9GkLE9WJ%2BpoorjPqhKKKKACt3w0oZtrDKmZAQe44oooPPzT%2Fd38vzPTAAoCqAFHAA6AUtFFeUfPhRRRQB%2F9k%3D" /><h4>Load Balancing</h4></div><div class="bookmark__right-side"><q>Great explanation of Load Balancers from first principles</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://samwho.dev/load-balancing/">Load Balancing<br /><small class="text-muted">samwho.dev</small></a></div></div>
</div>
<h3 id="devops-software--opensource-tools">DevOps software / openSource tools</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAAAZQQA6AMAAABlBADoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A8vooor9bO4KKKKACuU8a%2FwDHxZ%2F9c2%2F9CFdXXKeNf%2BPiz%2F65t%2F6EK8vOf9zl8vzRFT4Tm6KKK%2BKOcKKKKACiiigAooooA9PorSfQtUQoGspQXRpFGRllXGSOf9pfrmkv9E1PT4DNfWUsEQbYWfH3ssMdfVW%2FKv0JYqg2kpq721WvodVzOooorcYVynjX%2Fj4s%2FwDrm3%2FoQrq65Txr%2FwAfFn%2F1zb%2F0IV5ec%2F7nL5fmiKnwnN0UVNDbTzo7wwu6IVDuB8qljhcnoMnjmvijnbtuQ0Vqa3oV%2Forut%2FGibLqaz%2BWRWzJEQHxg9AWHPf8AA1l0CjJSV4vQKKKKBigA9TiikJA6kD8aKLoD1FXbYrK77GyFIY4PTOD0PbNIzkKdznHfcxxXu2v%2BFpPEaW0N7rFxbaJbanrV3OgijK20MNw4Pl4XcSS38RIGTgcAVieEfDPhO9Nr4h8OX%2BsyCy1nT4PseoRxAgSTxqSxUYYENkYxjBBzX20czpuHM1r5Xa3aV3br%2FXQ6OdHkQIIBBBB7ilr1rxR4Y8Ma3rnjgafqOsLrWltc6jcq8Ma27xq%2BZI4sfNuUHALEAnBxis341WPhyw1HSo9Btrq2upLGCV08qJIWiZW2t8vPmkj5j0rWlj4VZxgou78ttE%2F1BSvoeb1ynjX%2FAI%2BLP%2Frm3%2FoQrq65Txr%2FAMfFn%2F1zb%2F0IVjnP%2B5y%2BX5oKnwnN1r%2BGtO1rWryTSvD8F3cz3UeJbeA8OikN8%2FbAIByehxWRXu%2F7N2i2127Xa7VupJLm2lf737sRwSqCucYLI%2FP%2BGK%2BKZztXOW074Sawbm9g8R3lrpE8EpjnSQG4li2wfaS3yZUjy8nAbJ54yK6nwX8LvBfiF5bSy1LxHq18qgGS3hitIV3cK3735iM9sdAfSvW%2FifbyaF44fV4ZbOWbUrrS%2Fs1m7PueYGaJ9xClVRoiwyTztIx0ztS6NbS2txFp2qaVonmZium0qygMuzaV5ZslBhyd23o3bNdVONN0VOcXfp%2Bunz029TOpWp0knUdj4UPBI9CRWx4e0C61mTcn7q0U4edhx9FHc%2FpXr%2Fij4fWU%2Fjx4%2FD1vfeII3s0v7q5lCEkl2EjBAqDjCfKATz71d1%2BGyh%2BxHT4raBHgDNFaymSJMs20AnodgjLL2ZiOOg7MvwMKtaEat7Svp6d%2B1x0asKqjKLupdUc3p%2Bk2NhbLBb20ZUclpFDMx9SSKKvUV9tGjTilGMUkjsO48L%2BPb%2FV%2FEOm2cEek6exudQmb%2B0J2Nvci5cyNA%2BF%2BXk8NzkqOOcHe1a9HgjwVOtx4e0vQp5NVs7qy0uC%2B%2B0Sz%2BVIkju8nJ2YTA4%2BXpjkV4b9mmcIPs8pEo%2BTMZw456cYPQ%2FkaalrICdlrKDg5xCwPAye3Yc%2BwryZ5bSlNOLtHdrXWzb3v37p%2BTQnBXOptfGUkGu%2BK9T%2BwRudftrm2kiMxAhEzAkg7fmxj0GfaoPFfikeJLHS1u9KtodTs4Utnv4pnJniRSFUxn5V5Ocgnn2rA%2Bzz4z9nnxkrnym6jqOnUdxTXiljVWkikRX%2B6WQgH6ZrrWHoqSmlqvN9rDshlcp41%2FwCPiz%2F65t%2F6EK6uuU8a%2FwDHxZ%2F9c2%2F9CFcec%2F7nL5fmhVPhObr1f9nbULDQvGT6nq2o2lhbS20toslySqFiFcgt0U4XjPUnFeUVf0m%2BFpMyzM32STmVBEkm7AO35X469%2BoBOK%2BLXmclXm5fdPvzxXpvhHxdotlqOqalCLBTHewXsEqxnbGCykS4ztGWPUYyaxAunJpur3%2FhrRrXUb3bLcW3lrHi7k3ZUgkkEMOcjAPbmoNf%2BIPg%2FwAFeDdL1bSrWzu7Ce5j03%2FR2VgqEZYZycAKCce2MCvBvA%2FjV9C8X%2BJdM8KrJLYyanJJYRwIXRYjIR8u052%2FcIRAC395RWuGjOb9km%2FL%2FhvM5qNSOJaUop%2Fjb70a3hT4tQS%2BGbuzt7vV01HzWdPtt75r%2FP0dHAXoxX5APlAJ7ccHr1%2BfCNrpVuJP7Qvr1pdSvJpchpI5GxFjP3dwVpPcOuawPGGl6borqkOoPPr32hpJ4oFTybYZJ2kqSN4OOAzAcgnPFc7qF7c6jey3d9O89zKQXkc5JwMAewAAAA4AAArdYmVFLk0muq7dtNP%2BAvU7U7bHqun61p19bLPFdRIDwUlcIyn0IJoryEgHqBRXqx4jqpWcE36l%2B0Z79bxeLbaEbfNjRfKi3OyfuzLKpXI9SwHUEgEjuamaPxhJHbwmJvMgkLJOzpufcpGNxOCNrMenfmuMaR2%2B87nvy5PfPr68%2FWpYry6iSZYrmdFmUpIBIfnBOSD%2BPNe66D3tH7v%2BCa2NNtd1uyu50a7limEzNIhRfv8ACnjHbAx24BFU9R1a%2B1GKOO%2BuWmSN2kUFVGGbG48AcnAz9KpMSxJYkk9STk0lbqlBO9lf0HYK5Txr%2FwAfFn%2F1zb%2F0IV1dcp41%2FwCPiz%2F65t%2F6EK87Of8Ac5fL80TU%2BE5uiiivijnNO213U7VlNvdvGikMI1CiPcIzEG2Y27thI3YzznOeaoQzSwbvIlkj3rsbYxXcvocdR7VHRQJRS2QUUUUDCiiigD0%2Biiiv0k6wooooAK5Txr%2Fx8Wf%2FAFzb%2FwBCFdXXKeNf%2BPiz%2FwCubf8AoQry85%2F3OXy%2FNEVPhObooor4o5wooooAKKKKACiiigD0%2Biiiv0k6wooooAK5Txr%2FAMfFn%2F1zb%2F0IUUV5ec%2F7nL5fmiKnwnN0UUV8Uc4UUUUAFFFFABRRRQB%2F%2F9k%3D" /><h4>highlight.io: The open source monitoring platform.</h4></div><div class="bookmark__right-side"><q>highlight.io is the open source monitoring platform that gives you the visibility you need.</q><div class="bookmark__comment"><p>Contender for a Sentry/Logging replacement. Also with a self hosted option</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.highlight.io/">highlight.io<br /><small class="text-muted">www.highlight.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAODm8eTNomkXkFnp1tNetNHIupamtvHFJC%2Bx0VgrNIdwOCqYwMnHANn%2FhIm8R%2BHPDkmmGW1m1xopMK%2FwA8MKjzJTkey7AR3dTT08B2ttJZzabqmp2Nxbi5jM0TRM0kc83nOh3IQPnxgqAwHer3hfwnaeHorKO3ubu4FlatZ2%2F2hwdkRk344AyeEUk8kRrnnJL0EeZ%2BGPHeq2I1DTra3m1rW9T8U6laWEN1dlI4YYsM2XIYqiDooHfiq3iX4lySN4W1LUDdaEum%2BILjT9ZtorhnQtFAzFcrjzEOUIyOp%2FGu4uPhXoz2ziC%2B1W1vRqk%2BrwX0EyLNbzTcOEO3GwjjawP1p1n8LdBtodIUy3876fqMmqtLPKsj3dy6lWeYlfm4I6begp6BqYMni6%2B1dvh3qV5aXemprGqN9nt7PU8q0BhZkNwAmHzjPlg8HHOcivW16CuE0z4YaNpraUtrdakLbS9Sl1OytmlQxwNIpBiX5c%2BX8zEDOQT17V3Y4FSMKKKKACiiigAooooAKKKKAKsN%2FbTXAhjk3SFd2Np6YB64x0IqsNcsjaPOGkwqBynlnfgjIwO%2BccetWV06zVkZLWBWQ7lKoAVPtj6CkGm2IAAs7cAZwPLHGRg%2FmKYEMusWkM08czSRmFgrFo2wcgEYwPfHuQQKLnWbK2eZbiUxmI4bKkjoCOnr2HU4PpVp7O2dw728LOOjFAT2H9B%2BVR3em2d2HFxbROXGC2MMencc9hQBJa3cV0H8ksShwwZSpBxnvU9QW9nb27FoIY0cjBYDk9Op6noKnpAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVl6hqv2SV1WHzEiGZG34P3S2FGOSFUnkge%2Bai1PxFa6dem2kiuZJBCJyYk3Dbk%2B%2F%2ByT9BQBs0VV0%2B9W9WYrFLH5UrQkOByV6kEEgj%2BoIPINT3EqwQSSybtkalm2qWOAM8Acn6CgB9FZtrqyT2d1P9nuFa3BZotmWYY3LtI4JK4OAeMgHFUrbxXps95FasZYZpmVIxIoG8sCRgZz%2FC35Z6c0Ab9FFZtlqoutQmtBbTxtFv3swGFwwC%2FwDfQ%2BYew5oA0qKx4PENnJqg09xLDds7oiSAfOVVWJGCeNrg%2FTritigAooooAKKKKAKtzYW1zKJJ49zYAPzEBgDkBgDhhnsc9apalJZRXhe508zS%2BXsEohDkqc5XPp%2FjWvRQBj6deWNuy2tjYy28TPxsg2JubJJ%2FQ5rXZQykMAQRgg0tFAFP7PbafYzi0tIUjClzFGgQMQMfToAKyY7nTU3MdIZXAEp224PTgHPHIAGO%2FSuiooAAcjNRR28Mc8s0caLLLt8xwOWwMDP0qWigDn0msrcCRdGZZtxlxFbgkZPLdM5OM%2FlWzaXC3MbMiuoVymHGOh6%2FSp6KACiiigAooooA%2BU8CjAoor7o%2FGAwKMCiigAwKMCiigAwKMCiigAwKMCiigAwKMCiigAwKKKKAP%2F%2FZ" /><h4>grafana/loki: Like Prometheus, but for logs.</h4></div><div class="bookmark__right-side"><q>Loki: like Prometheus, but for logs. Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost effective and easy to operate.</q><div class="bookmark__comment"><p>Looking for a new Logging setup, this might fit our current Prometheus/Grafana quite good.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/grafana/loki">grafana/loki<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHpUlEQVR4nO2de4hXRRTHd81S19UsMUtklyUIhKKsCApSK6FaUxPLfyqQzAdERFCJRWWKGyRmaoY9bJdtM0gjKLQgLazExy5JL9MtCAKrdbc3ytrD0xnnbt69O3Nm5v7u3DP35%2B8D55%2FfnTvznXPu786987hTVRU4ACCsAW0m2hK0TWg70TrQDqL1oB2PrCf6rSNK81p0zswoD%2B7qFI8oAI1ozWjHwA9b0eaiDeGub5CgY85FewrtV08BoPgZrQntHG4%2FsALyn7AQ7RuGIOjoRFsAp9OtDWQgnub1uxUtaGdy%2B8sbWLkatPXMTk7DZiin2xnIf8RzzE7NgtVQ9FsZVmAKyMfRcuEE2hxuvzoD8vbUzuw8n%2BxFG8rtZytQ6HXc3sqRm7j9rQVkW%2FEEs4M4eB5Ca1tABqOT2TGciO4a7jBIUMhwkG%2B7pzt%2Foo3iDsZYtL%2BYHRES%2F6LVcQXjEu7aB8zFeQdjHHeNC0B9XsGoBfnXrGDGb5cLyKepHu5aFojf0ap9BuMQcwWLiJ9HYsx0LXfNDHyN9hO3CA2rsw7G9dw1IngLYlcgyLHzv5k1qZicVTBquGtCINozleZruIVpGJZFQELutZ1H6P6RW5yCPaUGYwZ3DQxQ2udxi9PQmDYYwkK8F%2FexwUJ%2FiIhBrlQBWcet3MBYizps4Bapwe2pC08Ywa3YwH7LeozhFkpQ6xKQVm61Bqzvw5j2U26xGl6xrcBgbqUWuFxcN3OLJTBPZQU5JBkyS62jURX8w8k6G%2FGhM0ijfTRo%2FjkQ9lg%2FGZCF3OoMbCO0i8l40wt4oc2nAhLSxGcVEw0O30XU7R1G3RSHdIJHcSszoOy3irRPjqVTNpT4%2B6Usqu0YOJAFcn1GyCwirv4dsXTLiXQ%2FMGk3MVAz8CyWcUHn5EGJdNquCfx9fv6yrehOCq3mVmRA%2BxKFxx5XpL9Rkzbkxr06LnQOtxoDyrlOIB3cq0i%2FmwjgS%2FlKt2ZWXOTr3GoIviScO4k472zNOaNz0u1Ka1xkyGs4ZqkcG%2BneTpy3kjhvf07aXTgW%2F9uHjM6pNrp15zZ61pyWk%2BIu5FZBsIK4ylWNeZIZRDD%2F8Ss9FfWhD9MqJwWAvjFPoh03wWNL%2FUpPxTQh7BFuFRq2E8681iGfMURQQ2OxELWJW4WGq4mAvO%2BQj7aLG49t86Q9LW1C1E5uFQrE4hedE9Nc2bq8LstWdsnsCHWI837iql6RIr%2FbifxCmn7aHmqXu85%2FQu8VKfI7SOS3IGPtpdApBHVzq0jwqjYap5worMMx3%2FFEXqHQFeJbeoMpIDFHunzE5gUir5f9VMWZ3tAC0mkTjIQzb3XIX5dHKPO3ekO7ZaX6jgieNx7tD4v87yLy%2BNxv1azoCq1R1zmrSncskWaXIf%2FviPNv8V05CzpDeuylemdng3w3IddXgAzKg4ZylG0UhNG%2F1R7Si6Fy%2FCJy1p5YusupoETpqXGSVuK8ZV5raGZHKF0nnxBOGqpIf7dFUMRAVJemPN05yfH5vDnZdbKEWYRgEuFY3Zt5M9i1K1sV52onp%2BGxd%2F1U0YqHhYDpjAIEohudcugJ4twDoJlamsjj3sR5h4n0aXoCsqJRCGhgFCB4iHDOVIvzRUN8ERWUKK9kR%2BIEIi1X%2F1ZdCF0HlBM%2FcsjnDougnAWnPn7wJpGOa47z%2FwJsRt98sMXgPFfEMjxTUIS9EaWn0uTN0bgArict7a0Gjz2ZMs%2FPwGJBD6Z5AO0x4vjGrCppSb9pQLNzLlzwPeEMYaUsshEvkeMsgnIecez8LCrpQL%2BJchxTSe8knDElozJuMwXFELAvMtJhw4DCf8mx8IEC%2Bmv5MMNymqiyDAHJa0bOEVXhTTkVLlhDOMHHotOPIUVQwPwelBXLVIWPzKHgPrRfWgN%2F6wHFcgttm0HoWe5JTxy1P%2FDAtzkUvtdwRfp%2BBJ%2FqGBDf7at2vD%2BvFyKtQ8BtAlwprAS3te7vedRyD1Ww7xci8Y1fqnyXCXClspXSktB1pUcdxsJ97vXxKOPFoOIw2giLgPjSttbmavD5aQ2qXM45xldZ%2BOWoh3LPMAYkKrzZQ%2BFvE%2BX5qrAL9xn0Zc1Gq2BEAmo9CNB%2B6RmPTfRQXhpEp6MqGD4GrYZbByQS8mzGAp4B2WHXnLAXIaytLsR0okVoE0AO3h3wUMYqp2DErgzuWRjlCPmkaQpKCHOVyo3StknCDPZx16CM0K6fdwlImpG7CmpqSg5IFJS8ujTKmRsyCUYsKKu5a1RgtNNkSwmIsIPcNSsgX4GvHdxABiWk5Quh8xv42tAlFpQhwDdtqEiISRrZNOIWQbmAu7YFIN%2Ft86CybR5FvtvmxYIi5i6FtEaRG76NJWNBEVuvVnZuC2Hr1T6gsoObv0fbtEBl%2B%2B4wgeymgRYB7cqvoEChw6C8e4l3g81WE6EB8t9STi%2BR4ikq1ccNggFk27KG2ZFZsApCbitcAblB5Xpmp6ZhM4TyOOsDcP%2BKDxctYDtvqhwAGRjxcfyQ3l%2FE8ILQxO0eXkDuXSKm%2FXN07R8B%2BUmNkdx%2BCBKQ%2Fxzx5emWyFk%2BEBOt56IN5q5v4YgCVA9yStJitDa0D0C%2B54jbnfhXHY%2BsO%2FptX5SmLTpnGlodFOBW9B%2FJsy6fRJb3lQAAAABJRU5ErkJggg%3D%3D" /><h4>Ansible Molecule</h4></div><div class="bookmark__right-side"><q>Molecule project is designed to aid in the development and testing of Ansible roles. Molecule provides support for testing with multiple instances, operating systems and distributions, virtualization providers, test frameworks and testing scenarios.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://molecule.readthedocs.io/en/latest/index.html">Ansible Molecule<br /><small class="text-muted">molecule.readthedocs.io</small></a></div></div>
</div>Stefan WienertDev-Links #21 - Ruby & Rails2023-04-15T22:50:14+02:002023-04-15T22:50:14+02:00repo://posts.collection/_posts/2023/2023-04-15-developer-links-no-21.md<p><em>In this new (revived) monthly section, I want to share links that I found interesting or that came up in our company’s monthly developer chat. This is a good way, to clean my bookmark list and maybe there are some interesting bits here and there for you as well.</em></p>
<h3 id="ruby">Ruby</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAB4MgIA6AMAAHgyAgDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BECD2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24%2BMTM3NDwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNTU2PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24%2BMTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCv%2FiD0RJQ0NfUFJPRklMRQABAQAADzRhcHBsAhAAAG1udHJSR0IgWFlaIAfgAAUAHgARADUAOWFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAAEGmNwcnQAAAXQAAAAI3d0cHQAAAX0AAAAFHJYWVoAAAYIAAAAFGdYWVoAAAYcAAAAFGJYWVoAAAYwAAAAFHJUUkMAAAZEAAAIDGFhcmcAAA5QAAAAIHZjZ3QAAA5wAAAAMG5kaW4AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QAAA8MAAAAKGJUUkMAAAZEAAAIDGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACIAAAAMaHJIUgAAABQAAAGoa29LUgAAAAwAAAG8bmJOTwAAABIAAAHIaWQAAAAAABIAAAHaaHVIVQAAABQAAAHsY3NDWgAAABYAAAIAZGFESwAAABwAAAIWdWtVQQAAABwAAAIyYXIAAAAAABQAAAJOaXRJVAAAABQAAAJicm9STwAAABIAAAJ2bmxOTAAAABYAAAKIaGVJTAAAABYAAAKeZXNFUwAAABIAAAJ2ZmlGSQAAABAAAAK0emhUVwAAAAwAAALEdmlWTgAAAA4AAALQc2tTSwAAABYAAALeemhDTgAAAAwAAALEcnVSVQAAACQAAAL0ZnJGUgAAABYAAAMYbXMAAAAAABIAAAMuY2FFUwAAABgAAANAdGhUSAAAAAwAAANYZXNYTAAAABIAAAJ2ZGVERQAAABAAAANkZW5VUwAAABIAAAN0cHRCUgAAABgAAAOGcGxQTAAAABIAAAOeZWxHUgAAACIAAAOwc3ZTRQAAABAAAAPSdHJUUgAAABQAAAPiamFKUAAAAA4AAAP2cHRQVAAAABYAAAQEAEwAQwBEACAAdQAgAGIAbwBqAGnO7LfsACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMAIABMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtBBoEPgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwAbwByAGkATABDAEQAIABjAG8AbABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABDAEQAIAXmBdEF4gXVBeAF2QBWAOQAcgBpAC0ATABDAERfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgDpACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQByAG4AYQAgAEwAQwBEAEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEwAQwBEACAOKg41AEYAYQByAGIALQBMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBLAG8AbABvAHIAIABMAEMARAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAFIAZQBuAGsAbABpACAATABDAEQwqzDpMPwAIABMAEMARABMAEMARAAgAGEAIABDAG8AcgBlAHMAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMTYAAFhZWiAAAAAAAADzFgABAAAAARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA%2BAD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB%2FgICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI%2BwkQCSUJOglPCWQJeQmPCaQJugnPCeUJ%2BwoRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N%2BA4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg%2BzD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR%2BUH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h%2ByInIlUigiKvIt0jCiM4I2YjlCPCI%2FAkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg%2FKHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi%2BRL8cv%2FjA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN%2FM7gz8TQrNGU0njTYNRM1TTWHNcI1%2FTY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA%2BoD7gPyE%2FYT%2BiP%2BJAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS%2BJMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0%2FdUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW%2BVcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg%2FGFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg%2FaJZo7GlDaZpp8WpIap9q92tPa6dr%2F2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF%2BYn7CfyN%2FhH%2FlgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ%2FopkisqLMIuWi%2FyMY4zKjTGNmI3%2FjmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ%2FJpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ%2BLn%2FqgaaDYoUehtqImopajBqN2o%2BakVqTHpTilqaYapoum%2Fadup%2BCoUqjEqTepqaocqo%2BrAqt1q%2BmsXKzQrUStuK4trqGvFq%2BLsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq%2BhL7%2Fv3q%2F9cBwwOzBZ8Hjwl%2FC28NYw9TEUcTOxUvFyMZGxsPHQce%2FyD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI%2F0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba%2B9uA3AXcit0Q3ZbeHN6i3ynfr%2BA24L3hROHM4lPi2%2BNj4%2Bvkc%2BT85YTmDeaW5x%2Fnqegy6LzpRunQ6lvq5etw6%2Fvshu0R7ZzuKO6070DvzPBY8OXxcvH%2F8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio%2BTj5x%2FpX%2Buf7d%2FwH%2FJj9Kf26%2Fkv%2B3P9t%2F%2F9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4%2F%2F%2FzHQAAB7oAAP1y%2F%2F%2F7nf%2F%2F%2FaQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoCAAAAAAzSOMeAAAAAAAAAAAAAAAAAAAAAD%2F2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj%2F2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj%2FwAARCABkAGQDASIAAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL%2F8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4%2BTl5ufo6erx8vP09fb3%2BPn6%2F8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL%2F8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3%2BPn6%2F9oADAMBAAIRAxEAPwD5UoorV0DSRq0syGfyfLUNnZuzzj1FJtRV2XTpyqSUY7s6H4R%2BHdP8TeJp7HVkle3W0eUCKTYdwKgc4Pqa9C1P4Q%2BHr9ry18ParNFqltgPBNKsqoxGVDgAMoPrzWP8G9LGk%2BP5I%2FP80Ppsr5K7cfOo9T6V1niHxZ4X8F%2BItcv4TcXfiW52LLb4OxSqqVXcQAF4UnG418xj8RiXjHDDSeyaS1V79ey8z2KGHpwo%2Fv0t3e%2Fp0MfxD4an1X4Q%2BG7bR9KSbU2aHf5UKq%2BAsoYs3HGcZJPpXkF54e1ez1ldJuNOuV1JiAtuELO2em0DqPcV7ZrmualpHwc8O3%2Bm3TQ3kjQK8gAJYN5jMOR3IFdxcx2o%2BIdg7qn2o6XcLF6kCaPIH4FvwJrGhmVXBqScU03O297r9CqmEp12rOzSj%2BP6ny5rfh3WNC8s6xpt1ZrJ9xpoyqsfQHpn2rauPhx4nt9BbV5tO22yxec6GRfNWPGdxTORxzjqB2r2m%2FnvX%2BH9xN4%2Bt7S2kW%2BiOyLBVVE8e08EjON%2F%2FAeverfim8udO8QX1wlh4k1IXOnvDFFbIj2IyCdx54bPUnsTjIxW%2FwDbVeVoxir3d%2BztbZ38zL%2Bz6au23bT1V77%2FAHHg0Pw98VzC3MWiXLLcJ5kbArtK4ByTnA4I61oeCPBVnqOu6jpvivUDok9ogIhlKRu7H0LkDAHPuCMcc16r4p1nUNH0TwGNMuDCt3LawzYUESJ5UfynPbk1tPY2l18WJluLa3nUaLFkTRK4z9qYA4YHnaMVFTN8Q6bcrJNOzW%2Bjt1uio4Ckpq2tmr321XkfOeo%2BFdUtra6v7a0uLvRopHVNRjiPkyKrlN4PYEiq%2BqeHNY0myhu9T0y7tLaYhY5JoigYkZAGfbmvafhL9vjuvFkt35EXhn7TKQJwAok3%2FNt7BAvDZ4%2B7XJftAJq48VwNfYOmmLFlszgdN4P%2B3u6%2B23tXoUMxqVMV9Wdu9%2B%2Bi09e%2F5HLVwkY0fbK%2Fp%2Bvp2NnwZ4b8P3fhjT7hNKjvpJY900shOfMzhl5I4BGOOKKvaDrFgPD2kxya7ZW0sdpGjxB4%2FlIHQg8gjoR6iivMqyrucmm93%2FMe7SjQUIppbL%2BU8a0PSf7UuJohMIvLXdnbuzyB6%2B9dHoOnf2VrM9v53m77USbtu3Hz4x19qoeB1YaheZB4iwfY7h%2F9et3%2FAJmke9j%2FAO1K%2BjqSd3HoeZg6MFCFW2ty4BqNtqa3%2BkanJp9yIDAWSMMSpOSOfwri%2FFdtqjalJfatO13LcN81znO44xg%2BhwK6PV9TuLPV7GCFVkimA3Jt5PzY4NWvECodHuxIRtCgg%2B4YYrOC5JKdld9eptiKNOvGdrpx%2B7b7in4hj1CLw19lfWr6axs9hitpD8ikHAxzxjcafY3%2BpeJorfUtX1bUJL20kZIJUlCNGODwQM5yan8UAnRb8KM8A8f7wqj4KBGjPkEAzsR78LUqEOTmsr37Lrv9%2FUJUorEqCWlvyZQ1zUNU17WX03VNau54LdnMRupC4BVSc46ZOOtaHhrWtWh1T%2BxLfX9Sk0lY5CBbyuoKiMtgABio4wQvviqOnrcHxjfvbRTuA0isYnKYznGT06%2BpAz3qfRUlHjyYSBg6K5YMZJG%2B5jqoJJ98Y%2BvFFWEPZuHKrJXtZb9zzZ3Tck9b267EGrX8st55Vxr19EljKDaQytNIIgqrtK7gCp444HQVYj8Uauuom9i8XXbXzxCAy%2BW5dkDbgmcf3j%2Btc94mZn127Z9uSR0DjjaMffAbOO5Az1r0%2FwAO%2BIr%2BXwNobPdw%2FaG1uGwb93GG%2BzhVwvTI6D5uvvUVoxhTi%2BVO%2Fe3X5MVFucmm7W9f80cFealqT6VPpf8Ab19cR%2BY2bAeZ5b%2FOWLY6dfm6d6t%2BFda1rVfEeiWN5q00sME6tDHeO0kUbKpx8pPHHHHNe0TXlqfGNimo3VnLqQ1CZrLynUyxWvkHcJGHQE7sAn0rz3xxNos%2BreHY%2FEtzaz36Cb%2B1JrI5%2BTJ8pWKDlsYHH%2BFc1PExq%2B57PdN6a7p6pWV9reuh0yoOm1Pn2aXbqt3d23%2B7U6m3tvGFlc30lpb6BKl3ObglhMMEqox%2BSjnmiuOTxF4Fsh5NrpepSRj%2BJZJAD%2F5FH8qK5Xhqj19n%2FwCS%2FwD2x6CxNNae0%2F8AJv8A7UZc38dlezW1xa3du8cfnSl7Vl2g4wSMZ5BzkjFZMer2M3iJJ0uFEItTGXcFRu3ZxzXsKT60vi%2FxbHoqaWVEVoXN6ZAdxgOPuA7lwpypx%2FOvO%2FCXgPQfF%2FhmG50y%2Bu7fVYpES8ildXVefmKqFBwRkryeQQfWt6OYQ5XOqrK0dVr8Svr2M6rrOSjCz1fls%2BmupQn162juYoLZZLx5FJAtvmOfTH05rmfEGvSain2eKIwwA5YMcsxHr6fSvTfDVjZaB8S5dN8ESLczw2kq3kmozEpkFTsRo0yGGBk8jkjtWhbeF9G13T%2FE9%2F4phtoNRh1K4jub22dwsQTYSVB4xgnkqSc55NW8xp0pJyi7WTXfXyM6ka%2BIi4qSW%2Fpp5nnum%2BJrOS0QXztFOF2vlCwf349fStTTL6HUIHktlYRI5jGRjOADkDsOazZLTwzP4qu4tBzcaULdDH55YHf8u772D1zV%2B6vbLR7XA8tQgJSCPqT9B%2FM123jJJxTTfRmuHqVOXmqyXKupy9oyt4xuS5%2FdeZNvBUsCuGyD6Z6Z7de1XNLjn%2F4T8xW6GRi7qUYNGNgQ9QMkgAehzj3pnh%2BdbvUrQySSxzwxysyomPM3FmPOemD%2FAIetOXS0vvFLRyT3SrMZVVlHzoVjyM5PQd%2BegqqjVpKWmjPJmrw5l1dyp4x0%2B7j16%2FkaymhhGHUlTgpwobJA4Jx%2BJxXReIbfTX0vS5rdNL%2B3SLaokiFnZ8Lg5j3HKjABJTJIIrFuLdrNfEVq2SIYI03kbS37xSDjLcHOevYV0vjC4un8IWV8s17h1t9m%2BFIypAJDEhQRznbtODwa55Sd6cU%2FL10XqXh4rkqen%2BZn20OlGNRdSWxlQ%2FOYrcqDg9gbUnnOcE9BVjwBpVlceNYvtUmmX8c0UrG3jt5Nq%2FLw22SNR9Md6S7023TQhqC%2BIL2WMWpZpDfL88pjyqLH94Yk%2BUg9ueK3PD3hzU9L1KDVk1aK8u0t%2FLVbqF2VVZemQ2eM1jOcYwlaTV7r%2BtNPwOnD4OtKrF2ulZvbb7zqdJ8K6FqMEst7pGiySLM8YNjnYFDcBsHAf1FFcLq3jjxB4evpLJrXSbLJ80Lb25KSbud%2BScnJz154orn%2BqYqfvQlo%2FNnW8ZhKb5KkNVvojq7Txpp%2Bn%2BIvEU%2Br2uqaZLqcdt9kt7qzZZXCwvHnA7FjxWT4I17T%2FC%2Fh%2B1stH0u%2Bvddu5o%2FtXmweSCcFigcn%2BFc7R3JLe1c3cyXHiO2F9rniG0s5Id1tAmp2rZZOWdkaKMjIbj1yadplhp%2BgeJdJmuPFNleqrkTIqzL5JMTEk71AxkgA9TnoKX1SkoShK97K6V7PlVkr2X57nm%2FXqt09Lq%2Bvq9TstOvtDtPiFqev2NvqEFslrLHqCNa48mckcgBjncAScdCM96qX%2FifTtL0vxxpWqi7t77Urq6ntongPzLKg8sk54yR%2BFZM%2FibSbvSdQiW4hinvLGSSfIIzPxGqjjqVXPHrU1x4h0zTpbpdKvrWMPqFsRty4MXlqJGBIPoQTULDNyXNF3Vl9zVtbfpsP67NLS3X8fmYlhpVgum2csEc1xb3DmOGZtJMrSSYyVGJBuwdw6dvapdLmsrLN3p2qw6ZLHFKHlgg2uf3gHlsrMxBKjd39B0NbNpcaVHq1jc2jW6q%2Br3BaUKdohYEBgSMAEjgjmqsOsRpod4p%2Bz2Usklz58Eqtbw3AZdqMAEO%2FAH3cg5%2BtdLqTn0b%2FAKfkYKSj0X4%2F5mU91byeJIrmbU31a4l3wbxAGaTYwWPYoXIyMkdCQPeqdhc28fiiN3EaostwSJImjMOFHzbFYFTkHqfc11d1rVsx0OWTV9OGy7g3W8Tq8SptwzjcoaLHPBPXmuYsNTW5%2BIE8kUcPzzSKj2%2B1d6hHAx2bdxnu3QHJranKUoSTjayf9bImVS65fMr3kcRbxT9mZZohFEfOjbcmd6E8lmJJPfcehrotZs7v%2BytDbTrZV1KL7EsQNrFu8zZwPNJLHJwdp4x9OOb1dYZtT1nzY4USJ1ZnkQvIoYqpGVOBtznGDjGDmtvxZe6Jf%2BHfK0WaVzaTotmsNtMmxTwVdmYhmPBBwD6dacrtwt%2BV1st%2F6%2F4PRh%2BWMJtv8bPrsdPqdnrU%2FhC6j1Ga5OoS2ck0xFvCI1xz5RwM5IHUf%2FWq5d2X2%2BHSWFy8HkSR3HydZAE%2B79DnnrxXH6df2E%2Fhe9t0sv8ASrGxJljksBIwcqysS%2FUfOVfJ6DjtWdHrmt6tYWU8EtrHLaTZhRIyGbYoU5bOMENyDjPNc8cNUk2lZWb6W3PZp4unFapyul1vs%2Fl%2FwRvxD1xz4jeCGHaLaMREypyxyWyPb5uPXrRU95eanqs5mu7PQJnT92GZSTgc%2Bvv35or0KVqcFFx28zzsRTqVqsqkZOzfYxLXxbeW9nb2ot7Z4YC5UOG53MW5wwzgnj%2F65q%2FH43ml857u2hEpCiJkizt5G4tk88DgdjjGK4yit5YSlLVxPI9pLuddfeOb%2BS4mNqkccLM2zcCWCndjODjPzZz6gGodcvLTWWhkn1CKPyV8tQlu4JBJbpkjgnHGOK5eiiOGpwacFawe0fXU6%2FS9Y0%2B1s4raVLOcW7vsknjnBYZyDhXA6k4yOMUy9nTWSrwXXkR2kIdoreGUqoU%2F6xt7nJywGc%2BlcnW54bx9k1zIH%2FHgcE%2F9dE7UpUlD31ubQqOb5Wje8O2K6la3skuuWkccaSKgIRH424dgRwhJwe9XrS1tIdet7j7fpEnlwyyN5F0H3ZIATMhAU%2FMSDnOAai8O29%2FHb%2BHIGsdJ8u4adoZpY%2FNZsoSd4GPw57D0rO%2BI0Lxy6bJs03yZYWZJLKIor89%2BTntg%2B9cLbqVfZ82jv%2Bq%2FQqU5cl2Q3%2BrHRPEuoyW32W6fzInhdNpiAVlYAqMgjA2nn15rd1lotO8O6XrFjaaXbTbreVfI80AtlnwD5hDkYw25cjI56VV1LRfsvw7S4m0%2FT4rlFUNMsu6Y7pMg7QOpBX5txAHGATVHWvDdnaeDLHWIY79biYorhiGiXIOScqpGeoxkY71f7uXLr1t62XqdEI1KcZK19L%2Bn4HW36wJpWq69Zaf9l1DVLJ2kS5vogFRxlmVM7iTjIH8ulYvgnwbqureHbm5KN9juEUWRLkxNOZ1jIO1gQ4GWAIOQoOCK157M3HgKKW4t7OSVdJ8xLo2AZERRgR%2BaWyJPT3zxXD%2BB9Kh1zV2sb27ktbVYZZ96uAFdUO0nPHXGe%2BM1hT5vYzcZWs9XZvRdNzbF39pBW3Xkt%2FRHc2%2Fww8WzNONM1SO5SOQpIys42tgEAgjqVKN%2FwKiqt%2F8AD1HuA1r4ntlUxx72uJ8s77BuIx%2FDnIGecAUVisTNq%2Ft1%2FwCAP%2FMn2dRacr%2F8CPLaKKK%2BhPICiiigArV0S8t7S31UTs4ee0MMYVcgsWU8nPHT3rKoqZR5lZlRk4u6Os0PxXDbaSmmavpyX9rExaLL7WTrxn8T6dTWb4n119cuYSsCW1rbx%2BVBAnIRfr%2FnoKxaKyjh6cZ%2B0S1G5yasel6jZS2HwxEC6jZ3EUiQyeTGo8wM7h8ZEnIGcElc5AA4yaqX955ngyPztIMM1lLbQk3UQAYYJ4JG7kocjPRq4nTrmO1uBLNbJcAdFZ2XByDkFSDnj9a3rjxLd60gsbmCS6aaQCNZr6dgGJIBw0mMjcBk%2Blc0qEovXXW99v1OxYmLukraWtudZq8cMWjzoj%2BDyLiKacorspQktgRYOGxjgkDniuQ8KQaNPp2tHV4l8%2BC3WW3c3Jj%2BYyIhAXHzYDl8Dn5K7iazu7TwpPHqa6Pa3lnYtZG4%2B0l3EbZIQooxubGASfevIqjCR9pCUU%2Bu6%2Frsa4%2F3JQbXTY9PTwd4Qae4Ua5ceWkm1CLm1IZcDnJcE5yT0Hp2zRXmFFa%2FVav%2FAD9f3HH7aH8iCiiiu45wooooAKKKKACiiigAqSCV4Jo5YmKSRsGVh1BByDRRQGx07%2BOtZubC5s79rW8injZGM8ClhkHkEY5HUE55rlKKK56MIwlJRVjpr1JVIxc3d%2BYUUUV0HMf%2F2Q%3D%3D" /><h4>Flip Flop Operator in Ruby</h4></div><div class="bookmark__right-side"><div class="bookmark__comment"><p>Never came upon that operator, it looks really powerful but hard to grasp</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://nithinbekal.com/posts/ruby-flip-flop/">Flip Flop Operator in Ruby<br /><small class="text-muted">nithinbekal.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP7P4gz31nYrp%2Bl211qFzqUul7Yr4NbCRIGmEizBPmjKqMkLkZIwSMF3jLxPd6JFr%2BtRxGe28PaeWkthKyJPcOFcqWx%2FAgUjj%2FlrW5aeFoopdMnutR1K%2BurG7kvVmuZVYySPE8RBAUKqBZDhUCgEA%2BuW6t4P0%2FVPC2saFcy3Qt9VMxuZkZRKTI2SQSpHAwo4OAAKYji7j4l%2BIxqd9p0HhKA3i6YusWyvqQCta5IYyEJ8r5GAoyOeoAyU1v4tyW%2Bg6Lqmn6bpqw6hpn9pn%2B0tWjtScD%2FURLhnkkPODtC9OcnA7A%2BCNOOttqhnvftDaP%2FYm3eu3yN27djbnfnvnHtWCvwi0eJbFLbVdbt47fSl0WURTxg3NqpJCudmQcseU25o0DUpav8V5rCDTJk0CWdNc0%2BG50ZUm%2Ba5uHKg2z%2FLhCN6ndyCAe%2FFcr498Wa9pdv8AEV9Imu4buzudNinmfUPMjtVkjXcbaNo%2Flyx2nud2%2FjGK7V%2Fg%2FodxpsNpqGoaveG20%2BPTrOaWWMPZqjhxJDtQBZMhfmOeFA6ZB0NS%2BGmkana%2BJ4b271GVvEP2Y3cm9FZWgVQjJhAASVBOQQT2A4p6Bqc54r%2BLV34f1BdMn0rTI9Vt7FL29guNSZF3MTiCFhEfMkIGeQo5HNM1X4xPBqtjBa6TaxQXFla3yf2rqAsZblZuqQb12MyfxbnXkYFdJffDeC5mguo%2FEXiG01IWa2F1fW1xGk15EpJHmHZjcNxw6hWGetN8RfDHT9cie2uNa8QR6bNbxW1zYre%2BZFcJHjbu8xWZWOBllKlu5zzS0DUzfA%2FiHxNqHxW8Z6bqVvH%2FAGZZtAqILoEWgKFk2qEG4yA7myflIxzXp9cvp%2Fgy007xpfeI7G91CGW%2BhjiubMSKbeQxoERiCu7IUYHPrXUUMaCiiikAUUUUAZra1ZeTLJHKZViKB9ik7dxwD%2BHf0wc0069p%2BFKTM%2B7BwsbHAzjJ46DvV1LO2QPsgiUPgthBzjpn6VGNNsR0s7fOMf6sdPSnoBHLrFjFJsknAbdsxtbrzx09qDq9kFiYzH96Mxr5bbm5I4GM9qmWwtFRVW2gCqdygRjAPr%2BtNOm2ZCKbaLYiFFTb8oUkE8dOSAfwoAY2r2ItjObhfJAVtwBIwxIB%2BnB%2FKof7e04B99wEZASylTkAEjPH0%2Fl61aOnWZR1NpblXIZh5YwxHQmh9Osnzus7Y5GDmJeRxx09h%2BQo0Ajj1aykd1ScEohdjtOAB15x19utRrrunPt2XIbcDt2oxzggYHHXnpVhNPtEORbRZ%2BbkqCfm%2B9yfWhdPs0dWS0t1ZfukRgEfSgCsmu2DSbPNYNnCgxt83TGOOc5wPXB9KvWs63NtFPGGCSoHXcMHBGeaiOn2ZJJtYORg%2Fux04%2FwH5VPDDHAgSGNI0HRUXA%2FKkA%2BiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACisvUNV%2BySuqw%2BYkQzI2%2FB%2B6WwoxyQqk8kD3zVh79E1KGz8qUtLGZBIACoA9ecj64xyBnNAFyiimXEqwQSSybtkalm2qWOAM8Acn6CgB9FZ9jqa3dvPItvOrw8mMqMsCMrg52kkYOM8ZGcVkv4005IXkMV1hEViNgzk4yvXkgEE%2BmRQB01FIjB0DDoRkVnWWqi61Ca0FtPG0W%2FezAYXDAL%2FwB9D5h7DmgDSorP0nVrfVDcrAsqPbyeW6yLg5xkH%2F8AXz6itCgAooooAKKKKAKtzYW1zKJJ49zYAPzEBgDkBgDhhnsc9ap3s1paakbiSxZ7nywgnjiBYrydueuBzx7%2B9a1FAGbFq8UtwsSwXQ3MF3tEQuTnv%2BBrRZQykMAQRgg0tFAFF7S0stOuUt7KAQlCzQIgVX%2BXGCMY6ACsfzNJaNll0X7sQyotlI2A8DP64rpqKAEXG0YGBjgYqOO3hjnlmjjRZZdvmOBy2BgZ%2BlS0UAYkN%2FDZxv5WmTRvIxldIYvvZONx6ZOB%2FStS0uVuUZkV1CuUw4x0PX6VPRQAUUUUAFFFFAH50%2BWn90UeWn90UUV5x9oHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UUUUAf%2F2Q%3D%3D" /><h4>GitHub - grosser/maxitest: Minitest + all the features you always wanted.</h4></div><div class="bookmark__right-side"><q>Minitest + all the features you always wanted. </q><div class="bookmark__comment"><p>Supercharges Minitest to have the great runner options like Rspec</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/grosser/maxitest">GitHub - grosser/maxitest<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A8DooorYxCiiigAooooAKKKKACiiigAooooAKKKKACiiigArofDnhs6xZzTvO0KhjHFhc7mA5J9ugrngCSAoyxOAPU9q9b0qzGn6bb2i9Ykwx9W6sfzzXn5hiZUIJQerPeyDLoY2tJ1VeMV%2BL2%2FzPJXVkdkcYdSVYehHBpK3PGdp9l1%2BZlGEuAJl%2Bp4b9QfzrDrspVFUgprqeRiqDw9aVJ%2FZdgooorQwNzwzoP9s%2FaHknaCKLChlUHLHn8gP51kXdu9pdzW8v%2Bsico34V6T4Ts%2Fseg2ysMSSjzn%2BrdP0xXNeP7LytQhvEGFuF2Of9tf8AEY%2FKvLoY1zxMqbenT5H0uNyeNHLoV4r31Zy9H%2FlojlqKKK9Q%2BaCiiigAooooA3fBll9s1yJ3GYrYec31HCj8%2FwCVekVkfD7RHXw8LxWXzLty2Dx8ikqvP5n8a25opIX2yqVPv3r5XHYqFau4xfw6fdv%2BJ%2BkZBhfq%2BDi3vLV%2FPb8DlPHti1xp8FxEjPJBJtIUZO1vp7gfnXD%2FAGa4%2FwCfef8A79N%2FhXsAJByCQaXe395vzrfDZjKhDk5bmOYcPwxtd1uflb8jx77Ncf8APvP%2FAN%2Bm%2FwAKsadps95f29u0EyrLIFZmjYAL35x6Zr1ne395vzoLMRgsSPrWzzaTVlH8TkhwrTjJN1G16f8ABG8DhRhR0HoKy%2FFFj9v0S4iUZlQebH%2FvLzj8RkVqVct7CeTDFQi9fn7%2FAIV5KrKjJVG7WPpq9GNalKlLZqx4cDkZHSitXxTpv9k6%2FeWY5RWDocfwsNw%2Fnj8Kyq%2Bwp1I1IKcdnqfk1WlKlOVOW6dvuCiiirMwoHWiigD2zwDKsvg7S9hB2RmNvYqxBrekjWVCkihlPY15R8OvEsWkzyWGoOEsp23JIekUnTn%2FAGTxz2Ir1nsCCCCMgjuK%2FO81ws8NipN7N3T9T9MybGQxOFjyvWKSa9P8zFvbFoMvHl4vXuv1qlXT1nXmnBsvbgBu6dj9KMPjL%2B7U%2B89YyafHG8rhI1LMewqa2tJZ3K4KKpwzMOn%2FANetm3gjt02xj6k9TW1fFRp6LVgQWdikGGfDy%2BvYfSrlFZHiXXrXQLAz3BDzsCIYM8yN%2FRfU15sVUxNRRWsmZVq0KMHUqOyR5l8S5Vl8X3IQg%2BVFFG2PULk%2FzFcvUlzPLdXM1xcPvmmcyO3qxOTUdfpOGo%2BwowpdkkflWKre3rzq922FFFFbnOFFFFABXT%2BE%2FF93oZW3nDXWnf8APIn5o%2FdD%2FwCynj6VzFFYV8PTxEHTqq6N8PiauGmqlJ2Z9A6XqNpqlmt1YTLNC3GRwVPoR1B9q3LHTWkw9xlU7J3NfOeg61faDqC3mmyhJR95GG5JB6Mvf%2BY7V734J8baf4piESf6Nqarl7R2yT6lD%2FEP1Hcd6%2BFzbJ6uDvOn70O%2FVev%2BZ9rgs%2Bji4qnL3Z%2Fn6HQXVjFPGAAI3UYBA6e1YlxBJBJskXBPQjofpXQXVxDaW0lxdSpDBEu55JG2qo9Sa8X8ffEmXVVk0%2FQN0FieHuiMSTf7v9xffqfauDLcDXxs%2BWmtOreyOitmkMDG9R38upp%2BLvGtvpBe00%2FZdagOG5zHCf8AaPc%2F7I%2FGvKr67uL%2B6kub2Z5rh%2FvO55%2BnsPYVABjpRX6Bgcuo4KNoK76vqfGZhmdbHyvN2j0XT%2Fh%2FMKKKK9A84KKKKACiiigAooooAKdFI8MqSwu8csbBkdDhlI6EEdDTaKTV9GNOxsa74m1nXoYYdWv5LiGLlUwqqT%2FeIUDJ9zWPRRUU6UKUeWmkl5FTnKb5pu7CiiitCAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD%2F%2F2Q%3D%3D" /><h4>Ruby Companies</h4></div><div class="bookmark__right-side"><q>Ruby Companies is an open-source list of companies that use Ruby or any of its frameworks (like Rails) to build software with.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://ruby-companies.org/">Ruby Companies<br /><small class="text-muted">ruby-companies.org</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BcKKKK%2BmOEKKKKACiig8DJ4HqaACikDKejKT7HNOIx1oASiiigAooooAKKKKACiiigAq3pOm32salBp%2BlWk15fTttighQszH6eg6kngDrRpOnXmsapaadplu9xe3UqwwxJ1ZiePoO5J4ABNfXmlad4X%2FAGevAZ1DUyl74hvF2M0fEt3J18qPP3Yl4JJ%2BpySBWFat7OySu2XCHNq9jjfA%2FwCzZHHZjUPiDqv2ZVXzGs7ORVEY6%2FvJjx65CjH%2B0a6B9U%2BAPhBmtobbRr%2BdOuy1fUSffzGDL%2F49Xz58RfiP4i8e3rya3eFbENui0%2BElbeIdvl%2FiP%2B02T6YHFUbDwR4iv7OG5ttOzBKu5N8qISvY7ScgVh7Gcta07ehfMl8KPo6P4kfA69PlXegafDGeN8ugDA%2F75QkVJ%2Fwq34SfEO2kk8F6jFaXe0v%2FAMS65yV9C8EmcD2AX6186%2F8ACvPFH%2FQNT%2FwJj%2FxqS28CeLrW5iubW0aC5iYNHNFeIjoR0KsGyD9KXsIrWE7P1DnfVGr8T%2FhF4j8AFrm7jW%2F0bdhdQtlO1cnA8xesZ6eq84zXnVfWfwT%2BJPiHU9bPgbx7pc%2BoXDwEreLCJB5WOlxt%2BUoR8u%2FucAgk5rzT9of4TDwRfLrWgRsfDt5JsMQ5%2Bxynov8AuNztPY8Htm6VdqXs6m%2FfuKUNLxPF6KKK7DIKKKKACiijIHJ6CgD6V%2FZH8J28cWq%2BNtUCIlvutLR5OBGAMzSc%2B2Fz7PXjnxY8b3Pj7xpeatKziyUmGxhPHlQA%2FLx%2Feb7x9zjoBX0FrDHwh%2ByHbRWrbJ73TYVz3JunDSf%2BOyPXyX9OBXFh17SpKq%2FRG09Eoo9J%2BHPgpbhYNY1mMNAcPbW7c7%2FR3Hp6Dv1PHXW%2BL95c2mm6W1rdTwO88gYxSFCwCD0PNY3izU7%2FAE3wZ4OOnXtzamS1w5hkKbsImM4%2Bprhrm71HWLuBLie8v7piIoUdmlcknhVHJyT2Faxi5S52yW7aIf8A21qv%2FQUv%2FwDwJf8Axr0z4SfDnxh8QZo7s6nqOneHw3z30k0mZcHlYVz8xzxu%2B6OepGK9A%2BD37PP%2Bo1j4gxg9Hh0gNkD0M5HX12DjpuJ5Wug%2BLnx40zwpDJoXghba91SFfJaZQDbWeONoA4dgONo%2BUdzwVrCpXc3yUVd9yowsryO38W%2BKvCPwj0PNxtW7mUeVaxYa5uyM4JPoOfmbCjoOwrmfhf47tfjX4Z8UaF4lsre2lOVNvCSR9mf7jAt1dGHLYAyFIAzivnP44XM9540iuLuaSeeSzQtI5yT87%2F5wOK0v2ZtWfS%2FjDpEatth1COayl9wULqP%2B%2B41rP6qlSc7%2B9uUqnvW6HnviHSLnQNe1HSL8f6VY3D28hA4Yqcbh7EYI9jWdXsP7VmmJp%2FxbluEGP7RsYLpsf3huiP6RivHq76U%2BeCl3MZKzsFFFFaEhSMMqwHcEUtKODQB9YfFpTffsraBcw8xw2mmSvjsMIv8ANhXydX1r8GPJ%2BIn7PGo%2BE5ZF%2B2Wsc1h85%2B6STJA5HoCVH%2FADXlvwo%2BBWu%2BLroXXiGOfRdFicpIzrtnmYHDLGp6DII3nj0Dc44KFSNJTU3szacXK1iCTwdrfjfRPBOm%2BHrQzyi1zLK%2BVigUonzSPjgdeOpxwDXv8A4E%2BHnhH4OaHLrmtXkD6hGn%2BkardDaEyPuQrztz0wMs2e%2FAF%2Fxp4z8LfBjwpZ2Fta7pRH5dlp0DfPJtAG53Odo6ZZsn0Br5N8TeMdY%2BJfiiGXxRqcUFmm544BIIoLdQMlUDHG9um5uTkZOBis4%2B0xC7R%2FMp2g%2FM7T4xfHfU%2FFvn6T4a87S9BbKPIG23F2vfcR9xD02g5I6nnaPEmGFwOBXf6j4csLdfELjS5ja2xHkzQ3RlaMlEYIAOCFyxZm4xjp3yPH2l2Ol3NqLCFoPNWUtExcnasmEY7iTkr1I%2BUkZHFdlJQguWCM5XerNT4y%2FwDI123%2FAF5J%2FwChvTvgPbvdfGDwrHFncLsynHokbsf0FN%2BMnPiq2%2F68k%2F8AQ3r0X9kHwvJfeLNQ8STR%2FwCi6dCbaByOs8mM4P8AspnP%2B%2BKipJRoNvsEVeZS%2FbBlV%2FiXpcakEx6RHu9iZpeP0%2FWvDK7r44eIo%2FE%2FxS16%2Ftn32iTC1gIOQUiGzI9iwZvxrha0oRcacUxTd5MKKKK2ICiiigD0X4F%2BP%2F8AhX%2FjVLm7Zv7GvQLe%2FUAnaufllwOpQkn%2FAHS1fVnxr8Q%2BJtH%2BH0mq%2BBIILtiA8t0h81oICM%2BdGmCHHQ55wOcEZx8HV7T8D%2FjZc%2BCFj0XxAs174dJ%2FdsnzS2ZJ%2FhH8Seq9R1HoeHE4fmkqkVdrp3Nqc9OVmBd614c8VaJpX%2FCTazfxajbIfOchpHlcgAuzlW3ZwDnNZ%2F8AZXgD%2FoYdQ%2F79H%2F43Xvvir4N%2BDPiVaN4i8AarbWU853M1sPMtpX6nfHwY36ZxjHdSa8b1z4CfEHS5WEekQ6jCv%2FLaxuUYH6K5Vv0p061OWnNbyCUX2MX%2Byfh%2F%2FwBDBqH%2FAH6P%2FwAbo%2Fsn4f4wPEGoD%2Ftkf%2FjdSWvwf%2BIF1L5cXhXUFbpmUxxj82YCvQ%2FBv7M%2Bu3s0cvizULbS7XgtBat59wfUbsbF%2BvzfSrlVpxV3MSi30OHvtMuvij8Q7XT%2FAAjE9wBAkb3EiFY4kDEtK%2BeQo3Y9SeAMkV7r8TNb0z4KfCm18KeG5v8AidXkTRxOOJBu%2FwBbdPjockhffAHCnB4i8e%2BBfgpoc2g%2BDLWC91v%2BOGJ9%2BJOm%2B5l65HPyDnsAoOR8q%2BJdd1LxLrd1q2t3TXV9cNud24AHZVHZQOABWUIyrtNq0V%2BI21D1MwAAADoKKKK7zEKKKKACiiigAooooA0dC1vVNAvvtmh6jd6fddDJbSlCw9Gxww9jkV6jo%2F7Rfj3T4glzLpep9t13abW%2FONkH6V47RWc6UJ%2FErlKTWx7pN%2B034zZCI9M8PRsf4hDMxH%2FkSuG8VfFrxv4nieDUdfuI7R8g29mBboQeoOzDMPYk1wlFTGhTi7qI3OT6gAAMAYFFFFbEBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH%2F%2FZ" /><h4>Ultimate Guide to Rack::Attack</h4></div><div class="bookmark__right-side"><q>Learn how to get the most out of Rack::Attack to protect your Rails Application.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://expeditedsecurity.com/blog/ultimate-guide-to-rack-attack/">Ultimate Guide to Rack<br /><small class="text-muted">expeditedsecurity.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPOrn4kGGO2tJrSwstZe5ubadL%2FUBDawmDZvbzthLAiWIqAgJ38hcGrOn%2BOrrWodLh0LS7abUrxLmSRJr3bbwpBKInYSqjFwzkbCF5HJxjFXYvAttbW9s1jqep22qQzTTnUlaNppmmIMokDIY2VtqcbQBsXbjFSzeDlKafLba1q8GqWayouo%2BYks0qSsGdXDoUKlgpACgLtG3A4p6C1Od13xrLomvaJea3Bc6ebjS7tf7KM6MZbv7RbJGikHaxO5sOcAKxJ2jOOnvry%2FurzQNOYCzvJ2%2B2XqW828RxRYJQPgEhpGjXoMrv4pkXgjSttsl2bq%2BSGwudPdbuXzfPS4dGlZyRksSnYgAMQBjGNDQ9Bi0lxL9rvL24FtDaedduruUj3bckAZJLEk9ScUAeI%2BDvEWoy6T4F%2B26lrFxd3kGvMZf7QYK3lM23zUIJkKjG07htx3rX%2BHnj%2FX7Hwt4EXWtKe4sdZijsotUuL8yTSXTIxUyJtJ2MRjO4nHJHauy0z4XaLp0Whxw3epMukJfRwb5EO4XZJk3YTnGflxjHfNVdI%2BE2laPLojwajrN5b6Iu%2BwsLy6DW6TBSBIQFB3c567QTwB0p6BqULH4urPZaTcT6Q0TPY39%2FqsQn3PYLaMUZQMDezSfKAdvXNQeFfjBJq91PBPpVoznTZdSgWxv%2FADdhQAmCZnRFjkweuSvXmr%2FgX4eyRah4t1bxZZ6cLrxFmKSytJHkiihIO9d7AEl2JZsAc4xV2L4W6e2kXml6hrviLUdPmsW06OC5vBst4Tj7oVQCwwMM%2B44AFLQNTm7b4zS%2F2f4he403S5rrTNKGrINO1UXULruCmJ5Ag2yKSM4BHp79lZeOYrbRrXUPFVo2jfbmZ7SBd907QhVIZ%2FLQhWO77vOOOSc1ky%2FCPTLkXn27W9du5LzSm0ieSWWLLQFgVwBHhSuOMDuSckkn0KytktLOC2jLFIY1jUseSAABnH0o0BXHWdxFeWkNzbsWhmRZEYqVypGQcHkcHvUtFFIYUUUUAeKaz8Ym8PyPYJZW14%2Bl2dq939pvmjuLl5IlcrAgRt7BSCdzLknHvXYaH43v9b8d6lodhoqmw04wPcX8lztxHLbiRMR7clyxxjoACSc4FJf%2FAA0sJ76a5stZ17TPtUEMF6ljdLGLtYlCoXO0srbQFJQqSOK39D8MWWja9rmrWsty9xq7QNOsrhlXyo%2FLXbxnp1yTk09Bam7RRRSGFFFFABRRRQAUUUUAFFFFABRRRQBnzazYQrukuAF2hs7GPBwR29xTpdUto7yO2y7Su5T5VOFwu4knpgDGfqPWpRp9mI2QWsARjlgIxgnOeakFtAJzOIY%2FOPWTaN3THX6cUwKCa7YM5TzXD5GFMbZbOMYGM87hj17U5dc052IW5BwcHCtgfU44x39O9StpdgybPscAX0CAdwe30H5VKljapnbbQDPBxGPpRoBUXXbAyFDK6uDgKY2yemMDGecjHr2qaPVbORkCzZ8xtqHYwDH0Bxgn1Hbn0NSR2FnGwMdrApHIIjAxyD%2FQflQtharKkqW8SujbgVXHOCuePYkfiaNAKcWv2DxI7SSRl84R42DcAHpj0I%2FMd6eutWR3ZkZcHHMbc8ZyOOg7nt3q0bG1IUG2hwucDYOMjB%2FQD8qFsrVECrbQKqgqAIxgA9RRoBVGuaeVLLcblGeRGx749P8AI5rSHNVH02xcYezt2HI5jB68n86tgYGB0pAFFFFABRRRQAUVlXmsrb34tltp5cFQzIpPLf3fXA5PTAPGelJqutx6dciBrS6mcorgxKuDlwgALMMnJXj3FAGtRRRQAUVnXmqx216tu0U7D5fMdUJCbztT3bJ4%2BXOO%2BBVfU%2FEVlp949rIJJZ0h85li2naNyqAckYPzZ9MAkkcZANmiobO4ju7SG5gJMUyLIhIxkEZHH41W1fURpsKSvBLKjMVJjA%2BU7SRn6kBR7sKAL9FZl9rNvY%2F2et0rpNeyJEkXy7gWx156AkAkZ5I9a0x0oAKKKKACiiigCle6XY3sge7tYpnAAy656EEfkQDUOo3NvDdKZ7MzOu0h1jDMBknI%2BhC%2FiRWnRQBlJrCvG8i2tyFUIcMm0%2FM2On61fs7hbqASxh1UkjDDB4OP6VNRQBXmsrWa4Sea2hknTGyRkBZcHIwe3NZmrTWguZEvNMFwqx4MgjDnaeSOnTKrx349K26KAKlhdx3G9IoZYhGBgOm0YOcY%2FKprm3iuYvLuI1kj3K21hkZBBB%2FAgGpaKAM%2FVJIkeHz7P7Qi5l3bA3llSCCMjg5IOeMYzSW%2BqLNOsRtrqMs21S8eAflJz%2BhFaNFABRRRQAUUUUAfnT5af3RR5af3RRRXnH2geWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RRRRQB%2F%2F9k%3D" /><h4>GitHub - jaredbeck/libyear-bundler: A simple measure of dependency freshness</h4></div><div class="bookmark__right-side"><q>A simple measure of dependency freshness. </q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/jaredbeck/libyear-bundler">GitHub - jaredbeck/libyear-bundler<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>GitHub - ioquatix/covered</h4></div><div class="bookmark__right-side"><q>Covered uses modern Ruby features to generate comprehensive coverage, including support for templates which are compiled into Ruby.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/ioquatix/covered">GitHub - ioquatix/covered<br /><small class="text-muted">github.com</small></a></div></div>
</div>
<h3 id="rails">Rails</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABJGQEA6AMAAEkZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVSCDg8Gkr0v4keCWtJJdS01C0DEvKv90%2BwrzUgg4Iwa6MThp4abhM5sJiqeKpqpTYlFFFc50hRRRQAVraFoGoa3LssIt3qScCrPhDw9Nr%2BpJCoIh%2FiavoDR9LttLtI4LaNV2jBYDk162XZY8V789I%2FmeNmmbLB%2B5DWX5HnGmfC1HiBv55EfuFNX5vhTpvlnyrq43%2B%2BK9IxRX0UcqwqVuQ%2BYlnGLk789jw%2FXPhvqFqrSWC%2BbGoyctziuDkjaN2R1IYHBBr6rI4OeRXO6v4Q0zVLoTzR7H9EAANedisjjLWg7eR6eD4glH3cQr%2BaPnTB9DRX0tbaFpdrCIvs8Jx3YDNFYLIJ9Zr7jofEkL6U395qyRrKhSRQ6HqCODXm3jL4dpdl7nSRic8lCcCvSwfQ8UtfQYjC08THlqI%2BawuLq4WfNTZ8ualpt1p1w0N1EVcflVOvp%2FVNJs9St3iuYUw38QUZrzjX%2FAIXgsW0dySecSN0r5rFZLVp60veX4n1eEz6jV92t7r%2FA8npa6PUvBur6fnz4QQP7pzWHLaXEMm2SGQH%2FAHTXkzo1KbtOLR7VOvTqq8JJntfwj08WmgO7qPMd8574rvBXN%2BAXVtBi2Ky4wCGGO1dJX3OCgoUIRXY%2FPMfNzxE5S7hRRRXUcgUGiigDKvtHhvLgzPNKrEYwrYFFct4v8Q3un6y9vb7PLCA80V5dXFYeM2pR1PXo4PEzgpRlozR8FaxPNbR2WoowuYwE3beDXWimBEByEUH1Ap9d9GEqcFGTvY82vUjUm5RVrhRRRWpkNaNH%2B8qn6iomtLdvvW8R%2BqCp6KTSY02thkcaRDEaqq%2BgGKfRRTEFFFFABRRTZWCRsx6KCaAPHPiXeRQ%2BKpkcnIjXpRXNfEK%2BXUPE9xOh4wF%2FKivhsXiG682trs%2FQcFhUsPBS3sj2DwT4qttdsFDOFuYwA4Y4yfaupBr5z8G6XqGo3v8AxK7iOGdDxvbGa9o8N2%2FiOBlXWbm2ljHH7sc4r6LLsdUrwSnF%2BvQ%2BYzTL6WHqN05r06nS0UCivXPFCiiigAooooAKKKKACsjxRqcWlaPPNNnDKVH1IrWNeS%2FF7xAsuNKiP3SHYiuPHYhYejKfXoduXYV4mvGHTr6Hl9xI007yMcliTRUdFfBt3P0ZK2hoaFqcmk6nDeQk7oznAr6E8M6%2Fa63YxyxSKJMDcuec1811oaPq93pFwJrKQow59q9PLsxlhJWesWeTmeWRxsbrSSPp%2BivJND%2BJ8iAJf281y57RAZr07Sr4ahaJcLFJEGGdrjBFfVYbG0sT%2FDep8disBWwv8RaF2iiius4wooooAKDRms7W9WttIsnuLpwAOi55NTKSguaWxUISm1GKu2UvF2v2%2Bg6XJPOcuw2qoPOTXzvqN5Lf3clxOxZ2Na3i%2FwART6%2FqDSuSIRwq1gV8ZmeO%2BtVLR%2BFbH3eU5csHTvL4nuFFFFeYesbFr4c1Sd1UWcy57sprp9K%2BGeo3Y3yzRxKD0I5rutD%2BIWmakMSKbdh18xhiupg1SxmAMV3C%2BfRhX02GyvBz95T5vwPk8Xm%2BNg%2BVw5fxMLw74K0zSBHKIg9yvVyc11IGOMYFNV0b7rA06vdpUoUo8tNWR87WrVK0uao7sWimswUZYgCq8t%2FaxjMlxEo92xWjaW5mot7ItUhP5VzOteNNL0wH96s5x0jYGvO%2FEHxKu7sMmmB7dTxk4PFcOIzKhQ3ld9kehhsqxGI%2BGNl3Z6R4m8WWGh2zM8iyy9AiNzmvEPE%2FiS9165Zrhz5QPyp6VkXVzLdTNLO5d26k1DXzGNzKpivd2j2Prcvyqlg1zby7hRRRXmnqhRRRQAVZtL24tGDW8rIR6UUU4tp3RMkmrM14fGGuQ48u9cY6cVZ%2F4T3xF%2F0EH%2FIUUV1rEVltN%2FezjlhaLesF9yIZ%2FGuvTqVkvnIPtWZdaxfXSlZ52YGiis6lapL4pN%2FM0p0KcPhil8jPooornOoKKKKACiiigAooooA%2F%2F9k%3D" /><h4></h4></div><div class="bookmark__right-side"><q>Did you know that you can use `sidekiq_options` with ActiveJob on Rails >= 6.0.1 and Sidekiq >= 6.0.1?</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://twitter.com/hopsoft/status/1514716234020913152"><br /><small class="text-muted">twitter.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>GitHub - madeintandem/jsonb_accessor: Adds typed jsonb backed fields to your ActiveRecord models.</h4></div><div class="bookmark__right-side"><q>Adds typed jsonb backed fields to your ActiveRecord models. - GitHub - madeintandem/jsonb_accessor: Adds typed jsonb backed fields to your ActiveRecord models.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/madeintandem/jsonb_accessor">GitHub - madeintandem/jsonb_accessor<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>GitHub - mrkamel/search_cop: Search engine like fulltext query support for ActiveRecord</h4></div><div class="bookmark__right-side"><q>Search engine like fulltext query support for ActiveRecord - GitHub - mrkamel/search_cop: Search engine like fulltext query support for ActiveRecord</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/mrkamel/search_cop">GitHub - mrkamel/search_cop<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAKKKKACiiigAoopVBZgB1JxQAlFaQ00YGZDn2FFPlYuZGcAT0BP0pK3TJFFhSyJjtnFJLDFcJyAc9GFPlFzGHShSegJrStbEIxabDYPA7fWrbSxRnazqp9M0cocxg0VuSxRXCfMAc9GH%2BNZFxE0MpRvwPqKTVhp3IqKkt4mmkCL%2BJ9BWxDBFbrkADHVjQlcG7GP5EuM%2BU%2BPXaaZWybyAHHmD8jRNDHcIHUjcOQwp27Cv3MWlBwcjrW5dk%2FZpef4TWLF%2FrU%2F3hSasNO5ZGoTAAEIffFFa2T60VVn3JuuxzxJYkk5J6mremSlZ%2FLz8rdveqdT2P8Ax9x%2FX%2BlStynsal5IYrdmX73QVikknJ5Na2p%2F8ev%2FAAIVkU5CiXdMlKzeX%2FCw6e9Tasg8tH7g4%2Fz%2BVVdO%2FwCPyP8AH%2BRq5qv%2FAB7r%2Fvj%2BRoWwPcXTI9sBfux%2FSqupTF5TGD8i%2FqauacQbRAOxIP51nXqFLmQHucj8aHsC3IKt6dMY5whPyvxj3qpU1mpa5jA7Nn8qSGzWuv8Aj2l%2F3TWNF%2FrU%2FwB4Vs3X%2FHtL%2FumsaL%2FWp%2FvCnLcUdjfoooqyDnansf8Aj7j%2Bv9Kgp8MhikV1AJHrWSNTU1P%2FAI9f%2BBCsirM9280exlUDOeKrU27iSsWdO%2F4%2FI%2Fx%2Fkauar%2Fx7r%2Fvj%2BRrOgkMModQCR61JcXbzoFZVABzxTT0BrUfp9wInKucI3f0NaFzbpcKM8MOjCsSrEF3LCMAhl9DQn0YmuqJTp0ueGTH1NXLa3S1Qsxy3dqr%2FANpf9Mv%2FAB7%2FAOtVae6kmI3YCg52ijRBqzUuv%2BPaX%2FdNY0X%2BtT%2FeFWJL6SRGQqmCMd6qqdrAjsc0N3GlY6Gisr%2B0Zf7qfrRT5kTyspUUUVBYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH%2F2Q%3D%3D" /><h4>MJML - The Responsive Email Framework</h4></div><div class="bookmark__right-side"><q>The only framework that makes responsive email easy. MJML is a markup language designed to reduce the pain of coding a responsive email.</q><div class="bookmark__comment"><p>Also has a rails plugin.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://mjml.io/">MJML - The Responsive Email Framework<br /><small class="text-muted">mjml.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPO9J1%2FVI9I8YT3AddTTV%2FsVnbyS%2BascrwwLGqnAym993QcEkgc1leNviVP4DnexktbK8ttMt4DLLd6vGl7eBsKWhhAZmK9SX255x612ekeDrPTZxN9sv7qQ3z6k7XLq2%2BdohFuOFHAUEgDABPHAAGF4k%2BFGk67fa%2FPLqmsWsOuKn222tpkWOR0UKj8oWyMA4ztz1Bp6C1OZm8WeJdI8afEebTNPfW7LTmtLgw3GoGGO3i%2BzB2ESkN8zcnAAHHJzgV0GkfEe917xVaaVomg%2Bfaz6fZ6q11LdCPyoJgScrtOXGAAoPJzkgCpdV%2BFNhqE%2BrTnXvEVvPqyRR37W90ifaI44hFsYbMYIBJPXJOCAcVs6b4D0fTtSvLu1%2B0hLnTIdJNuZB5aQRAhQvG4HDEZJNGganE6d8Vp9W1U6RcWWn28l9Z3clubDVku5rZolJ2zhBtRiBkbWbpiqvwv8e61DpHw%2Fstd02Saz1y28iLVJr4yzyTrGXLOhH3Tg4O4nucdK6PSPhJpmmS6M6azrk66RHNb2kc00RRIZEKNHgRgYwc7vvZA5wABq2Xw70m0sfCVpHc35j8MkmzLSJmTMZQ%2BZ8vPDH7u2jQNTntA%2BKs2o%2BMbDRrrTtNiXUHuYoVttWjubi3aFS3%2BkIgKpvCnGGbHQ1Q0j4t61qUPhmeLwnEIfEMcsdj%2FwATEZNxHkkP8nyx%2FKfm5bj7vQHb0P4S6Zos%2BhSWmta6yaJM72MUk0ZSJHDB48BBlTuOSct71o6T8NdH0u08J29vc6gyeGpJZLMvIhMhkDBvMwnI%2BY4xijQNS78N%2FFUvi3QZru6sRYXtrdzWNzAsvmqssTbTtbAyDweldVWH4S8M2fhe1v4LCW5lS9vpr%2BQzsrESSnLAYA%2BX06n3NblIYUUUUAFFFFAGcdZshEshlYKx2j5G5b0Bxgntx34pqa3ZMiMzyIWOAjRNuyegxjqcHjrgZqydNsiwY2duWBBz5Y6jpTlsbRGRltoAyDCkRjj6U9AKz61ZRsweRlUIsm8odpVhkHOOnT8x61L%2FAGnaeeIfNJkL%2BXgI2N3PGcY7GntYWjlS1tASoCqTGOABgD6cmhbC0VUVbWABGDqBGPlYdCPekBXt9ZtJ2RA0iSPIY1R42BJBI9PbPsCCcVDH4gsmZ1ZmQhigzg7jlhjgnH3T1x29a0Es7ZJfNS3hWT%2B8EAPfv%2BJpslhaSMrSWsDMvClowSO%2FH5mnoBXTWbI28k7SlI48byyH5c9Pr%2BFR%2FwBvWPm7Q0hTr5gjJTGCc5%2F4Cf59KuixtBvxawYfG792OcHIz9DzSCwtAABawABdgxGOFxjH0xxQBUvNat7WRleOdsEjKqMEg4I69qu2d3DeRl7d96g4JKkdge%2FsQaJbO2l%2F1lvE%2FOeUB5%2FyKkiijiGIkRBxwox0GB%2BgFIB9FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFZV5rK29%2BLZbaeXBUMyKTy3931wOT0wDxnpVifUI4dTt7J45d86sySYGzK8kdc5xz0oAu0UUUAFFY19r0VneSwyRgrEyq2JF38ruyE6kD19j6VfS9RtSlstkgkjiSYuV%2BUhiwwD6jbz9RQBaooooAKKZcSrBBJLJu2RqWbapY4AzwByfoKz7fWI5bG7uWguE%2BzKXdNmSVxuXBHBJXBwDxnnFAGnRWNpHiKy1W7NvaiXeELlmUBcggFQc8kZHTI5HPNbNABRWHN4ktoJpYbiKaKSN2QqwHQEgH6EYI9iKKdguX73S7G9kD3drFM4AGXXPQgj8iAar301rb6gs0lkZLhVCiZIwzhTnoeuAeP8AgVatFIDKXWFeN5FtbkKoQkMm0%2FM2On61fs7hbqASxh1UkjDDB4OP6VNRQBBcWdvcf6%2BCKQ5U5ZQfunK%2FkeRVK6v47W%2BkLWjMwUAyRrltuMjPHTJPfrmtSigDMbWYVCkwXRJ7CPkfX8qdBqqTSIi290NxHJjwBnoT%2Bf8AnFaNFACMoZSGAIIwQapta2tjp9wttZwrCVLNDGgVX%2BXGCOnQAVdooA5%2B1vbG2YyRaXJFMkO3McAz5Y6DPHHfH0roAcjNFFAFG40jT7mZprizgklbG52QEnAx%2FSir1FFwPzp8tP7oo8tP7ooorzj7QPLT%2B6KPLT%2B6KKKADy0%2Fuijy0%2FuiiigA8tP7oo8tP7ooooAPLT%2B6K3vBEaf2790f6l%2F6UUVjiP4cvQ2w38WPqd%2FsX0pNi%2BlFFeHY%2BhuGxfSiiiiwXP%2FZ" /><h4>GitHub - actmd/abraham: Trackable application tours for Rails with i18n support</h4></div><div class="bookmark__right-side"><q>Trackable application tours for Rails with i18n support - GitHub - actmd/abraham: Trackable application tours for Rails with i18n support</q><div class="bookmark__comment"><p>Seems to be interesting: Keep a “tour” per view file that automatically gets loaded for new users</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/actmd/abraham">GitHub - actmd/abraham<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAA4YwAA6AMAADhjAADoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BpVD75N0aBR9whsk8dxjjn61Tum1EX%2By1t7U2nkkiSRyCJc9MDtitDFB6dKAMlJ9ZaMFtMsFfOCPtrEY45%2F1X1%2FIevFmwe9kEv2%2B0t7crjZ5U5lDevVVx2%2FX8XaVdtfWMdxJbTWrPn91Mu1lwccirT52NtxuxxkZoANo9BRtHoKw7e616SwtX%2Fs6xM7qTKJbhotjAnAwEbIIHXPfpV%2FTZNSkLf2lZ2duABtNvdNNk5OQcxpjtzQBd2j0FZ15Jfo04tbZHC7TGSo%2BbJXP8YyQN3XHbmtLFI2Qp2gFscAnAJpp2E0ZdlJqb31ul3bRJbGzV5XVRkXGeVHznjHsf96rV6bxQhsoLaU87lmkMf0wQre%2FapYWuC5E0USLjgpIWP5FRSzGYY8iON%2FXe5XH5A0hme0useW5XTtP3hhtH2x8Ec5JPlcHpjr1PpzoReYUPmxxo244CNuGM8HkDtTojIV%2FfIitnorbh%2BeBUbtciQhIYSnqZSD%2BW3%2BtAEFybkSf6OtuV7%2BZIVOcnsB9KKvUUAGfr%2BVGfr%2BVFFABRR3ooAKKKKACis7xGt%2B3h7VF0Y7dUNrKLQ%2FLxNsOz73H3sdePWvN%2FCdz8T9P8SaXp3ij7BfWt5K%2F2i6gt22wRRwREOGXChnfeCrfxMSgKLQB6zRXkmn6l8ZZ5LD7Tonhq3SSTbc%2BY7ExLlTuBWU54YgDH%2FLNs%2FeWo49X%2BMxsUaTw%2FoAuTa73CkHbN52NoHn4b93zyyj3z8tAHr9FeT3eo%2FGFBdPb6R4clwW8qIAg485wPnM%2FzHy1RhlVyZMHG003xQvxWleNtHa3idrGCVhAsBjjuRbXXnRjzG3EGY22M5GMcjDZAPWqK8U1HU%2FjbZukOjaDot7DumZpr6VPMOZ5SgwkqgAReUAME%2BpzmigD2DzLj%2B%2FF%2FwB%2Bz%2F8AFUeZcf34v%2B%2FZ%2FwDiqj86L%2FnrH%2F30KPOi%2FwCesf8A30Kr3uwtCzbSNJvD7dytjIGM8A%2F1qaq1iQ3nFSCC%2FBH%2B6tWaUtwQUUUUhmfPqTRTSRm2YlQSMyxjdgZ4BbPPvUP9tAxh1t8gkDH2iL8f4u3H51ptFGzbmjRmxjJUE1lyaroCuyyX%2Blh1OCGmjyCOMdaqMJS%2BFXGlccdYUybEhDsWKgLcRZOMf7XvSNrK7wqwbgThSLiL5vp81VbvUNDnKGPXLG3KnOYpYDk8c%2FMD6dqmt4LTUkZrLVhOiHBMAgcLwPl%2B4cev4%2FSm6c4q7TCzHtrQAUrbbhtJbFxD8p9Pv%2B4P4ilGsg5PkDaCRk3EWDxxj5u54pBpsY3AahIM9B5cHHTP8HoMfQ1fRLZAf9SWIwzYXLfWpsIoHWwAC1qwzyM3EPPOOPnoq80dmx%2BZLc%2FULRRZgK97bpI0bzIrqnmspYAhP7xHp71LbzR3ECTQOrxOoZXU5DA9CD6VkR6nptxOY1jZpJQIzut5BuHOASV6cnr71pRuscapHGFRRgKOAB6UgLHeivNvjb8TX%2BGfh7T9TTSl1L7VdfZjGbjytvyM2c7Wz92vGv8Ahreb%2FoTI%2FwDwZn%2F41QB9XUV8o%2F8ADW83%2FQmR%2FwDgzP8A8ao%2F4a3m%2FwChMj%2F8GZ%2F%2BNUAfV1eBt8EdXW8vJUv9GlWeRnXz4HYqCT09DzXG%2FwDDW83%2FAEJkf%2FgzP%2Fxqj%2Fhreb%2FoTI%2F%2FAAZn%2FwCNV2YTHVsJf2Ttff5FwqShsdmPgprAxi48PcHP%2FHs59PX6V3nwj8DXXgiy1GG9u7e5a6kR1MKkBQoxzn614h%2Fw1vN%2F0Jkf%2FgzP%2FwAao%2F4a3m%2F6EyP%2FAMGZ%2FwDjVa181xOIpulUej8kVKtKSsz6iuLaSZY18x4whH%2BrlK7vrx7VEbCYnJubn7u3%2FXe2M%2Fd618xf8Nbzf9CZH%2F4Mz%2F8AGqP%2BGt5v%2BhMj%2FwDBmf8A41XCptGdz6pQSIirhTgYyXJJ%2BvFFfK3%2FAA1vN%2F0Jkf8A4Mz%2FAPGqKm4j6HMF47RK0ephMDLC%2BTIyvOR3I%2FHmrVnZyNHDLNPqEbq5cxSXAbv0bbwRx0z3IrT2t%2FdP5UbW%2Fun8qQHz3%2B2n%2FwAk%2B0H%2FALCf%2FtJ6%2BP7ONJbuCOVtsbuqs2cYBPJr7A%2FbUBHw%2FwBByMf8TP8A9pPXx9asqXMLukbqrglZM7WGejY5x645pxdmmwNzxlpOm6ReQRaTf%2FbYnTcz5HBz06CuerqGvtP3qBoXh75WXJFxd4bByQf33Q9OO3THWsaW3S4uZZEmsoA7lhGrMFQE9BnJwOnJJ%2BvWtK1SNSblGPKuw5O7uihRVz7EMc3dqOQPvn8%2BnTmqsi7HZcq2DjKnINZCOl1bRdKtfC1jf2uoNLqE23zbckYjyM%2BnP9K5iultr6wS2t1k0TQZpBGu55JrpWbAx8wWUKCepwByPSqGoCC8kg8mPTbIRxLGRA8pEjAffbeW%2BY556DjoK2r1I1JJxjy6FSaeyMmirv2Ebsfa7TpnO8%2B3t71Wmi8oqN6PuUHKHOPY%2B9YknTeFtD0vU9Pkm1C8eCUSlAolReMA5wR7miq3h69t7aydJ7DQ7ljISHv%2FADt4GBwNjAY%2FXOaK9WjmGHp01CVCMmut3qbRqRSs4n6YeavvR5q%2B9QfL6H86ZNLDBC8szbI0G5mZsAD1NeUYngH7bDBvAOgkf9BP%2FwBpPXx3bNtuImLbcODuyRjnrkc%2FlX2F%2B2pj%2FhX%2Bg4%2F6Cf8A7SevjyGN5pUijGXdgqj1J6U0m3ZAdI2oJvXGpDaDnH2m4IPX%2FY%2BlUrjVXRjH58typBDMtzLghsZHOD2545qrrGj3%2BjTRxanbNbySLvVWIJK%2BvBrPpzhKnLlmrPzG01ozUm1Z5kKTfaJYyQWV7l2B%2FwA8flWYxBYlRgE8D0pKKkR0UN8gsoov7Q2fIqlftE4A4xjATHHtn2pl3qrRNvjvXuGY5%2BS5m%2BXBBGdwGecnj9Ko3OjX9rp0V%2FPblLSXGyTepzkZHAOelZ1XOnOm7TTXqNprc1v7ZlAIVroDkgfanwCe%2FwBazZ3R3zFH5a4Hy7iajoqBG7oV2kFo6tfLbkuTtM06Z4HOI1I%2FrRVbTNB1LU7dp7G3EsStsJ8xV5wD3I9RRXVDA4mpFShTk0%2BqTLVOT1SP088lfU0eSvqaKK5SD53%2FAG2FC%2BAdBA%2F6Cf8A7SevjqGVoZo5Yzh0YMpxnkHNFFNNp3QF7WtZvtamjl1KYzSIu1WIA4rOooqqk5VJOU3d%2BY223dhRRRUCNS713ULvSoNOuJ91nBjy02j5cDFZdFFaVak6jvNt%2Bo229wooorMRraT4g1DSrZoLKVEjZi5BQNzgDv8AQUUUV30sbiacVGFSSS7NmiqSSsmf%2F9k%3D" /><h4>Embed a page builder into your Ruby on Rails app</h4></div><div class="bookmark__right-side"><q>Maglev is the only page builder for Ruby on Rails application. Similar to the Wordpress Elementor plugin but in RoR. Live preview, i18n, SEO, ...etc.</q><div class="bookmark__comment"><p>Looks interesting; another approach to adding a Wysiwyg site builder to Rails, this time with a promising block schema. Esp. for static landing pages which can be edited on the fly by end-users.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.maglev.dev">Embed a page builder into your Ruby on Rails app<br /><small class="text-muted">www.maglev.dev</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABJGQEA6AMAAEkZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVSCDg8Gkr0v4keCWtJJdS01C0DEvKv90%2BwrzUgg4Iwa6MThp4abhM5sJiqeKpqpTYlFFFc50hRRRQAVraFoGoa3LssIt3qScCrPhDw9Nr%2BpJCoIh%2FiavoDR9LttLtI4LaNV2jBYDk162XZY8V789I%2FmeNmmbLB%2B5DWX5HnGmfC1HiBv55EfuFNX5vhTpvlnyrq43%2B%2BK9IxRX0UcqwqVuQ%2BYlnGLk789jw%2FXPhvqFqrSWC%2BbGoyctziuDkjaN2R1IYHBBr6rI4OeRXO6v4Q0zVLoTzR7H9EAANedisjjLWg7eR6eD4glH3cQr%2BaPnTB9DRX0tbaFpdrCIvs8Jx3YDNFYLIJ9Zr7jofEkL6U395qyRrKhSRQ6HqCODXm3jL4dpdl7nSRic8lCcCvSwfQ8UtfQYjC08THlqI%2BawuLq4WfNTZ8ualpt1p1w0N1EVcflVOvp%2FVNJs9St3iuYUw38QUZrzjX%2FAIXgsW0dySecSN0r5rFZLVp60veX4n1eEz6jV92t7r%2FA8npa6PUvBur6fnz4QQP7pzWHLaXEMm2SGQH%2FAHTXkzo1KbtOLR7VOvTqq8JJntfwj08WmgO7qPMd8574rvBXN%2BAXVtBi2Ky4wCGGO1dJX3OCgoUIRXY%2FPMfNzxE5S7hRRRXUcgUGiigDKvtHhvLgzPNKrEYwrYFFct4v8Q3un6y9vb7PLCA80V5dXFYeM2pR1PXo4PEzgpRlozR8FaxPNbR2WoowuYwE3beDXWimBEByEUH1Ap9d9GEqcFGTvY82vUjUm5RVrhRRRWpkNaNH%2B8qn6iomtLdvvW8R%2BqCp6KTSY02thkcaRDEaqq%2BgGKfRRTEFFFFABRRTZWCRsx6KCaAPHPiXeRQ%2BKpkcnIjXpRXNfEK%2BXUPE9xOh4wF%2FKivhsXiG682trs%2FQcFhUsPBS3sj2DwT4qttdsFDOFuYwA4Y4yfaupBr5z8G6XqGo3v8AxK7iOGdDxvbGa9o8N2%2FiOBlXWbm2ljHH7sc4r6LLsdUrwSnF%2BvQ%2BYzTL6WHqN05r06nS0UCivXPFCiiigAooooAKKKKACsjxRqcWlaPPNNnDKVH1IrWNeS%2FF7xAsuNKiP3SHYiuPHYhYejKfXoduXYV4mvGHTr6Hl9xI007yMcliTRUdFfBt3P0ZK2hoaFqcmk6nDeQk7oznAr6E8M6%2Fa63YxyxSKJMDcuec1811oaPq93pFwJrKQow59q9PLsxlhJWesWeTmeWRxsbrSSPp%2BivJND%2BJ8iAJf281y57RAZr07Sr4ahaJcLFJEGGdrjBFfVYbG0sT%2FDep8disBWwv8RaF2iiius4wooooAKDRms7W9WttIsnuLpwAOi55NTKSguaWxUISm1GKu2UvF2v2%2Bg6XJPOcuw2qoPOTXzvqN5Lf3clxOxZ2Na3i%2FwART6%2FqDSuSIRwq1gV8ZmeO%2BtVLR%2BFbH3eU5csHTvL4nuFFFFeYesbFr4c1Sd1UWcy57sprp9K%2BGeo3Y3yzRxKD0I5rutD%2BIWmakMSKbdh18xhiupg1SxmAMV3C%2BfRhX02GyvBz95T5vwPk8Xm%2BNg%2BVw5fxMLw74K0zSBHKIg9yvVyc11IGOMYFNV0b7rA06vdpUoUo8tNWR87WrVK0uao7sWimswUZYgCq8t%2FaxjMlxEo92xWjaW5mot7ItUhP5VzOteNNL0wH96s5x0jYGvO%2FEHxKu7sMmmB7dTxk4PFcOIzKhQ3ld9kehhsqxGI%2BGNl3Z6R4m8WWGh2zM8iyy9AiNzmvEPE%2FiS9165Zrhz5QPyp6VkXVzLdTNLO5d26k1DXzGNzKpivd2j2Prcvyqlg1zby7hRRRXmnqhRRRQAVZtL24tGDW8rIR6UUU4tp3RMkmrM14fGGuQ48u9cY6cVZ%2F4T3xF%2F0EH%2FIUUV1rEVltN%2FezjlhaLesF9yIZ%2FGuvTqVkvnIPtWZdaxfXSlZ52YGiis6lapL4pN%2FM0p0KcPhil8jPooornOoKKKKACiiigAooooA%2F%2F9k%3D" /><h4>Tweet: you can easily track slow DB queries without any additional gems</h4></div><div class="bookmark__right-side"><div class="bookmark__comment"><p>Simple solution to notify slow queries as exception to the error tracking service.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://twitter.com/kukicola/status/1578842934849724416/photo/1">Tweet<br /><small class="text-muted">twitter.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPPbf4iGbSNRlSDSnu7K6itnkTVV%2BxESKGEgnKgkDkFQhbcMAEHNZ2o%2BNtY1TTNFuNEgsknGvDTbtVviYZCoJASQREtGwwS20EYxg109z4NN1bRG41%2FWZdRhvFvob5niLRSCNosLHs8oLsdgQE53Ek55qAeAbZbC4gTV9VE0morqsd0zRNJFcAAFhlNpBwcqQQMkDAAAegtTHl8U6vot14yvWshf6RpuqJ5zy3mx4YTbW5ZYU2kNt3M5BKg5OMk8S%2BIfiZBpOq6nEkWnSWmlyrDdCXUViu5CVVm8iDafM2hx1ZdxBA6c9JfeErG90zxFYyzXQi1yUzXJVl3ITFHF8nHA2xL1zyTUN94QS41K8uLXWNW0%2BC%2BkWa8tbOVESZ1Cru3bS6Eqqg7GXIHrkk0DUS28UTS6n4hWexjt9J0R2juLx58s5EMc3yoF6BZOckYwMZycaXhVL1dDt5dUaT7dcbriVHJPlF2LeWM9kBCj%2FdqB%2FC9lJHq0by3Bj1O9jvrhSy4LKsS7Bx9wiFQR1OW5543hSGFFFFABRRRQAUUUUAFFFFAHDeLvGepaV4y0rw5o%2BiJqV5qNrLPG73XkpGUZQS52n5cEnIyc4AHORiy%2FFSW28b22jXenacttcamdLVYtVjlvEb%2BGZ4FBCxk8YLbh3A6V1Fh4WuJvEmn%2BItfvYp9YsYJrWL7FCYLcxSFSdyOztuG3qGA9qwoPhHpVvLbGDWNcS3tNUGrWtt50Zigm3l2wCmWByR8xYgHgjJy9BamPD8W9Wki067XwqrWF3q02iq66gN7XId1jwpUDadnLEjHPBwM9j8PPFl14lXWbbVNOj0%2FVNJvmsriKKfzoydoYMr7VJBDdx2qvD8NdHh07T7JLnUPJsdaOuxnzEyZy7PtPyfcy544PTmtrw74Ys9B1LXL20luXl1e7%2B2TiVlKq%2BwLhMAYGFHXP1oA3aKKKQwooooAKKKKACiiigAooooAzl1uwcArOSD3EbeuPT1%2FwAaYuuWTrK0TSSJGqsXVDt5baME%2B%2F6c1CW0RYQ5t7YR5ZM%2FZ%2BBjk544HQ56U6C60eSKR4UhaNQN2ID%2FABNwOnOW%2FwAaYiYa3YmSNPNO6Tdtyh52jJx68Bun90%2BlSTanDHBBMBI8Ux4ZVwFHq2cY%2FGqkd9o0xQRiBuQikQnAOTgZxxnkj17U03eiKvkKkDLEciNISQDj6Yzj%2BlAFltc05VZjcrhWKkbWzkHHTHPP8x61IdWsxB53mny95jyI2PIGfTpjnPSi2s7Ga1SSOzhWOVN20xBThsHBH4D8h6VOtnbKGC28IDMXYBBycYz9ccUDKkus2aQNKkm8KyqwHylSxwM7sY%2FGmLr1iyqVdznG4bDlcgHkfQ9s1ejtLeN3dIUDOwYnHcDA%2BmKYmm2SZ2WdsueuIlFGgEcmrWcbRq0p3yIJEUIxLKTgYAHXJ6daY2sWhtppomeZYgGIRDkjOMjOMgEHOOmKlk0yxlVA9pAQihV%2BQcKDkAe3tT4bG1hWURW8SiU5cBR831o0AZaahDcNsOYpS7IschXc204JGCeMgj8DVymoixrtRQq9cKMCnUgCiiigCodOsyV%2F0WH5XMgGwY3HgnHrUsdpbxKVjgiVSQcKgHIOR%2BR5qhp%2BsC8vDCttOqYYrIynGAcfN6Z6r1yPTpVuwvUvDchI5UMEzQsJFxkjByPYggg0AI2mWTFSbSD5SSPkHfOf5ml%2Fs6y4%2FwBEt%2BMY%2Fdjt0%2FKrVFADIYo4IxHCixxr0VRgCn1nWeqx3N41usUyD5vLdkID7Dtf3XB4%2BbGe2RVK48TW8AYvaXu0NImQi9UfYc%2FNwM87jgYI5zxQBvUVDZ3Ed3aQ3MBJimRZEJGMgjI4%2FGqdzqnkapFZfZZ3eXaUdcbSDu3Hr0XAz%2FvL60AaVFUI9Uhk1WSwCyCVATvIG0kBCV65yBIh6Y59jV%2BgAooooAKKKKAKUel2MV59rjtYluAWIkC8jcADj0zgZqqdUgtpZALKcFmJYxRZ3Nnac474CnPoRWvRQBlPrKRxrI9vOI23nIXJG0gcj3z%2Blao5FFFAFeKytYbh54baFJpM75FQBmycnJ781hvJpslxI1zooMsuY2ZYA5cZJwTj15%2BrfWukooAgspUmtkeJGjTkBGXBGDjp%2BFOe3ie4jnaNTNGrKjkcqGxkA%2B%2BB%2BVS0UAZMtxBbajNMdPYzHEXnxxgtIMBsZ9OfXsfSrVhfreEgQzRMqhiJFx1JGP0q5RQAUUUUAFFFFAH50%2BWn90UeWn90UUV5x9oHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UUUUAf%2F2Q%3D%3D" /><h4>GitHub - dogweather/asset_ram: Memoize your asset links. Saves my Rails app 17–95% allocations per request.</h4></div><div class="bookmark__right-side"><q>Memoize your asset links. Saves my Rails app 17–95% allocations per request. - GitHub - dogweather/asset_ram: Memoize your asset links. Saves my Rails app 17–95% allocations per request.</q><div class="bookmark__comment"><p>Some developer’s solution to reduce asset lookup in production by applying caching</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/dogweather/asset_ram">GitHub - dogweather/asset_ram<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BWkFTIOBTEFTIKykztpxHKKkUUKtSKtZtndCA0DmnYp4Wnbai5soEJFMYVYK0xlppkygVWHFRMKtFKida0TOWpAqMKjNWHWoWFapnBUjYZRS4oqjEuoPapo14FLGlTxpwOK5pSPapUhEWpVTpkGm3E0NpxKS0n%2FPNeo%2Bp7VYsrTXNSQPp%2BnERHlXKAAj%2Fefg%2FhWT2u9F5nVG3N7OKcpdkrsYE6cU%2FbVmbRfE8Cb5LJyB%2FwA81jc%2FkMmsv7bdq7JI211OCrRqCD7jFSlzfC0%2FmaTl7J2qwlH1jb82WintTGT2pEu526uD%2FwAAX%2FCrEcsjDkj%2FAL4H%2BFD5kVHkntf%2BvmU2TioXT2rciQN1Cn%2FgI%2Fwp76bHKuV4PtxU%2B3S3LeBlNXic06exqB05rXu7N7d8OPofWqTx810wmnqjyq%2BGcXZooFOaKtGPmiteY4%2FYF%2BOOlup%2FsVqrr%2Frn4T29W%2Fz%2FAEq5HFjtVnwtp66v49tbeZQ9vbZd17ERrnB%2Brfzric0k5S2Sv9x7c4SSjGHxSaS%2BfU6PwV4LjtYI9Q1iIS3sgDpFIMiIHkEju316fWu0ZDn3qLxdqraFos1%2F9nNwysq7S20fMcZJx0rzm58RnW9PPm63cW17IcJY29tsQnspk3ZIPqSPpXkQVbGfvZbXt%2FSR9ZHG4PJYLC0leVr9Ffzbdrt9ld%2BR6WE7kfpWbrnh6z1qArcJsuAP3c6j5k%2BvqPY1wEM40fWNmoTS%2BHpFhVzDYjz1lYgkFgXIBPYEdPTrXWeAfE91r19c2k0Ikjgj3rdCPyy3IADKCQCck8HtTqUKlFe1pvRa3%2FrR%2FJjp51hsc%2FquIhZydrb7fdJfNI8%2BvrCfTL%2Bazu02zRHBx0I7EexHNPirvPinpyi2sdRVcOrm2c%2BoILL%2BRDfnXCQivQo1%2Fb0lM%2BerYb6tXlSWy29C7D2rQhHNUYB0rQgXpWNRno4dE0tqlzCyMB04rlbq2aGZo3HIrtbcYxWV4htgJ0kA%2B8vNTh6zjPlKzDCqpS9ot0csY%2BaKvmHmivQ9oeB9XLsUQHc1o%2FDNlh%2BI91DJ96eKdU%2BuN4%2FRTVOPqKz72e40fWNP1uy%2F1kLqT6Fl7H2K8fnXM4urGdL%2BZNfM6cU%2FZKFeK%2BCSb9Op7J40c2%2BgvKl7NZFZE%2FfxQ%2Bdtyf4k7p69foelebXuj219bG5vNLilhxzqfh9g6jj%2FAJaQHp6n7teraTq1tqmnwX1g%2B61nXIB6qe6N7jofz6Gq0miaa10Lm3iNnd%2F89rY%2BWfxxxXzmGxrwt4STTT%2Frs%2FzXkd%2BOhDGtVE001%2FXdfdZ%2BZ5Tpfh7Thuk021utdKctc3S%2FYrOL%2FeJOWI9Mj8a7XwJI0%2BsTodQS5SKBh5Nhb%2BVYwEsOFPG9%2FfHTPJroZ9Gtbt0fVHmvtnKJM%2FyL%2FwABHFaURWONYbeNUQcKiAKo%2FAVeJzL20XHVt%2F12%2FJR%2BZng8NHDzU42SXb%2Fh%2FwA3L5HKfFdkj8MQJkbpLxNo%2FwB1GJP6j868vgxW78RPEEes6xHBZyB7KyBRHXpI5PzuPbgAewz3rnoW6V7WAoypYeKnu9TDE4pV8Q5rY1LcDjNaMAGRz1rJgetGGTBHtTqROyhVSNaDBHWqmuqH8oZ5wadFLgCql9J5kw9AK56cHz3O6tWTpOPczjFz1NFSt1orsuzy3FHY%2BHPhxrWt2FjcwXWj2016jzW1ldXojuZYk3bpFjwTt%2BVh68E4xzVz4X%2BDNN8YaB4iuNSs9bv%2FALCLVY7TSmiEknmlwSd6kfLtB7d66rwF4o8OWulaHrmtz6Y%2Br6TY3Fqm6a4ivIlYTbIVgCmOX%2FWYEu4DDnK5Ga858CeMbHw5pGtaRrOirq9nqX2Yyxi%2Fe1KGEsR8yAk8t7dK6uSCaZ4%2F1irUjKPp%2Bev4GzpvgXWND13WJ9Bu7bQvDttcQ2s8Piu9SFw7xBxvKLgEk%2FKV5wRnjdXfaRozXehTPqb2%2Bh6xb602kSw6jeKsTOIkdVjYLl2YuMHuPzrkLLxl4QXwrq9vP4dEsFzq1vPFox1OfeiLblWlE%2B3Jy3BBHRyB0BrH8SeP5vEMR%2FtOwg85tdGtl0lKjIiSJYgMdAsY%2BbJJ9Kxr4bDV3zVY690ZU6WIhpRdl2e36%2F13O9sdKur5ZlSa0iulu5rCC0uJxDLd3EP%2BsihDYDEHjJIXJxmuUvtB8U%2BLNAtpNHudDsbe%2FtWuo7KbUljvLiFXZXJDABVXaSwyBjPLYIFzT%2Fi1JAdQVtOuikmo3Wo28dtrM9qImnYuySiIDzVDHIztI57GufsPFkVtcaNM2mCV9O0i50rLXLZl87zcyE7eCPNPHOcdRnjGjgcHQakk2%2FP%2BrGk4Y6qmm0kYn%2FCsdZTXI7Bb%2FQ5LN7E6l%2FayXwNktuG2FzJjPD%2FLjbnPartp8L9b%2B16pFdXuh2UGnfZ2kvLq%2FWO3kjnVmikjkxhlYKcd8nGOuNzwx4%2BHh620q3hsHEFrpkulymG%2Fkt5ZVeczB0kUZjYN%2FvZGfXip4m8Zrr9hrttJZzeXqcloUeXUZbl4Etw%2BF3vksSZCScqAc8V3OrTauTDC4mLtp%2FT%2FAK%2F4cyI%2FBWoDwodfjvtHubeJYpbm1tb5Zbm2ikcKrugGByRxkkZ5A5rpE8Haf%2FwtbW%2FDAnuxY2S3bRPuUynyoS65O3B568dKs6v8T0vvCFzoY0UwLdWUNmwTUZfs8fllCGit9uxM7TnGSSevUHFPjuZPiNd%2BLbewgDXM0ryWcjF0aORNjxlgAeR3x17VnL2b2OiCxFnzab2%2FC36mz4C8H2Ov6Do99ez3cct74hi0iRYmUBYmtzKWGVPzZHXpjtXn14BFdzRgkqjugJ64DED%2BVdxF8SLTTbjQovD%2FAIbj03R9N1Eao9ob6Sd7iYJsBMrL8oCcABTXnVxeLPcyyZUGR2faGBxls4%2FWolCNlym8K1Tmbnt0JC3NFVjLz3oqeUv2x75afB7SdUtg%2BlajOjapJbXmkRSTgs1hi3Nw7cYLJ57Yzz8g45qf4eRaQnifwELX7Td6VcalryadHJIm2IKBtdvk3PuQHgnqwI6YPz%2Fb%2BJNWt2tGg1W%2BjNpC9vblJ2HkxNnci%2BinJyKqPreo26acltqF3ClhI0tosczL9ndiCzR4PykkDkeldcXG%2BiPnXKUtHI9l0IeGLnwBpdvqWjavFZXfixrOC3F6qzW2%2B2hVmdzGC%2BCchcKDnk8cxfDHRtMs%2FiV420PV7lhpVjpuqWk12UBdIo3CGUDBwwUE8DrXkl94q1vUJVkv9Z1G5kW4F2GluGYiYKqiTJ%2FiCooB9FFQx69qSXl9dpqF2t1fJKl1MJSHnWTmQOf4g3fPWqsr3sbKo7NX3PbvEGnWk%2FibxHb%2BJtMltdC8O6OLnSLTSZ1RJbcyoqSLMVPmB85ZyCc57iksPA3hi68IW%2Boy3zWlzqVlc6jbb78s9uqF9kflCEiUAKA7llIOcAV4x%2Fwk2rnTk086rfGxSFrdbczt5YiZlYoB%2FdJVTjpkCpbPxZrllpE2lWetalb6ZNu8y0iuXWJt33gVB6HPI796XKr7FqrJKyke4aHoukaLp3imzg0%2FUpNRXwXNeyalNIGtpfOhRysabOMHhWDZO1gemau6r4R0fWfGuurq817eagZbG0tUluRYpIGs42ISVYTG82SAsZ25HJNeDp408RJo40lNf1VdL8poPsYu3ERjYYKbc4244x05p9r468TWdzdXFp4j1iCe6CieSO8dWl2qFXcQeSFAAPUCnZWtYn2k7uXMelfCO%2FtvDt146nu7O%2FXU9M0yYpJFcpHLCqzKjoDtYCTOPnGQMEAc1Lc%2BFNGu7e2jnj1iXVtX0O48R%2F2t9qDW8DYkkEUi7MMBtCs5IO5uAM4HjNtqt3apcrbXU8K3URhnCSEeahIJVvUEgHBq3H4q1uLQn0WLWdRTSJM7rJblhCQTkjZnGCTkjoTSUVa1hyqNvmTOv%2BKlhoHh%2FUTpGi2mpJeRQwTz3FzdiRGEtusmxUCAjBYck%2BvtXtPxPns0sfHaXOoWWpWWnaXAiaFFpSJNYTzRxiK48%2FALKGyx2k4DYOOBXyzqWqXWp3Ul1qN1Nd3MiqrSzOXZgqhQCT6AAfQVZl8TaxJf3t7Jq1%2B15fW5tbqczsXnhKhTG5%2FiXCqMH0HpVRVrkTk5W12PbR4D8Nafiy1SwA1GBUW5SfXJ%2FMSQqGIZbe0kjU%2FNwocnGM9aK8iPxE8Y7I0Xxd4hRI1CKqajKoAHTo1FOyI55d%2FxOREjetNkkYryaKKaWpxXGB29aXe3rRRVl3Yb2o8xvWiigLsXzG9aTzG9aKKAuw3t60b29aKKAuw3mk3nPWiigLhuNFFFAXP%2F2Q%3D%3D" /><h4>Storing Ephemeral UI State with Kredis for Rails | AppSignal Blog</h4></div><div class="bookmark__right-side"><q>Let's dive into how Kredis works and how you can use it to store short-term UI state.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://blog.appsignal.com/2023/02/22/storing-ephemeral-ui-state-with-kredis-for-rails.html">Storing Ephemeral UI State with Kredis for Rails | AppSignal Blog<br /><small class="text-muted">blog.appsignal.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QCwRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAjKAAAAD6AACMoAAAAPoAAaQAAAHAAAABDAyMTCgAAAHAAAABDAxMDCgAQADAAAAAf%2F%2FAACgAgADAAAAAQBkAACgAwADAAAAAQBkAACkNAACAAAAAQAAAAAAAAAA%2F%2BEJlmh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpleGlmRVg9Imh0dHA6Ly9jaXBhLmpwL2V4aWYvMS4wLyIgeG1sbnM6YXV4PSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wL2F1eC8iIGV4aWZFWDpMZW5zTW9kZWw9IiIgYXV4OkxlbnM9IiIvPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw%2FeHBhY2tldCBlbmQ9InciPz7%2F7QAsUGhvdG9zaG9wIDMuMAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs%2BEJ%2B%2F%2BIPcElDQ19QUk9GSUxFAAEBAAAPYGxjbXMCEAAAbW50clJHQiBYWVogB%2BIAAQAdABQANgAcYWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAAB0ZHNjbQAAAcQAAAQ2Y3BydAAABfwAAAAjd3RwdAAABiAAAAAUclhZWgAABjQAAAAUZ1hZWgAABkgAAAAUYlhZWgAABlwAAAAUclRSQwAABnAAAAgMYWFyZwAADnwAAAAgdmNndAAADpwAAAAwbmRpbgAADswAAAA%2BY2hhZAAADwwAAAAsbW1vZAAADzgAAAAoYlRSQwAABnAAAAgMZ1RSQwAABnAAAAgMYWFiZwAADnwAAAAgYWFnZwAADnwAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAAAAAACABEAGkAcwBwAGwAYQB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAACMAAAAMaHJIUgAAABQAAAG0a29LUgAAAAwAAAHIbmJOTwAAABIAAAHUaWQAAAAAABIAAAHmaHVIVQAAABQAAAH4Y3NDWgAAABYAAAIMZGFESwAAABwAAAIibmxOTAAAABYAAAI%2BZmlGSQAAABAAAAJUaXRJVAAAABQAAAJkcm9STwAAABIAAAJ4ZXNFUwAAABIAAAJ4YXIAAAAAABQAAAKKdWtVQQAAABwAAAKeaGVJTAAAABYAAAK6emhUVwAAAAwAAALQdmlWTgAAAA4AAALcc2tTSwAAABYAAALqemhDTgAAAAwAAALQcnVSVQAAACQAAAMAZnJGUgAAABYAAAMkbXMAAAAAABIAAAM6aGlJTgAAABIAAANMdGhUSAAAAAwAAANeY2FFUwAAABgAAANqZXNYTAAAABIAAAJ4ZGVERQAAABAAAAOCZW5VUwAAABIAAAOScHRCUgAAABgAAAOkcGxQTAAAABIAAAO8ZWxHUgAAACIAAAPOc3ZTRQAAABAAAAPwdHJUUgAAABQAAAQAcHRQVAAAABYAAAQUamFKUAAAAAwAAAQqAEwAQwBEACAAdQAgAGIAbwBqAGnO7LfsACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABXAGEAcgBuAGEAUwB6AO0AbgBlAHMAIABMAEMARABCAGEAcgBlAHYAbgD9ACAATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtAEsAbABlAHUAcgBlAG4ALQBMAEMARABWAOQAcgBpAC0ATABDAEQATABDAEQAIABjAG8AbABvAHIAaQBMAEMARAAgAGMAbwBsAG8AciAPAEwAQwBEACAGRQZEBkgGRgYpBBoEPgQ7BEwEPgRABD4EMgQ4BDkAIABMAEMARCAPAEwAQwBEACAF5gXRBeIF1QXgBdlfaYJyACAATABDAEQATABDAEQAIABNAOAAdQBGAGEAcgBlAGIAbgD9ACAATABDAEQEJgQyBDUEQgQ9BD4EOQAgBBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQByAG4AYQAgAEwAQwBECTAJAgkXCUAJKAAgAEwAQwBEAEwAQwBEACAOKg41AEwAQwBEACAAZQBuACAAYwBvAGwAbwByAEYAYQByAGIALQBMAEMARABDAG8AbABvAHIAIABMAEMARABMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBLAG8AbABvAHIAIABMAEMARAOIA7MDxwPBA8kDvAO3ACADvwO4A8wDvQO3ACAATABDAEQARgDkAHIAZwAtAEwAQwBEAFIAZQBuAGsAbABpACAATABDAEQATABDAEQAIABhACAAQwBvAHIAZQBzMKsw6TD8AEwAQwBEAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE4AABYWVogAAAAAAAA8xYAAQAAAAEWylhZWiAAAAAAAABxwAAAOYoAAAFnWFlaIAAAAAAAAGEjAAC55gAAE%2FZYWVogAAAAAAAAI%2FIAAAyQAAC90GN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA%2BwEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB%2BgIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA%2BwD%2BQQGBBMEIAQtBDsESARVBGMEcQR%2BBIwEmgSoBLYExATTBOEE8AT%2BBQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe%2FB9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC%2BEL%2BQwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5%2FDpsOtg7SDu4PCQ8lD0EPXg96D5YPsw%2FPD%2BwQCRAmEEMQYRB%2BEJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE%2BUUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF%2FcYGxhAGGUYihivGNUY%2BhkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6%2BHukfEx8%2BH2kflB%2B%2FH%2BogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS%2FHL%2F4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M%2FE0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA%2BID5gPqA%2B4D8hP2E%2Foj%2FiQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU%2FZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV%2BzYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY%2BtkQGSUZOllPWWSZedmPWaSZuhnPWeTZ%2BloP2iWaOxpQ2maafFqSGqfavdrT2una%2F9sV2yvbQhtYG25bhJua27Ebx5veG%2FRcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY%2Bdpt2%2BHdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ%2Bwn8jf4R%2F5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5%2BIBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN%2F45mjs6PNo%2BekAaQbpDWkT%2BRqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5%2F6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS%2B%2F796v%2FXAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8%2B40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1%2BDYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36%2FgNuC94UThzOJT4tvjY%2BPr5HPk%2FOWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx%2F%2FKM8xnzp%2FQ09ML1UPXe9m32%2B%2FeK%2BBn4qPk4%2Bcf6V%2Frn%2B3f8B%2FyY%2FSn9uv5L%2Ftz%2Fbf%2F%2FcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAAClt2Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAABAABuZGluAAAAAAAAADYAAKdAAABVgAAATMAAAJ7AAAAlgAAADMAAAFAAAABUQAACMzMAAjMzAAIzMwAAAAAAAAAAc2YzMgAAAAAAAQxyAAAF%2BP%2F%2F8x0AAAe6AAD9cv%2F%2F%2B53%2F%2F%2F2kAAAD2QAAwHFtbW9kAAAAAAAABhAAAKAuAAAAANDl6UUAAAAAAAAAAAAAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8Anh7VbSqsXarSVxI7UTCg0goNJloY9V5KmaoHrGZtEhaojUjVHXJM2QqVah6iqyirUI5rOO4M0rate17Vk2w6Vr2o6V1QMJmnH90UU6MfIKK6DA88iqyhqtHU6mrRdiYGgmmA0E0MpIaxqFzUjGoHNYyNooY9R05jTa5JmyQ9BVyAVVjFXbcdKmKE0aFsOla9qOlZlsOla9qOldMEc8zRjB2iinxj5BRW5hY81Q1MpqBDUitVI3sTA00tTN1NLUMpIVjUTGhmqNjWUjaKAmkFJmnLXNJGqRNEKvwDpVKIdKv246UooiSNG2HSte1HSsu2HSte1HSuiCOeaNCMfKKKkj%2B4KK3MDysGnbqhDUu6hHTYlLU0tUW6ms9NlpEjNUZamF6burGRtFEuakTrUCmpo6xki7FyGtC37Vnw9q0bekkZyNO2HSta17VlW3ata27VvE5pmlH90UUJ90UVsYWPId1JuxUe6mlqSOtIkL00vURamFqZpFEpagNUO6gNWckapFlGqzFVNDVqKsmii%2FB2rSt%2B1ZsHatK37UkjKRqW3atW3rKtu1alv2raJzTNFPuiikQ%2FKKK1MTxommFqCaiY81KOpDi1MLU0mmZqjaKJN1PU1CDT0NZs1RZjNXIe1Uo6uQms2DNCDtWnb9qzLetK37UIxkalt2rTtj0rLtq07etInPI0VPy0U1fu0VoYnjhQepqNkHqaKKmJ1Ij2D1NNKDPU0UVZrENgx1NPjQepoorORqizGoz1NXIUHqaKKzYM0YEHHJrSt1HHWiikjGZpW68CtKAUUVqjnkX0HyiiiitDE%2F%2FZ" /><h4>GitHub - woltapp/blurhash: A very compact representation of a placeholder for an image.</h4></div><div class="bookmark__right-side"><q>A very compact representation of a placeholder for an image. - GitHub - woltapp/blurhash: A very compact representation of a placeholder for an image.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/woltapp/blurhash">GitHub - woltapp/blurhash<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAAB4MgIA6AMAAHgyAgDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArd0HwnrWup5mm2EkkP%2FAD1chE%2FBjjP4ZrpPhT4Pj126k1HUk3afbNtWM9JZOuD7DjPrke9e7RosaKkaqqKMKqjAA9BUSnbRH0eVZC8XD21Z2i9rbs8GHwp8REDmxHsZj%2FhWX4k8Dar4d037bqMloIi4jUJKSzMc8AY9ATX0gK8e%2BKUtx4l8aab4b085MWN%2FoHYZJPsqAH86FK52ZlkuFwtByhdydklfqzzDTtPu9SulttPtpbmduQkSljj19h712Nt8LPE00YaSG2gP92ScZ%2F8AHc17X4Y8P2PhzTUtNPjA4BklI%2BeVvVj%2FAE7VsCrRpheGqagniJNy8tjwIfCbxGT96w%2F7%2FH%2FCuCnj8qaSPej7GK7kOVbB6g%2BlfSXxL1r%2BxPCF7LG224nH2eHnHzN1I9wu4%2FhXL%2FCLwVBbWMGu6nEJLqYCS2RxkRJ2fH949R6DHeqscWLyam8THDYa97Xk3rZHnuj%2FAA%2B8SarEs0WntBC3R7hhHn8D8344rW%2F4VJ4k%2FvWH%2Ff4%2F4V9ACnCrUEelDhzCxVpNt%2Bv%2FAAD5o1bwLfaRcLBqOoaVbzMgkCvcYJXJGensaKqeP9b%2FALf8V314rbrcN5UGDx5a8Aj68n8aKh2vofJ15YeNSUacbpPTU52nKpdgqgsxOAAMkmm12Xwp0f8AtXxbbvIubezH2h%2Fcj7o%2F76wfoDUN2VzLDUJYirGlHdux7b4R0hdD8OWOn4HmRR5kI5y55bn6k%2FhWyKbS1yp3P1WnTjSgoR2SsQalexadp9zeXBxDbxtK%2FwBAM8V5p8HLOXUtU1fxLfDMs0jRoe25jufHpj5QPxFXPjVq7QaLbaTbkma%2BkBdV5OxSOPxbb%2BRrsvCWkroXh2x08Ab4ox5hHdzyx%2FMmtlojyZ%2F7VmCj9mkr%2FwDbz2%2B5amyKWmiq%2BqX0Wm6bdXtwcQ28bSt6kAZwPeqTPVk1FNvZHlnxGkfxR8QNK8N27HyYCPOK9iw3OffCAfiTXrsKJFEkcahEQBVUDAAHQV5T8GbKXUNR1fxLfDM08jRIf9pjucj%2FAMdA%2FEV6xWqPIyqLqRni5b1Hp6LRDhXK%2FE%2FWv7E8HXkkbbbi4H2aH13N1P4LuP4Cuprwn44619t8Qw6ZE2YrFPnx3kfBP1wNv61bdkVm%2BK%2BrYWUlu9F8zzWiiisj85CvePg7o%2F8AZ3hj7ZIuJ79%2FM9xGMhR%2F6Ef%2BBV4voOmyavrNnYQ53XEgQkfwjufwGT%2BFfT9tDHbW8UEChIolCIo6BQMAflWFeVlY%2Bq4XwnPVliJbR0Xq%2FwDgfmTClFIK57x%2FrP8AYfhW9ukfbcOvkw84O9uAR9Bk%2FhWMddD7KvVjRpyqS2SucLpv%2FFYfFqW7Pz2GmcoexCHC4Pu5LfTNeviuC%2BDujf2b4XF3IuJ79vNORg7BkIP5n%2FgVd4K2b1sedlNKUaHtanxTfM%2Fnt%2BA4V5v8bNXaHR7XSLfLT30gZ1Xk7FPAx7tj%2Fvk16RXmHgzSLz4mfGqRrFBLZ6b86u5%2BREjOFJPoXJYDvVxMc6rqFBUr2c3a%2FZdX9x3nhPSV0Pw7Y6euN0MY8wju55Y%2FmTWwK9FT4WylQW1lA2OQLQkf%2Bh0v%2FCrnzj%2B21z1x9k%2F%2BzrREQzrL6cVCM9FptL%2FI8v1W%2Fi0zTLq%2BuDiK3jaVueuBnA9z0r5S1G7lv7%2B4u7lt008jSufcnJr7Y8RfB%2BPxt4ba10zxhClrJLiSaGyEwbYTlOJRghgM%2FSvmL4vfCrWvhnqFumoSRXmnXWRb3sIIViOqsp5VsYOOQR0JwcNu583n2YQxdSMKTvGPqtfmeeUUUUjwT1H4I6P5t5eavKuVhHkRE%2F3jyx%2BoGB%2FwKvYRXG%2BDL7QtE8N2NkdZ0sTKm%2BX%2FAEqP%2FWNy3fsTj6CtmXxToMSF21nTiB%2FduFY%2FkDmuCbcpNn6XlUaODwkKbkr7vVbv%2FLY2xXkvxKuW8SeMNL8NWTkpG484rzh26%2F8AfKAn8TVjxd8UbeOB7bw4GlnYY%2B1OmFT3VTyT9Rj61i%2FCF9Ph1S%2B1bWNStIZwPLj%2B0zqrMzcs%2FwAxz7Z9zWsIuK5mefmGYUcbUjgqUrpv3n0stbXPa7aGO3gjghQJFGoRFHRVAwBUgrH%2FAOEl0H%2FoN6X%2FAOBcf%2BNY2t%2FEXw%2FpkTeVdC%2BnH3Yrb5gfq33QPxP0pRTZ7VTGYelHmlNJeqLvxD11dB8L3cyvtuplMMAB53sMZH0GT%2BFdr%2Bxroo07w3q93KmLm%2BMMuSMER%2FvAo%2BnG7%2FgVfL%2Bq61c%2BNPE1qdUuIrW2aQRqGcLHbxk8nJ4zjkk9Tj2FfZv7P97pt0mtRaTd2lxFAlsm23lVxGP3gUHBOOn6V0RVtD5DMMTDMIVcQvhgko93eSu%2Fu%2FA9K8SarNo9gl1BYS3q%2BaiyiORE8mMn5pWLEDao5P8AhzXzX46%2BIF3rnie6u%2FDwfTopUFqs1tlLi5jUnbuYcgEnIUY4PJPbt%2Fjf4m1uz0q60LUEsoV1C5Jga1dmd7NME%2BYD0ZmKjjsGFcL8G9Pur3xkZ9PitJr2wtmuoI7skRs%2B9E5IyQdrtg%2BuKmTu7EZfhoUaLxFRJvp2%2FwAt%2FuOx8DfDbxCdPe%2FbxFfWfn24nhWxuRJHNvB%2BVmJIJ6Enbj5hgnFVf2qLa%2Bi%2BCFpFrMlvc3kGpwgTRKwDgLIAxDEkMVPPJ5Jr6AtreG1gSC2ijhhjG1I41Cqo9ABwK8S%2FbE%2F5JGv%2FAGEoP%2FQXrRKx4%2BJxc8S7yt9x8O0UUUzkCiiigAooooAKKKKACvp%2F9i%2BW7g0r4hS6bbrc3qQ2jQQswUSSAXG1ST0BOOa%2BYK9C%2BCvxLu%2Fhn4mkvUt%2FtmnXaCG8tg20soOVZT2ZTnGeCCRxnIBp2dz174s6rqGq%2BMC2sW6Wt7b2kEMtuj71ibbvZQ3fl6j%2BF9zpUHid08QRmTTZrWTftVyyshWVGXZ824GPjHNWda%2BJnwd1%2FVbjVdRtfE63d0Q8gUbQCFA6LJjoB0qPTPiF8GtM1K0v7OLxSlzayrNG2ScMDnkb%2BR7elZcjvc%2BjWaYb2HsrNO3Tv5a9z6r069t9RsLe9spBLbXEayxuARuUjIODyPoa8V%2FbF%2F5JGn%2FYSg%2F9Beg%2FtO%2BAv7mtf%2BAi%2FwDxdeBftAfGY%2FElrTTdJtJrPQbSTzgs5Hmzy4IDMASFABYAAnqST0A1PnHa%2Bh41RRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP%2F2Q%3D%3D" /><h4>GitHub - meilisearch/meilisearch-rails: Meilisearch integration for Ruby on Rails</h4></div><div class="bookmark__right-side"><q>Meilisearch integration for Ruby on Rails. </q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/meilisearch/meilisearch-rails">GitHub - meilisearch/meilisearch-rails<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A8Sooor0zkCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorXi8O6jL4Tn8SIkP9lQ3i2LsZPn80gEALjphhzmsfcME7hgdTngUXAWig%2FKQG4JGQDxkev0pAQWCggseijkn8KAFopMjBORgdTnpWz4X8N6l4mv7iz0lIWngtXvHE0nljykwCRxz94UN23Ax6KbGwkCFTneMqO579KcOc45wMnHOB6n0FABRV631GKOJEWxtJAP4m%2BYn3zTteiSPVZY4kVFwuFUY7elZqb5uVo7p4OCw%2Ft6dRSs0mrNWbTfW19mZ9FOeN4yBIjKT%2FeUihY3ZSyo7KOpCkitLo4%2BSV%2BW2o2iiigg%2Bjvhp4b0zxX4K1%2FS9buvIs28ZTSGMMENwVCkRA5GN2O3OAcY6jP8ADOp3Pi%2F4t3Npr2kfY7LwxYzzab4dZAEjkj2KmVHDNhsgjI%2B7t45PkL%2BLtUbw5e6KGgS1u9T%2FALWeSNGWVZ8g5Rg3yjIB6ZGOtaWofEnxFfato%2BryS2cetaWuyLUYrfbPKmMFZTna6nnjA6nGM1j7N6mnMj0n4U%2FEbxB41fxTb%2BIGtr1E0S4uY5ktkRrUkAGMMoztbPQ5P7vr1rJHjm98J%2FATwL%2FwjtxaRazI10rXBjjmlgQO7FQGBxu%2BTPHQfSsOb4yeI2jvIrWx8P2MN7FJHdJa2Gzz2cYMjHfkuATjnHJyDXE32tXN74a0rQ5o7VbPTfM8l44tsrb%2Bu9s%2FN144FNU9dUDke%2BR6do3iL426Nqc9vaXcz%2BGl1ea2iwUuLxTtAI55AYHB%2Fur6VnfCL4k%2BIvGmsa9beIDb3sY0m4uY3S3RGsj8oKKwGdrZxhsnKDng15LN411ltd0jWLaS3stQ0q3S2t5LSHYCi5HzgkhiQSDngjtXTS%2FGbxLun%2ByWmg2K3KOt0trYbPtLMCN8h3ZLDJI5xk85pOm7WBSRu2njWfwt%2Bz54M%2FsNrMazLNcxeeypJLbR75GbapztLDaMkdD9KPFHijUfhj4N8E6f4Okt7G31DS11G7u2t0kN5KwUsrFgcgZ6DnBAyAK8tutdubnwxpWgvFaLZ6bJJJDIkWJmL5zvfPzDnjgdvSuh8N%2FEvXNC0KLSBb6TqVjbsXtF1K0882jHvGdwxyeM5x9OKbh5BzHQ%2FtDXL3ereD7mS0SzebQIZWtkXasJLElAOwHTHtXC6JI001%2Fey%2FvLhI9yk9uD0%2FICn%2BNPF%2BreM76zvNekgkura3FsskUXl71BJywyRnJPTA9qx7C8lsp%2FMhwcjDK3RhUzpOVPlW56GV4yOFxUKlRvkTu%2FWzSdu8b3X4FqXUp7vTZYrmIznIIlAxsP4D%2FOa2I5Z4bmziuLqC3JAAtokJyPQntWLd6o89sbeKGK3iY7mEfc1MdbkYxu9tbtOnHmkc4%2FpWM6MmrKNt%2F67fce3hM1o0arlVrym0oLmakr2bbWjUn0tzOz1TVkinryLHq1wqABcg4HuAaKiv5jeXTzsoRmxkLyOBiiuymrQSe9j5THyVXFValL4XJtejehFRRRTICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA%2F%2FZ" /><h4>A simpler default controller implementation - Makandra</h4></div><div class="bookmark__right-side"><q>Rails has always included a scaffold script that generates a default controller implementation for you. Unfortunately that generated controller is unnecessarily verbose.
When we take over Rails projects from other teams, we often find that controllers are the unloved child, where annoying glue co...</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://makandracards.com/makandra/19041-a-simpler-default-controller-implementation">A simpler default controller implementation - Makandra<br /><small class="text-muted">makandracards.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPnyw8deJrmx1TUo9YhfU1htktrJojtXffiOWVYAoLR7GjAZmLA7uRmty%2B8a%2BIdO8fw6VJfmWyguY7C5EtgI9262ZxcDGeDJtAOQvVccbq39F1fwPoNzYNpFgttqWpR20cVtBAWliSdt0aMQSkSnDPt3AEISAcCttvH3hKezu5JNatDaxbEld9wQrIxRWBIwyMwIDDK5B5qhHjV74v8Q%2BJPCaRS3v29biw0y%2BuBHprwixujeW21Mj74cM7EeiEjCmuquPFviiy1hNM1DVFgs4tauLN9VGlGTeqwQywwlF4G5pHXcOT5YAwTmvW9ESyj0awTSo1i05beMWyIpRVi2jYAp5AxjirtK4WPG%2FhZq%2Buazf3WtfZ7e61G%2F0LSppBNK1tEWL3W%2FaQj4I%2BXjFewwGRoYzOiJKVBdUbcqtjkA4GR74H0qDStOtNJ0%2BCx023itbOBdkUMS7VRfQCrVIYUUUUAFFFFABRRRQAUUUUAeLP4G8VN4p0vUJbXQ3MdvYRyhABbJ5SuspWPaGVgHYRkZxxyvStfSPhDaadBFANTMkVvLZ%2FZz9jiV1it5xMqO45ckgAngcZ25r0SDUoZPtW9ZITbDMwkA%2BTgnqCc8DPHrTX1ixSIyPPtUNsO5GB3emMZz7U7sVkaFFZp1ywDKpnxu%2B6dp%2Bbkg446ZHXpTzq1mGjBlI8xQ6nYeQSRzxx070rDL9FUX1ayQzhpuYGCSAKxIJ9gOeh%2FI03%2B2LHjM%2BMnbyjDn06cHHOPTnpQBoUVntrNgttHOZ%2F3UgJVtjc4YKeMerAe%2BaadbsScJMXIcIdqE7ckcnjgcjmiwGlRWUNfsCm%2FwA1hHxhyhCngHqfTPI6%2B1POt2QdQXfY0XmiTyztxkjn0xtJPoBzRYDSorPGs2JIHnMMjdkxsBjAPXHoR%2BY9amsL6G%2BR3tizRqwG4qQGyobIz16%2FzoAtUUUUAU4NMsoP9VaxDhl%2B7nhiSRz2yTx70JpdiqkLaQYII5QHgnJH0zzVyigCBrK1YqWt4SV6fIOOv%2BJ%2FOkSytUVVS2hCquxQEHA9PpViigCAWVqGkIt4QZDuc7B8x55Pr1P5mgWdsJfMFvD5n97YM%2FnU9FAFf7Fa%2BSIvs8PlAbQmwYAznH5gH8KZ%2FZljnP2O2znd%2Fql6%2BvSrdFAFRNNsk%2B5Z2w4xxEOlPaxtWRVa2hKqAFBQHAHT%2BZ%2FOrFFAED2ds6lXt4WUjBBQEdh%2FQflTre3ht1K28UcSnqEUL%2FKpaKACiiigAorKvNZW3vxbLbTy4KhmRSeW%2Fu%2BuByemAeM9KNU1uDTroQSw3LuYzKpRRhgM7sEkcgAkj09SQKANWis7RtXttXjlktN%2ByN9uXXbuHZgOu09jWjQAUVnXmqx216tu0U7D5fMdUJCbztT3bJ4%2BXOO%2BBUWpa7b6fdtbzRXDOsYl3Ko27fnJOSf4QhJHXkYyTigDWorP0XVoNXt5JrZZFSOQxkSDByADn6YIpdX1EabCkrwSyozFSYwPlO0kZ%2BpAUe7CgC%2FRWZqGrpYQW0lxbXOZwflRAxQhC2G5wOhHp%2BHNWtNvYtRsYLu3JMUyh1yMGgCzRRRQAUUUUAUr3S7G9kD3drFM4AGXXPQgj8iAaratJZmUR3lgLkfLz5QfjJPT0DBfxIrWooAxbW%2FtYY55bXT5YgzLJJiIIzszYJI7nvWpZ3C3UAljDqpJGGGDwcf0qaigCvNZWs1wk81tDJOmNkjICy4ORg9uazdVntFumW7037QqBX8wRhzxkjjHY9PqfetqigDP0l7XE0dnaG2UNvYeWEDFu%2FH0%2FlVu5t4rmLy7iNZI9yttYZGQQQfwIBqWigDP1V4h5aXFn9phKuzEruC4GP1DEduM0yx1CHfHbR2dxAgIjjBi2qBtJH0HGPyrTooAKKKKACiiigD86fLT%2B6KPLT%2B6KKK84%2B0Dy0%2Fuijy0%2FuiiigA8tP7oo8tP7ooooAPLT%2B6KPLT%2B6KKKADy0%2Fuijy0%2FuiiigA8tP7oo8tP7ooooAPLT%2B6KKKKAP%2F2Q%3D%3D" /><h4>GitHub - jetruby/graphql-rails_logger: Display GraphQL queries in a more readable format</h4></div><div class="bookmark__right-side"><q>Display GraphQL queries in a more readable format. </q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/jetruby/graphql-rails_logger">GitHub - jetruby/graphql-rails_logger<br /><small class="text-muted">github.com</small></a></div></div>
</div>
<h3 id="database">Database</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><h4>r/rails - New gem "Brick" that auto-creates migration and model files from any existing database</h4></div><div class="bookmark__right-side"></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.reddit.com/r/rails/comments/woao2c/new_gem_brick_that_autocreates_migration_and/">r/rails - New gem "Brick" that auto-creates migration and model files from any existing database<br /><small class="text-muted">www.reddit.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAOVk1HUdRfw3Zywtpl%2FdAX19BHMJDBFGATHvwM5kaNDxyN9ebfD3x3rkfhHwxpdjaya%2F4j1RtQuN9%2FfNGscMNw65eQhieyqAPyFev6Xo62N293Ld3N7eSQRW7z3GzcVQsRwiqASXYnAHb0rj1%2BE%2Bk2%2BlaPa6dqmtWN1pTXBtb%2B3nRbgLO5eRGOzaykngFeMfWnoIwdM8a3Hijxx8Oru2N5p9vdpqsN7p%2FnkqJoAqlXxhX2tkg479q67xz4vvtE1rQtE0LSo9T1jVmlaNJrn7PFHHEoZ2Z9rHuAAB%2FgYLT4b6fpEehS6BPNb3uhxXS2TXP76OSS4x5kk4GGckjPDL%2BVGreB73xI9jd%2BIdZNtq%2BnSu9lfaFEbR40dQrowkaUMDj%2BXvk0DU8wHibxD5IuBPqhu%2F8AhYJtPsP2058vyc%2FZd2dvl7u33e%2BK7lfiZqdtZ%2BJYNV0C0tdb0SS3WSI6oi2rRz%2FclM7hdqgZyNpPTA54v%2F8ACp9D%2BwfZPtusbP7Y%2FtzzPtX737T5ezPmbd2P4uu7d3xxUL%2FCLSZbO7Fxq%2BuXGqXF9BqDapNOjXIlgBEWPk2bVBPG3v8ATD0Fqanwz8bf8JjBqySw2sd1pl39lkeyuvtNvMCoZXjkwuQQe47V2lct4O8GW3hbUNYu7bUNRvJNUkjmuPtkiv8AvFXaXBCjBYYyOnAwAOK6mpZQUUUUAFFFFABRRRQBmw61Zy7jG7lAqtuCE7txAAA65yQMYpV1mxdmWOYyOoyVVGJxjOenT1PY8GqzS6KbEt5UQtnYJ8sBGcAOOAM4wAc9KZJc6HGGYQQswG%2FC2%2FJ2jnt2zz6Z5xTEWf7e07ykkFxkPGJEAQksCcDGBzz6VKNXsTC0onBjVzGWCseQMnt0A5z0rPZtBvpREIYmLsAHSMrk5PG4c9uvTpUxvdGKvGRCVWQsw8k4Djv06%2Bnr2zQBYXWLPyYXld4fNVGCyIQRvztz6E4P5UxNesJIPMjmL5hM4VVJJUZzjtng8exqGe90t4I2ltg65wEaDlNpZRnI%2BXkMBnHel%2B26Qh3LHHuI8vIgI4Jxgkj2Jx6A0WAml13T4o5GeYgR53goRtwATnPA4P8AOnzavaxRSSZlcIyqwSNsjIyD06Y71Tgn0J3iEMVsWd8IBb9%2BmenHpk%2B9SSXGkRrMBDCw84QyhYh94AkZz1AxQBP%2FAGzZmSONXdpZCoCCNsjLbeRjjB6%2BlKdYsgkjGZtsYJc%2BW3ygHHPHscevaqyXWkyTPMIE3qVPmG3OWJJIxxkkbcn0xmprK302%2FthcR2UOyQv9%2BEAt8xBP44z9MUAWrS%2Bt7tnFvJvKYJ%2BUgYOeQT16Hp6VZqOGCKEYhijjGMfIoHGScfqfzqSkMKKKKAIvs0G3b5MW302DHTH8uPpUT6dZuxL2luxOCSYxzirVFAFYWFoCpFrBlW3qfLHDZzn65JoWws1VlW1twHOWAjHP1qzRQBW%2Fs%2BzxGPssGIwQg8sfLnrimDTLESM4s7fcwwf3Y55J%2FqauUUAU00yyRsrawj7pA2jA2kkYHbBYn6mpBY2o34toPnbe37sct6n35P51YooAqjT7MRsgtYAjY3L5YwcEkZ%2FEk%2FjViONI1CxqqqOgUYFOooAKKKKACiiigAorKvNZW3vxbLbTy4KhmRSeW%2Fu%2BuByemAeM9Kbq2uRaZcGOa2uXUR%2BZ5kewrjcF5ywI5YckY688UAa9FZ%2Bl6pFqTS%2BRHMERUcO6gK4ddwxz1xjIOCMjjkVoUAFFZ15qsdterbtFOw%2BXzHVCQm87U92yePlzjvgVHfa7Z2OpxWV0ZI3lKLG5X5HZ9%2B1QepPyHjHcUAatFFUNX1EabCkrwSyozFSYwPlO0kZ%2BpAUe7CgC%2FRWVqGuW2nfYxepLE1ypbG0HygNu4uc4ABZR9TxVjR9Ri1WxS6gWREYkbJBhl%2Bo7dj%2BNAF2iiigAooooApXul2N7IHu7WKZwAMuuehBH5EA1W1SW0WSSO6sftAkVFciMOWXLEZ9QD29WrWooAw7O8s7dLiWz02SAOUkk2xBGcs23JHc98961rO4W6gEsYdVJIwwweDj%2BlTUUAV5rK1muEnmtoZJ0xskZAWXByMHtzWbqlxax3bC603zwig%2BYIw5xz7ev8z71tUUAVbK9W6aRVimjKYP7xcZBzgj8qlubeK5i8u4jWSPcrbWGRkEEH8CAalooAztVaBZbdriyFyI90gcoG8sjHIz0PPt0qLTbu2iKWttYTWsZfCAQ7F5BbPH0Na1FABRRRQAUUUUAfnT5af3RR5af3RRRXnH2geWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RRRRQB%2F9k%3D" /><h4>GitHub - plentz/lol_dba: lol_dba is a small package of rake tasks that scan your application models and displays a list of columns that probably should be indexed. Also, it can generate .sql migration scripts.</h4></div><div class="bookmark__right-side"><q>lol_dba is a small package of rake tasks that scan your application models and displays a list of columns that probably should be indexed. Also, it can generate .sql migration scripts. - GitHub - plentz/lol_dba: lol_dba is a small package of rake tasks that scan your application models and displays a list of columns that probably should be indexed. Also, it can generate .sql migration scripts.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/plentz/lol_dba">GitHub - plentz/lol_dba<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPOZvibDJBpAs4dOt7u%2BszeyLquoi0ihAfZsDhG3sWDAYGMKST0B04vELeJtK8NNpYntW1ZxcyjJDwwRENKNw7FtkeR1EmRUkHgW2sYbAaPqmp6ddWcL2wuoTE7yxM%2B8o4eNkOGJIO0Ec84JB19J0C3024jnWe8uZ0tUtBJdTGVtqsWLbjyWYnLHPO1emKegtTzhfi1qq6P%2Fbs3hdE8P22pPp15ci%2BBkTE%2FlCRE2%2FMoOM5I5JA4GajvPihqd544tdA0%2B3sLNP7e%2FsuVWlM160cYLtL9nwAkTgYEm44BzgnFSeGvg%2Bv9neR4k1K9MP9qzag%2Bn2l1m0uMzGSMyKy5yBjIUgHHOetZln4E8d2ni%2B5ubG8Wyin1htQluYtUY27wtJuZDamLJYqNpzJjPTAxT0DUh8F%2FEDXdI0WC51HT5tS0mfxFPp0t9cX5aaMyXLJGEQg5ReByR6AY5rZu%2FjPFD4pnsYtPtZLCDVP7Kkxdt9sLBwjTLCEIMQbj7%2BSBnHaun%2F4Vpo%2F%2FCNrooutQFquq%2F2uHEib%2FO83zdudmNm7tjOO%2FenD4d2UeuT31nrGu2dpcXv9oz6bbXYjt5Z8gljhd%2BGIyVDBSe1LQNTn5fitdW2neJ9TufDxGmaJeT6d5iXYLXVysyxxoilRgHcCzH7vbdzW%2FwCD%2FGGpah4mvvDniXR49L1i3tY75Bb3X2iKWFmK5DbVIZWGCMfQ1N%2FwrvRH8N6%2Fodybq4sdavZr%2B48yQB0lkYNlCoG3aygr1xjnNS%2BEPA9n4c1O91NtQ1PVtVu40gkvdSmWSQRJnai7VUAZOemSeTRoGp1lFFFIYUUUUAFFFFAGdPrNjC5EkxChdxfYSo%2B6euOuGB%2BlNfW7NGcbpW2jPyxnnkjA9%2FlP17ZqzLp9nMxaW0t3YgAlowSQKUWFmFdfstvtc5YeWOTz1%2FM%2FnT0ArnWrBSA1wFy2zlGHOcEdOoJAPpnnFNk1u0WOR086QJEZvkiPIG3gZxz8y8e%2FNWDplicZs7Y4xjMQ7dKkFlah2cW8O5lCsdgyQMcH24H5CjQCq%2Bs2axXDrIz%2BRH5rgKQQvY84HPb1HPSmprdkwG93RiSu0oTz9RkHseD0IPerkdnbRq6pbwqr%2FeAQfNznmklsbWaRnltoXdsZZkBJx0oApx69YPGXMroFALB4mBXK7sHjrj%2BY9at2d9b3oc2z7wuM%2FKR1GR1FRw6VYwtM0dtGPO%2B%2BCMg%2Fh0H4VYgtoIGdoIY42fG4ooGccDNAEtFFFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorKvNZW3vxbLbTy4KhmRSeW%2Fu%2BuByemAeM9KNS12002%2BhtrzzY%2FN2hJCvyFmbaFB6ls4GAP4h60AatFFFABRWdearHbXq27RTsPl8x1QkJvO1Pdsnj5c474FQalr9tpt2Yb2OWKIBMznaUBdgqjruyW4HHJBxQBsUUCqGr6iNNhSV4JZUZipMYHynaSM%2FUgKPdhQBforL1HW7XTY7Jr0PE90wRY%2BNy8ck89BkA4zyR61BZ%2BI7S5v4bMxXMM8oOBIgGCAWxkE87RnjI5AJycUAbdFFFABRRRQBSvdLsb2QPd2sUzgAZdc9CCPyIBqvqstoJwt3YfacADPlByFOc%2FhkAf8AAhWrRQBlLrCvG8i2tyFUISGTafmbHT9av2dwt1AJYw6qSRhhg8HH9KmooArzWVrNcJPNbQyTpjZIyAsuDkYPbms3U7m1juZUutN89Nil3EYcsBuwCMdiSB%2FvH3raooAq2V4l0XVIpY9mP9Yu3IOcY%2FKpbm3iuYvLuI1kj3K21hkZBBB%2FAgGpaKAM%2FVJIkeHz7T7Qi5l3bA3llSMEZHXJHPHTNVNObT0uoUt9La2dcxxN9nCAKQWOPQZB%2FGtuigAooooAKKKKAPzp8tP7oo8tP7ooorzj7QPLT%2B6KPLT%2B6KKKADy0%2Fuijy0%2FuiiigA8tP7oo8tP7ooooAPLT%2B6KPLT%2B6KKKADy0%2Fuijy0%2FuiiigA8tP7oooooA%2F%2FZ" /><h4>GitHub - ankane/pghero: A performance dashboard for Postgres</h4></div><div class="bookmark__right-side"><q>PgHero is available as a Docker image, Linux package, and Rails engine. Select your preferred method of installation to get started.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/ankane/pghero">GitHub - ankane/pghero<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiuZfx34ZT7Bu1i2AvkWSE%2FNjaz7FLHGEBfKjdj5gR1FXfEvifRvDFvFPrt%2FDZpKxWPfks5Ay2FAJIABJOMAcmgDZornU8beG5NattJj1mzkvrlUaGNH3B96b0AYfLll%2BYDOSOQMVUtfiP4RuoJ5oNes3igtlu3bLAeUWChhkfN8xC4GTkgdTiiwHW0Vx7%2FEDRluIpDd2q6U1nPdSXckpRozFKkRQxFd2dz4PQg4GCTTB8R9Al8QaLpVtcPM%2BqJOySiNlWIxHaVcEAq2dwwRxtOccZLBc7OiuUh%2BIXhWW1e5TWrbyVkji3sGUEybvLIyOVba21hw2Dgmkn%2BIvhODTbG%2Fm1y1S0vS4hkbcM7G2uWGMoFOAxbABPOKAOsorEs%2FFWiXt5b2lrqMMtzcS3EEUa5yzwHEo6cbcjJPHI9RW3QAUUUUAFFFFAHlsnwigkexefWrm6ZLeK2u3u7dLhp0jmaVdpfPl43lf4vlA7jNbOr%2BGNc1y7sNSn1S30jWNO86O2uLKLz0MUyqJAySgc5RSCOmO4JFdUmr2bBmMhVAVUMykBiRkY9cgde%2FamDW7FgCkxcE7flRjzyAOnJJU8DmnqLQ5AfDdf7diun1u8ksPttvqc9o8UeZruGNUWQyAAgHYjFQMZHGAcVWi%2BFcEeiabp41V2Flo8mkq0lpHIrh5YpN7I2R1iAx75BBANd7HqtnIYgk4bzThMKTnkj045BH4VGNased0pXBIOUbjgnrjHajUNDhl%2BF2bLyrjXJ7iU2l1a7prZJUXz54psKkm7CKYgoUknB4YHBqW1%2BGjRf2SZ9du7g2n26OdZI8pLBdbd8KZYtGq7F2%2FMSOeua7WTWbCOZomuB5inDKEY45xzgf5605tVtEuHiZ2BRWYsUO35c7sHvjBzijUNDz7RPhNDpq2QbVfNNpc2UsTLZRRsY7YsURyOWJ3ctnHHCjmrLfDWW3v5b7SPEFzp95PLe%2BdKltHJuhuZxM0YD5AZWHDYPU5B4x2v9tWRWNo5HkR3aMMkbEbgM46d%2BMeuRir0MqTRJLEwaNwGUjuDRdhY4Xwj4SvLTx94h8R6jHFBHcfubK3jn83AO0SzN8qhWl8qElRnGzrzXe0UUhhRRRQAUUUUAZH2rR4Y4jthRZz5qjyTlmXvjHUY478cVGtxo4jeGO2iMQQuwEGF4wCOQORv6ds0LdaGBERHAoQhI91uRtLHjGR6nOff3p7XWjRXE6stusgJjlPk9Oh%2BY46dOemaYiGS%2B0SIh0gjebKyKkdv85PAU4x15yPzFJHeaLNGZ3tUjIKl%2FNt8FfQscYHBzz2qdrzSV2yzRRxEu0SmSAg5UAnjGR0HX0FNku9HUl%2FIjLghMfZ8EH%2B7yBg4GcdcCgBsc%2BhyoEjhhYMAoQWxOe%2BANvJ5yR%2BNOW60W5uCpjged3UNmHcS3bJx%2F8Aqz70k13oyW6KYY2RgTGi25O8AD7oxzwBjHXHtR9s0X5WaKJWOHGYDkFec9Oq5yfTvigBs9%2Fo0cTxTRINrSHyTBySCwYgY5zgjP4VYTXNLjVUFwke3CbNhBXjoRjjH6YPoabJNo6XMiPFD5oclv3BOWOQecck8j3PvUP23Q0cDy4VDEEP5GAzAnvjkg7s%2BnOcc0AXrfV7G5YLDOGyMg7GA6E9SMdAT9BmrNndQ3lus9s%2B%2BJs4OCOhweD7iqmnHT7qEm1gjCr1UxbcEg%2B3oxHHqauwQRW8QjgjSKMdFRQAPwpDJKKKKACiiigCvJY2km3zLWBtpyMxg4oFjah5GFtAGkOXPljLc559eapXmsrb34tltp5cFQzIpPLf3fXA5PTAPGelGqa1DpsrpLBcvsh88tGoK7d208kjkZBI9DTAtPpli8Qia0g2LnA2AYz1x6ZpI9MsY2LLaQA4C%2FcB4FR6Pq0GqrcG3WRRBKYm3rjJHcc9Oa0KQFT%2BzbHOfsdtnnnyh3608WNoGZhbQZYbSfLHIxjH5VWvNVjtr1bdop2Hy%2BY6oSE3nanu2Tx8ucd8Cq1%2F4itbPUzYNDcy3O0MqxqMNxnAJI5wCefSmBqSWlvIGDwRNu65QHPX%2FE%2FnUY06yByLS3B4OfLHbpUGkatBqglMCyL5ZHEg2llOcOB12nBwe%2BKdq%2BojTYUleCWVGYqTGB8p2kjP1ICj3YUgLMNpbwOzwwRRu3BZEAJ%2FzgVNWfd6mtpHZvPbzj7Q6x4AU%2BWzYADc%2BpA4zUul3yaja%2BfHHJHh3jZJAAysrFSDgnuKALdFFFABRRRQBSvdLsb2QPd2sUzgAZdc9CCPyIBqrq72ZmCXuni5xtIPlByASefwIH5iteigDEs761gime00%2BWFCVkcCIIWLNjOPXvWrZ3C3UAljDqpJGGGDwcf0qaigCvNZWs1wk81tDJOmNkjICy4ORg9uaydWawW8l%2B2aUtx%2B7AeTyg5K9cYx6gf5Fb1FAGfpbWrSXH2W0NuzMHkJiCbyc88denerdzbxXMXl3EayR7lbawyMggg%2FgQDUtFAGbq32cS27XNityI90gcoGMeMdMjvn26e1R6bd20RjtLawmtYt21FEOxeQWzx9D%2BNa1FABRRRQAUUUUAfnT5af3RR5af3RRRXnH2geWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RR5af3RRRQAeWn90UeWn90UUUAHlp%2FdFHlp%2FdFFFAB5af3RRRRQB%2F%2F2Q%3D%3D" /><h4>GitHub - djezzzl/database_consistency: The tool to avoid various issues due to inconsistencies and inefficiencies between a database schema and application models.</h4></div><div class="bookmark__right-side"><q>The tool to avoid various issues due to inconsistencies and inefficiencies between a database schema and application models. - GitHub - djezzzl/database_consistency: The tool to avoid various issues due to inconsistencies and inefficiencies between a database schema and application models.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/djezzzl/database_consistency">GitHub - djezzzl/database_consistency<br /><small class="text-muted">github.com</small></a></div></div>
</div>Stefan WienertDev-Links #20 - Development process links & Software tools2023-04-14T22:43:28+02:002023-04-14T22:43:28+02:00repo://posts.collection/_posts/2023/2023-04-14-developer-links-no-20.md<p><em>In this new (revived) monthly section, I want to share links that I found interesting in the last couple of months. This is a good way, to clean my bookmark list and maybe there are some interesting bits here and there for you as well.</em></p>
<h3 id="general-software-development-links">General software development links</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApaK9f8AAPg2PTYY9Q1OMPqDDciMOIR24%2FvfyrGvXjRjdnfl2XVcfV5IaJbvscl4f%2BH%2Bp6kizXpFjA3I8xcyH%2FgPb8SPpXZ2Xw60SBR54uLk9%2FMk2j%2Fx3Fdn0qpfalZaeoN9dQW4PTzZAufpnrXkTxdao9Hb0PuKGSYHCxvOKfnL%2BrGDJ4C8OspC2LIfVZ5M%2FqawtW%2BGUDIW0q9kjfslwNyk%2FwC8Bkfka66HxRokz7E1S03H%2B9IF%2FnWurBlBBBBGQR3qVXr03q38zWWW5fiotRhF%2FwCGy%2FI%2BeNa0e%2B0a58jUIGiY%2Fdbqrj1B6Gs6vYPibr1jbadJpjxR3V5KM7G5EPox9G9P146%2BP17GGqyqw5pKx8LmmEpYOu6VKfMvy8mFFFFbnmhRRRQAUUUUAejfBTwdJ4n1y5uiUEGnIJBvHyvKT8in24Y59QPWvWLm3mtJ3huY2jlXqrf56e9T%2Fs56ctp8PVucfNe3MkpbvhcIB%2F46fzruvFsNkdDvLvUEJSzgkn8xeGQKpY4P4dK%2BAxueSWYToyV4J8q7q2j9dT7TJK6wdBKS0er%2FAK9D5%2F8AiB4xbSGOn6YV%2B3EZkkIz5QPTj%2B8evt%2BNeSXE8tzM81xI8srnLO7FifqTTry5lvLua5uG3SyuXY%2B5Oahr7ihQjRjZbnzmZZjUx1Vyk%2Fd6Lt%2FwQrb0HxPqmhpJHZT5hcEeXINyqT%2FEB2P8%2B%2Ba6Twv8O%2F7d0K21H%2B1PI87d%2B7%2Bz78bWK9dw9PStX%2FhUn%2FUb%2FwDJT%2F7OvWWT4mtBS5Lp67r%2FADPIhmkMNUvCfLJdrnl880lxM807tJK5LM7HJJPc1HXqn%2FCpP%2Bo3%2FwCSn%2F2dH%2FCpP%2Bo3%2FwCSn%2F2daf2NjP5PxX%2BZi8woN3cvwf8AkeV0VLcxNBcSwv8AejYofqDioq81q2jOwKKKKQBRRRQB9bfASVZPhdpCKeYmnRvY%2Bc5%2FkRXTeObeS78F69bwAtLLYToijuxjbAryX9mfX4l0vV9GuJVRoHF6hY%2FwEBX%2FAABC%2FwDfVeh654he53QWBaODoZOjP9PQfrX5jicrxE81qKC0Uua721dz2K%2BbYfB4OMqr1askt30%2Fpnx1RXTePfDsmga1IEQ%2FYZyXgYDgDuv1H8sVzNfpkZKSujxKVSNWCnHZnvvwvOPA2mf9tf8A0a9dVu%2BtfMEV7dRRhIrmZEHRVkIA%2FCn%2FANo3v%2FP3cf8Af1v8a%2BmoZ9GlSjT5Nklv2%2BR5dXLHObnzbvsfToOaQ1y3w40y507w5G1%2B0purlvOZZGJKAgBV59hn6mt3Wb5NN0u7vJMbYImkwe5A4H4mvoqdXmpKpNW0v6HkzhafJF3PnLXGD61fsv3WuJCPpuNUaViWYliSTySaSvzuT5pNn1iVlYKKKKkYUUUUAaXh7VptE1e3vrfkxn5kJ4dT1U%2FUf0NfQ%2Bk6jbarp8N5ZSB4JRkHuPUH0Ir5mroPCPim98N3RaD97aucy27HAb3B7H3rnr0faK63PNzDA%2FWFzQ%2BJfie86rptpqtk9rfwrNA%2FVT2PqD2PvXmOsfCy4WVm0i9jeLqI7nKsPbcAQfyFd74d8U6Xrsa%2FYrhRORzbyHbIPw7%2FAFGa3ciuKM50nY8KniK%2BEk4rTyZ4lD8M9dkfDtZxj%2B80pP8AIGuz8K%2FDyx0idLq%2Fk%2B23SHcgK4jQ%2BuO59z%2BVd1ketMmlSGNpJXVI1GWZjgAfWtFi6sZKUXZo0q5liKq5b29CUEV5d8YPES%2BUuh2r5ckSXJHYDlU%2Fr%2BAqz4w%2BI1vaxva6Cyz3J4NxjMcf%2B7%2FeP6fXpXkcsjzSvJK7PI7FmZjksT1JPrX1NTPamJwvs5RtJ7vpby9T0MvwcrqrVVrbDKKKK8c9sKKKKACiiigAooooAUEggg4IrbsfFmvWShbfVLnaOgkbzAPwbNYdFJxT3InCM1aSudPJ488SyLtbU2A%2F2YYwfzC1i6hql%2FqLA395cXGDkCWQsB9B0FUqKShFbImFGnDWMUvkFFFFUahRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH%2F2Q%3D%3D" /><h4>google-github-actions/release-please-action</h4></div><div class="bookmark__right-side"><q>automated releases based on conventional commits. </q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/google-github-actions/release-please-action">google-github-actions/release-please-action<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Working Hours</h4></div><div class="bookmark__right-side"><q>How much time do people across the world spend working? How have working hours changed over time, and what do these changes matter for people’s lives? Explore data and research on working hours.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://ourworldindata.org/working-hours">Working Hours<br /><small class="text-muted">ourworldindata.org</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BjT4U0ghf3Nx8owD9rmyBxxnf04FJcaFpc88glt3LySsWIuJAW3KuTwenAGOg7Vu1kmSWTUt0AjMSsR82QWOFzg%2Bg6dOTUTnylRjcrxeE9MSPyz9rdCpVg11J83zBgfvcEFRgjFbFlaxWVslvbhhEnChnZz1z1Ykmo5rxYoXaVTEyqSBJwDgevT9asqdyg%2BozTU1J2QOLWrFoooqiSlrCahJZgaRNbw3QljO6dC6FA43jA5yU3Ae%2BKZBcX4mk%2B028KQhgEZZMk5kIGR%2Fu7T9Sa0Kz2t545XeS7aWNmTbGUA2%2FvSc5HsQv%2FAR3zQBoU2R9i5xnkD8zinVV1KdLe18yTON6KAoySS4AA%2BpIpNqKuxpNuyJLy2ivLZ4LgFonGCAxU%2BvUc1jnw1pPnLH5M%2Bdpbi7l%2BUcDA%2BbgHHTpxSRazNC5guIHkuZ5pRaopGHCk9%2BwGOvp26ZR9GnnkjnlvJYNTkjXzZYWJQBWU7FU8Y6jOM85pXk1tZ%2Bf9MV101JF8K6Sv3I7penS9nHQAD%2BP0Aoq7a6b5Al3Xl3KZJGky8n3c9hgDiiqS01E32RHLqVvcEw20pkILLIYVLlMEgjjocgj9ajFzMl2irYTC2DffBXKkKMDaDnGMn8OlXdOtVtLcxIu0GR2x65Ymj%2FAJbH%2Frt%2F7JShb4mtxyT2uDSw3kE0UbqWKFSjDBGRjlTyKURyWyjyRviHWPuP93%2FD%2BVOvbOC9geK4jDKylc9CARg4PUH3FRKJ7NQBuuLcDHrIo%2F8AZv5%2FWiVOMndbiU5R0ew9L2FmcF1AUgcnk8Zxjrn2plzcOyJ5UMhBkQFm%2BQY3DPXn9KZFcWaSzTieDMpXOMbsgdCOufanS3MsgQW1m8gMiBmk%2BQBdwycHnIHPTtUKnVlFqTtuW6lNO61LtYlu2lSXUz2MiNclkEgDnp5zdjx9%2Ff8A5xW3WVFdPNJIjWE9uFdf3jhQH%2FekcYPtu%2F4FWhJPIl2jee824Rs7eVGuA6dgf9oCql%2FcP9ka9f5YiIxbRsp3CRmABYeuWUAdufw0lvLVphCtzCZSWUIHBYleox6jvVa9kWa9igDAmHbM6g8jLYTI9D8x%2FwCA1EaFpXd7b%2F1%2FW45Vbxst9i5BCsMMca8iNQoz7DFI3%2FH1H%2FuN%2FNalqJv%2BPqP%2FAHG%2FmtXuJKxLRRRQBnaXevqEcrItxD5chQie2aIn3AbqPeqj6gU1r7C0V7vLhhKLNzESV%2FvjgYGevetyjIz1HXFAFDU7ttPsnuZDJIi4yIoDIwycZ2g5wOp9gaks5nurWOdGdFcZCyQlGH1U8irdFAGBpWoQ3Op3CR2t1bXUhO95rFo%2FMCfLnf0PtzV3VL86ekZk8%2BQuSAILVpTwM8henp9TWlRQ3cErbDYiTGpJJJGeRj9Kivm2WkkgWRzGPM2xruZtvOAO5OMVBrcuoRac7aPBBcXm9AqTyFE2lwGJI9FycdyMVezgc8UAY1hJFqiXCG2li8tyG8%2B0aIlj1Kk9f94HqMjtSaiyaNYo0cNxKGdEP2e3aeQ453NzuPTqc8mtqgkDqafM7WFyq97FW0le6to50ZkWRQwWSEowB9VPIPsapXuoG11S1t5FuWeVSFaO1Z0ySBgsOBjGee3Na9GRnHekMj2y%2FwDPRf8Avj%2F69FSUUAFVcfvz%2FwBdv%2FZKi037XHG0V4ySTeZIysqlQULnb644IGM9KaZpBqaxGJth3SFxgjICjHXPc9qpx1sSpXV2aNFRvNGiM7NgKCxz1AHtUgOQCOhqbFXCijIpk8yQIGkYKCyoPqxAH6kUWuF7D6zVuLuV3S4sjDErrscyBt370joOnygN%2BOK0qz2v4J5Xt08wSRshbdGQP9YV6%2FVT%2BGDQBoVFc%2F6sf7y%2F%2BhCohf25nihRy7SM6AopZQy%2FeBI4B%2BtRX9ySXt7QxSXaNC7xu2NqNJjJ%2FBWx7iq5WTzouyOERmOSAM8DJrJ865MsV%2FFHK6zwRhbRgFaPLjcTnvhuR%2Fs0yGKdJg0j3JkM8zwJvZ43BB27yF%2BUDsPyJqyLW5MsTvdFLpogHKDMYw4JCqemQSM9cY9BV2UTPmc9i3aPO%2FnfaY1jxIwTa2dydifQ%2B1FEUEi799zLJliwyFG0E8LwOg%2FOiodrmivYkmjEiYzhhyrYztPrVWKTfMwIAkWbDLnOPk4%2FPrU4uoj0J%2F75P%2BFUZRBJeCVg4lDMiuAwIUqM9vUCkuzG11RfuoI7q2lgmUNHKhRgRnIIwf50qQoiqqDaAAAAccCq0tw8aSNEwlIDMqOpXJxwNwHAz3wetO%2B1Nj7g79z6cfw%2BtPW24tL7BBaNHdXUrSuyzFSFz93C4%2F8Ar1LLbRSqqugIDq4yM8qQR%2BoqBbyQyyK0SqqkbTuJ3Dbnpt454%2FX2pJbqbapTyl%2BdN24Oflz82OBz6U7u%2B4tLbF6qss8Mq7Y5Y3YOmQrAkfPj%2BYI%2FCrKMHUMvQ%2B2KpNY2ttult7aNJHdSzInJ%2BfcenuSagssi3iEUkaIEWQsW28ZJ6njv71UvImttOjhtBvkzFEDI%2BWI3AFiTnJAyeeuKat5chiTHC6B3%2B6zBto%2B71XGSeDyAKabiSRxJPGIowsZReWYMSN27C4GOBwTnmr1W7M9HsjTRQihVAVQMAAYAFRt%2Fx9R%2F7jfzWk%2B0x%2Brf98n%2FAAqJrmP7THy33G%2Fhb1X2qDQt0VD9pj9W%2FwC%2BT%2FhRQBDplibCKRDd3VzvcvuuJN5XPYcDA9qhbSc6v9vF%2FqA5BNsJv3JwMfdxx68HrUJ1PUQI2Gh3RVkDN%2B%2Fiyp9MbvT%2BdLLqGpLnZos7%2FKD%2FAMfEQ5I5HXseKALup2ZvrNoBc3FsSQRJA%2B1wQcjnHt079KktIPs1tHD5ss2wY8yVtzN7k1JEzNEjOhRiASpIJU%2BnFOoAytO0c2N40y6lqM6Nu%2Fc3E29ASe2RnjoOasanYG%2FSNReXdqFJJNs4UtkY5JB%2Fz%2BFXaQkg4C5HrmgAUbVAyTgYyepplzCLi2lhZnRZEKFkYqwyMZBHQ%2B9Zn9oanvlX%2BxZflLBG%2B0R7XA6HrkZ%2BlOS%2F1Fmizo8qq2d%2B64jynOOgJBOOetAFjTbD7AJh9ru7gSPv%2FwBIk37PZeOBRq2n%2FwBowJF9rvLUo%2B8Pay%2BWx4IwT3HPT2FVZtR1NAvl6JPISTkC4iGBk46n2B%2FGlj1HUWmCtotyiHGXM8Rxzzxu7daANG1h%2Bz20UJlklKKF8yVss3uT61Uu9NNxqEF0L29hEYAMMUuI5MHPzDH8sccVAupakY3Y6HdKwxhTPDzzz%2FF2601tS1QIxXQrgsCAB9oiGRjr97oDQBs0VnQ3l9IpL6ZJEc4w8yZ%2BvBNFAHM2%2BpancQWLnUZkMtvHI%2B2OLkt16of8irFvd6g8B3ajOWPmLu8uLIwUAI%2BTqMmiigAS51D7O3%2FEzuSyymLd5cWSNq8n5OvX86bfXuoxzT%2BXqU6qJcBRHFgDCnH3Pc0UUAdjUUgYycSMo%2BXgAevPbv0ooqo7kz2MQR3ktxOv9qXaJ821VWL5cMOhKZ%2FPPU1NDBctFZyvqd4zBctxGA%2FzDqAnoccYooqSitcQ3uyPZrF8hCqSQsPJJ5zmOnwR3v2hd2rXjKSvylIcdvSP3oooAIYb0w4bWL0sWT5vLgz1bP8Ayzxzx%2BVNMF6yY%2Ftm%2BBL9QkPTb0%2F1ft9aKKAHmG5KoX1O8ZsHn92vc%2BigUUUUAf%2FZ" /><h4>The effects of remote work on collaboration among information workers - Nature Human Behaviour</h4></div><div class="bookmark__right-side"><q>The coronavirus disease 2019 (COVID-19) pandemic caused a rapid shift to full-time remote work for many information workers. Viewing this shift as a natural experiment in which some workers were already working remotely before the pandemic enables us to separate the effects of firm-wide remote work from other pandemic-related confounding factors. Here, we use rich data on the emails, calendars, instant messages, video/audio calls and workweek hours of 61,182 US Microsoft employees over the first six months of 2020 to estimate the causal effects of firm-wide remote work on collaboration and communication. Our results show that firm-wide remote work caused the collaboration network of workers to become more static and siloed, with fewer bridges between disparate parts. Furthermore, there was a decrease in synchronous communication and an increase in asynchronous communication. Together, these effects may make it harder for employees to acquire and share new information across the network. Using a large dataset of workers’ technology use from before and after the COVID-19 pandemic, Yang et al. find that firm-wide remote work caused the collaboration networks of information workers to become more static and siloed and communication to shift to more asynchronous media.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.nature.com/articles/s41562-021-01196-4">The effects of remote work on collaboration among information workers - Nature Human Behaviour<br /><small class="text-muted">www.nature.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QCkRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAWQAAAHAAAABDAyMTCgAAAHAAAABDAxMDCgAQADAAAAAf%2F%2FAACgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGQAAAAA%2F%2BEBYmh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgr%2F2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj%2F2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj%2FwAARCABkAGQDASIAAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL%2F8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4%2BTl5ufo6erx8vP09fb3%2BPn6%2F8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL%2F8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3%2BPn6%2F9oADAMBAAIRAxEAPwDhW0q9%2BzTXCQPJbw48yRBkJnpn06VSr2%2FwHbrF4cicDmd3dvfnaP0FUNd8AaZqDtLZM2nztyRGu6Mn%2Fd7fgfwr6N5pThWlTmrJO1zyIcNV6uEp4ii7ykk2tt9Vb5dzx%2Biu4l%2BGurByIrqwdexLup%2FLbW%2F4R%2BFsE%2BpRrrt6ZIsFjBa5UMRzguecfQA%2B9azzHDwjzc1zijkOPk7Om15uwnwF8Oy3Gsza%2FOhW1tEaGBiPvysMNj2VSc%2B7Cvd6gsrW3sbSG1soY4LaFdkcUYwqj0AqevkMbini6rqPRdPQ%2BswGEWDoqmtX19QooorkO0Kx%2FFWhweIdEnsJ9qsw3QyEf6uQfdb%2Bh9ia16KqnOVOSnF2aM6tONWDhNXTPli5gltriWC4QxzROY5EPVWBwR%2BdR13vxk0oWXiWO%2BjXEd%2FFvb%2FromFb8xtP4muCr9GwtdYijGquq%2F4f8T8rxmGeFryovo%2F%2BG%2FAKKKK6DlPVfBbBvDNiR2DD8natyuV%2BHdx5miywk%2FNDMePZgCP1zXU5r4fGx5MRNPu%2Fx1P2vJqqq4CjJfypfcrP8gqa0nNtdRTDnYwJHqO%2F6VDRXLuek1dWZ3asGUMhDKRkH1FLXOaHqiwgW1y2Is%2FI5%2Fh9j7V0VccouLseRVpunKzCiiipMwpaSloA4D402Yn8LQXQHz21ypz6K4Kn9dteJV9B%2FE5FfwJqqsQDsRlyepDqePyr58PWvtOH5uWFafRv9GfAcTU%2BXFqS6pfqgooor3D5w9QTTbDSbGG48MvdXOn3QhQ6st3HLFIx%2B8jR43RSZOF4x688Hd1qwuNKtdfu5Lh3i02SLyFW5jcyBpcESADI%2BUgDOPx61x2p3%2FiCOLXbS7j0S2ttFnt59TbT7YRPdMHAjPTD4IBwQnQD2rq9R02%2Ft5NX%2B3y6c%2F2h431SO2aN3C%2BZvUsvDIvzYz8xxz718XiIy5uabu38%2FwCtD9Oy6v7ipUnypdNlv29U%2FwAe5cntYodSvdOFxeNf2kLSGZmTyJJERZGj8vG5V2uAGzn3PeppUBvL%2FQYHvLsRajZR3cmHUOCY52IU7eBlE49qdJNqE1rcLcX%2BnRWqvHYS3N5LHbTz5UMsJlIJYEEDsTz7moXvNSsoprWJI41tbhNNyyR%2BfA05%2FwBXHJg4j5HPUAjAOOOeyO91Ksbxc9Vpu%2FS%2F3lbT2mm03RJJLqdpNQtoJZTlcqWuAjbOOPlJ9a6C31JrFr0WE13JDY3ws5oLx0kDKzsivGygFTuU5U9u1c9dRXwslsQtkE0cvOp%2BzI0kK29yjbUkPLAsBxhcrnODV9ptTv7%2BzgkW2kF3fTrEsSpbI88akvJIAGJOM4OTz2zg0SipLYfPU5o%2B0lovPvrt6HLeOfH3ibTfGUcS3tr4f8PmOL7Pd3WmtdQXEhI3rJIvMZHOAMdBnGc1HceN%2FE998UtY0LT9chs7G3v4re3Q6MbgFGUE75VHyd%2BW9c9qk1zwhpmt6lJdatbaqwlu1sJ7KHUmVJ54kDLG8IGCOcAhhnrxnNS3nhHS38X3d1NqF5Fqt5P513baZrq7UdAPlliVPlGMDknrjvWEqejsunkYTpynUapvd6anPXPxZ8R2vjLUIIdT0q8gj8QNpsGjGzxcS25kwHV1HYcZPcdDXQP8SdbPxalsoDbnwkb9tGjLRLuN2sIbO7r9%2FjGcc1qaPpdroKX2rWa6fbPql1Pfs13qEazudxVljBjBC5HChj97rWFafDDQvLstRi09%2FwC0JGXWI5V1jN%2By7vMz5ZUKQD1AXPBG7NV7Nfy%2Fl%2FwP1I5ZQt719fy%2FzOL1nx54g1XUdRs5dYsLuZtXbTItHFmftDw78B0ZRgY6c85BrJurm4h8TG3QRSaTb3MNndzgDIlm8zyyD6fID%2F8Arr1STwLYX9qk2kwqs9zqc2pWk0uqLbTXE7ACRIDsJMeBjaePfHNcTe%2BB7Gfw9qGvXGg%2FuEvmgu5Tfy%2FaoJFKjCqBtRQ2F5DnJ9OR6eEqVY03Gk7Xa6rz81vp%2Bp42aUYSrp1lzWT87a%2Fdpr95574y8R6joGsfZYpbWaN4xKP9F2lMk%2FIcnkjGM96K9B8d%2BA7VNXim8TaVIb25gE6pBqZTy0LNhGBiPzghs4OKK3lXrXfI21%2Fi%2FwCCc1KhhlBKrTXN10Op8V%2BJtAu9M8TyaUmqf2j4gELTRXKIsdssbBmwQfmzgj057V2Gv%2BJLS9l1cx2MVs91NCPMURLPNEoXfHOS%2FwAvI4I7Lggd49Gn1bTfiDc3mvw61NDBoNzJDFqctpJM6q8bOo8j5MEjAzz%2BFXNWS30tPDk3h%2B8nWCK3lmt5N4LBJbiMlGyDwAxXB5G3rkVx1pRaSj%2Bd%2B3ptY9bAwanKUvlpba7fe92VYtdtILe8theTRtLfRXKz20NtOrKsaqVIlPBJU84yOx5qhe6vayXOoNChCXWr22ooomibaiNl1Yl%2Fvk5IHI%2BYAHjja1KWS51nxVNdTvKw0zUrZA5GEjRkwqgAccn1NU9burt%2FBz6bJe3D2qyXcBQsuWjjhVkQnGcA%2Fj6mudHpSipzcmtW11769iCbVbJ9S1Of%2FiYf2VqFvcwmTyoN8U0siPhf3nzDAY8%2Bg9ai0rX4LbUNIuLhJXSx1G8uXIMIZ45VZY8L5nXpkdua66SO4t%2FiHaSzQyLFeSO0EyshDlbIAgc5ByD1GKxtJub%2FAE3xLdXeuQ6xPLBpFzNHDqktq8skS7Cygwfu8FwRzz68U0YylB9W9O67W7dCO88RzyQ%2BHxqUcaavp1wLyeR2jijuMRsg53ZDEHHTAIPYCqsV%2Fo0UMNrYvIFTUJb0yXYgRokdXzEGQ5f53Jyc8d%2BBV3ULrST4XurPQ47kQQ6lp8rTXBAZy8ykIM84RVCc9NuOSCau%2BJV1IeM9Pe8%2Ftr%2BzDqsIh%2B1TWrW3mb12%2BUsf70Db5v8ArP8ACl5FRnCE1KMWrO%2Br7a9jCOowT2On2Mv2GBLZXc3E8cbu2Zy48qTflRgHJx%2BoqaHxFCbOGKC0hS7t9KW0S8VYmuI5Bu3bcvgxY4zwQWJ6Zxr6uun3theXunvPBNca1EtxHuAMU0LModcdN21XB6HOe5qlrV%2FeXqeHpbi4a7kjtLG6jt5XRY57h3cHecADcBjPQdcdqC1y1Ir3e%2FXyu%2Bn3fic9PrHh60Ph5tTGoefouJLeGxMcqTIr741Yk5RlPBPQ4PJzxT0L4iy6RaO8VqZLq51i5v7u2YAQvFKhIUPycq%2B09Odp9al%2BMEV7v0i61C7vlec3DLpl80LyWmWXcVeL70ZwANxJGB6kDzuvfwWCpV6ClO7%2FAOHZ8ZmmZ1qGKkqaSX%2BaR0ni7xOdfbSLicXU17Fp8cN3IYVUNMGdnKjd93LcUVzeKK7FltJKyb%2Fr5HnSzetJ3aX4%2FwCZ7PJoNjYsbU6bZIIyMKIExx0I4%2FWnCztQ0zC2gzPxKfKX95%2Fvcc%2FjXdX1lDexhJhyPuuOq%2F59K5y90q5tcsF82L%2B%2Bg6fUdRXxUa3Nu9T9eoVacklZJmO1hZtFFE1pbGOI5jQwrhD6gY4p%2FwBlt%2FtDz%2BRD57ja0nljcw9CcZIqUHNLWlzq5V2KH9kaZ%2F0DrH%2FwHT%2FCnDStPVdq6fZBchsC3Tr69Ku0UXYuSPYguLS2uJRJcW8E0gXaHkjVjj0yR05NQrpOnLnbp9kMjBxbpyPTpVyii7Bxi%2BhAlnapLFIltbrJEuyN1iUFF9AccDk9PWiOztoklSO2gRJeZFWJQH%2F3hjn8anoouPlXY82%2BIFlDa6rbtbQRQxyQAERoFBIY%2Bn1FczXonxEsjPpUN0oy1s%2BG%2FwB1uP5gfnXnVfYZXUVTDR8tD8i4nw7oZjU7Ss181%2FncKKWivRPnz6ro%2FnSUtfl5%2BxFa5sbW5OZoUZj%2FABDg%2FmKz5dAt25imlT2OGFbFLVKclsy41Zx2Zz58PPn5bpMe8Z%2FxpU8Pc%2FvLrj%2FZj%2FxNb9FV7WXc0%2Bs1e5lx6HZIPmEsh%2F2nx%2FKnto1iR%2FqWHuJGrRoqeeXcj21T%2BZmFdaAME2sxB%2FuydPzFYk8MlvKY50KOOx%2FmPWu4qvfWkV5B5cowR91x1U%2BtaQqtbm9LFSi7T1Rw9xDHcQSQzLuikUow9Qa8i1vTJdJ1CS2lyVHMb%2F317H%2FH3r2W4he3neGUYdTg%2B%2FvWXrek2%2Br2ZguRhhzHIPvIfb29R3r2cux31WfvfC9%2F8zz%2BIMmWaUVKn%2FEjt5%2BX%2BR4%2FRWzfeGdVtbloltJJ1HKyQruVh%2FT6UV9XHE0ZK6mvvPy%2BeXYuEnGVKV15M%2BkqDRRX5qfqoCloooAKKKKACkoooAWgUUUAYPiiJQLeUD5yShPqOtYVFFddL4Uerhv4SENFFFaG5%2F%2FZ" /><h4>You should separate your billing from entitlements - Arnon Shimoni</h4></div><div class="bookmark__right-side"><q>Building your own entitlement service is key for supporting a modern, flexible SaaS product. Whenever I read about billing systems, there’s a lot of talk about the billing aspects but not so much around entitlements. In the spirit of sharing, and since I haven’t found any good articles about it, I decided to tell you […]</q><div class="bookmark__comment"><p>Some interesting thoughts which about building your Ability vs. Billing layer of your app.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://arnon.dk/why-you-should-separate-your-billing-from-entitlement/">You should separate your billing from entitlements - Arnon Shimoni<br /><small class="text-muted">arnon.dk</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABJGQEA6AMAAEkZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopQMnA60AJRWrZ6XkB7nI%2F2B%2FWtOKCOMfu41X6CgDl6K6wrkYIBFVbiwgmH3Njeq8UAc7RVi7tZLZ8Pyp6MOhqvQAUUUUAFFFFABRRRQAVr6PajHnuMn%2BAf1rJAyQB1NdTEgjRUXooxQA8CloooAKKKKAIp4lmjZJBlTXNXETQTNG3VT19a6k1j65GA8Ug7gqaAMqiiigAooooAKKKKAHRnEik9AQa6sVyVdJp84ntkbPzAYb60AWqKKKACiiigArJ10jyoh3JJrVNYGrzCW62qflQY%2FHvQBRooooAKKKKACiiigAqzZXTWsu4cofvD1qtRQB1MEyTRh42DLUma5aGaSFt0TlT7Vfj1aQDEkat9DigDaozWQdX44g5%2FwB7%2FwCtVWfUJ5gRuCL6Lx%2BtAF%2FUb8RKY4TmQ8Ej%2BH%2F69YlFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB%2F9k%3D" /><h4>Johnny-Decimal ordering system of stuff/documents</h4></div><div class="bookmark__right-side"><q>A system to organise projects.</q><div class="bookmark__comment"><p>Simple “system” to make 2 layers of categories for all stuff to easily retrieve it later</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://johnnydecimal.com/">Johnny-Decimal ordering system of stuff/documents<br /><small class="text-muted">johnnydecimal.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>linguist/overrides.md at master · github/linguist</h4></div><div class="bookmark__right-side"><q>Language Savant. If your repository's language is being reported incorrectly, send us a pull request! - linguist/overrides.md at master · github/linguist</q><div class="bookmark__comment"><p>Never knew about the .gitattributes, in which you can set file-types for a repo (like “Gemfile” = ruby), or you can tell Github/lab to not show diffs of specific “generated” files in a PR</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/github/linguist/blob/master/docs/overrides.md">linguist/overrides.md at master · github/linguist<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKK1dE0C%2F1l%2F8ARIsRA4aZ%2BEH49%2FoKaTk7IaTeiMqun8P%2BD77U9styDaWp53OPmYey%2FwBT%2BtdtoPhPT9I2yuPtN0OfNkHCn%2FZXt9eTXrfgr4Z614lEdxMh07TW58%2Bdfmcf7CdT9Tgema6o0FFc1RnRGioq8zzfQPD9rp5jt9LtWkuZDsBC75ZCe3AyfoPyr2nwX8Hby%2BCXXieRrK3PItYiDK3%2B83IX6cn6V6x4R8F6L4Vhxpltm5Iw91N80r%2Fj2HsMCujpTxGnLT0QpV%2BkNDzTW%2Fg54du7MppX2jTroD5ZBK0qk%2F7SuTkfQivFfGPgvWPDDsmr2gezc7VuYxvhfPYnHB9mx%2BNfWtMnhiuIXhuI0lhcFXR1DKwPUEHqKiGIlHfUmFaUd9T8%2B9f8D212Wm0thbTHnyz%2FAKtvp3X%2BXtXnuo6fd6bcGG%2BgeF%2B2eje4PQ%2FhX3b41%2BDtpeeZd%2BF5Fsrg8m0kJMLH%2FZPVP1H0rwzxN4dns5pNM8Rac0UnXy5l4PbcrDg%2F7ymtXTp1tYaM0cIVNY6M%2BeqK7nX%2FAALLFum0djKnUwOfmH0PQ%2Fjz9a4mWKSGVo5kaORThlYYIPuK5p05QdpHPKDjuMoooqCTufBHhWK8gXUNTTfEx%2FdQngNj%2BJvb2%2FpXsXhHwfq3iSVYNFsgLdPkadxshiHpnH6DJ9qx%2FDenJcXWk6YGKRyyQ2u4dVDMq5%2FWvsnT7K206yhs7GFILaFQkcaDAUCu6UlQilFas65SVFJLc4bwT8LdH8PmO5vgNT1JcESTL%2B7jP%2BwnT8Tk8cYr0GiiuOUnJ3ZzSk5O7CuA1X4gPb6hPBaWKPFE5j3vIQWIOCcAcCu%2FrwTUv%2BQlef8AXZ%2F%2FAEI1dKKle5VOKb1Ox%2F4WNd%2F9A%2BD%2FAL%2BH%2FCuw8Ka6uv6e8%2Fk%2BTLG%2Flum7cM4ByD6c14rXpfwo%2FwCQbf8A%2FXYf%2BgirqQio3RdSCSujuaz9c0bTtdsWtNXs4rq3PO1xyp9VI5U%2B4INaFFc6dtUYJ2PAvGnwevrDzLrwzI19bDk2shAmQf7J6P8ATg%2FWvFfEPh611QSQahbtFdR5TeV2yRkdiD%2FI19z14x%2B0To9qlppmsxxql2032WRlGDIpQsufXG0%2FnXZSrc75J6nTTq83uyPh%2FV9Pm0vUJrS4A3xngjow7EUV6l4h0K21O9SadcssYQfTJP8AWiolhpX0JlQd9Ds%2FB%2F8AyNGgf9f9t%2F6NWvsKvj3wf%2FyNGgf9f9t%2F6NWvsKqxe6KxG6Ciiue1Lxho9hdvbSzu8sZ2uI0LBT6Z6ZrlSb2OdJvY6GvIdb8KavFqV28Vo00DSPIsiMuCpJPrkGu0%2FwCE80X%2B9cf9%2BjUc%2FjrRpIJEVrjLKQP3R9K0hzx2RceaPQ8103TbzU2dbC3ecoAWC44B6da9Q%2BH%2Bj3WkaXML5BHNNLv8vIJUAADOO%2FWuL8Ba1Z6HPdvfGQCVEVdi7uQTn%2Bddl%2Fwnmi%2F3rj%2Fv0aupzPRLQupzPRI6qiuV%2FwCE80X%2B9cf9%2BjW%2FpepWmq2gubGUSxE7ScEEH0IPINYuLW6MXFrct15V%2B0V%2FyKWmf9hBf%2FRUleq15V%2B0V%2FyKWmf9hBf%2FAEVJV0P4iLpfGj52uf8AWD6UUXP%2BsH0or0XudzNzwf8A8jRoH%2FX%2FAG3%2FAKNWvsKvj3wf%2FwAjRoH%2FAF%2F23%2Fo1a%2Bwq5MXujmxG6CvIfAWl2ms6pcRajG0qCEyD52U7tw5yD7ml8SeJNVbXL2OK9mgihmeJEibaAFYjt1JxnmsCyvLmxkZ7O4lgdhtLRtgkelTCDSfmTGDSPWP%2BEI0H%2Fn0f%2Fv8Ayf41HceCtCSCVltH3KpI%2Ffv6fWq%2Fw41e81O0vIr6UzNAy7ZG%2B9hs8H16frXGa54k1WfVLsLezRRLI6LHG20BQSAOOtSlNu1yUpN2uWfh7o9lrM94uoRGRY0Rlw7LgknPQj0rtv8AhCNB%2FwCfR%2F8Av%2FJ%2FjXlFjfXdgXNlcywFwAxjYrnHSvUfh3qt1qmlT%2FbpDLJDLsEh6lSAef1p1VJe8mVUUlqmR6p4O0S30y8mitXEkcLup85zghSR3rL%2BErHGqrk4HlHHv8%2F%2BArxHV%2FHXiTVby4uJdXvIY5if3EEpjjVT0UKO2OOeT3zWda%2BIdas932TVr%2BDfjd5U7LnHTOD7mtlQk4tNmnsZctmz7Bryr9or%2FkUtM%2F7CC%2F8AoqStf4K6%2FqHiDwjLLqsxnuLW6a2EpHzOoRGBb1Pz4z7c881kftFf8ilpn%2FYQX%2F0VJWFOLjVSZjCPLUSZ87XP%2BsH0oouf9YPpRXe9ztZueD%2F%2BRo0D%2Fr%2Ftv%2FRq19hV8NeFtUN3pdjfW0u2eMKSw6pIuP6jP5V9VeA%2FiTpPiaKG2uZEsdXICtbyHCyN%2FwBM2PXPp1%2BvWubExckpLY566ckpI4XX%2FwDkP6p%2F19zf%2BhtVCvTdZ8BJf6lPd29%2BbcTMZGjaHfhjySDuHeqX%2FCt3%2FwCgsv8A4Df%2FAGdSqkbbiVSNh%2Fwl%2B7qv1i%2F9mrhdS%2F5CV5%2F12f8A9CNeweFfD0Xh%2B1ljWYzyysGeQrtzjoAMnHfv3rA1T4fJdX89xbagYI5XL%2BW0O%2FaScnB3DjNRGpHmbIU1zNnmtel%2FCj%2FkG3%2F%2FAF2H%2FoIqp%2Fwrd%2F8AoLL%2FAOA3%2FwBnXWeF9Ci0Gwa3jlaaR33ySEbcnGOB2GBRUqRcbIc5pqyPkFfuilr27Uvgekt9PJp%2Bti3tXcskMlrvMYP8O7eM4%2BlVv%2BFF3H%2FQwxf%2BAR%2F%2BOV1%2FWKfc6PbQ7m7%2Bzr%2FyJupf9hJ%2F%2FRMVN%2FaK%2FwCRS0z%2FALCC%2FwDoqSum8L6Rpfw58KSRXmooIfNM09zNhA7kAcLk9lAAGTxXjPxZ8dReLry2ttNSRNMtCzK0gw0znjdjsAM478nPoOeCc6vMtjCC56nMtjza5%2F1g%2BlFcN4y8Sy22tNb2LKyxIFk%2F38kkfqPxzRWsq8U2jWVaKdjmPD%2Bu3eiXBe2IaJ%2F9ZE33W%2FwPvXpeg%2BJ9P1kLGreTdHrDIeSf9k9%2F5%2B1ePUo4PFctOtKnp0OeFWUPQ%2BwPBXxU1jQPLttRLappw4Cyt%2B9jH%2By%2Ff6Nn0BFe7%2BFfFej%2BKLXzdIu1kdRmSB%2Fllj%2F3l%2FqMj0NfnpoHjW9sSsV%2Fuu7fpkn94v0Pf6H8xXpPh%2FXobl473Rr147iLkNExSSM%2FzH8jW%2FLTrfDozXlhV20Z9vUV4d4K%2BMksXl2niyLzY%2BgvoE%2BYe7oOv1X8jXs%2BmajZ6rZR3em3MVzbP92SJgw%2BnsfbqK5p05Q3MJ05Q3LVFFcb41%2BImi%2BFg8Ekn2zUgOLSAglT%2Ftt0T8efQGojFydkSouTsjsXdY0Z3YKijJYnAA9a8t8a%2FF%2FTtMMlr4dRNSvBwZyT5CH6jl%2Fw4968m8ZeOta8VOy304gsM5WzgJWP%2FgXdj9ePQCvKdf8AGtnYhotP23dwONwP7tT9e%2F4fnXXGhGC5qjOhUowV5ndeKfEt5qsz6j4h1EybOhlbakYPZV6D8Ovua8w8ReOi6vb6MCoPBuHGD%2FwEdvqfyFchq2q3mqz%2BbfTtIR91eir9B2qjUTxDatDREzrN6R0QrEsxZiSxOST3opKK5jAKKKKACpbW4mtZ1mtpXilXoyHBFFFAHq%2FgfWLrWNNlkvdhkifZuVcbuM5PbP0xXbaB4g1Tw5dm60e8ktpD99Rykg9GU8H8enaiivVh70Fc9GGsVc6HVfiz4p1q1a1NxDYxkbXazQo7j%2FeJJH%2FAcVxf9eaKKKcUo6BBJLQ8j8V%2BINQv7y4tJJfLto3ZPLj%2BUNg9W7n%2BVc5RRXm1G3J3OGbbk7hRRRUEBRRRQB%2F%2F2Q%3D%3D" /><h4>explain.dalibo.com - PostgreSQL EXPLAIN</h4></div><div class="bookmark__right-side"><q>Visualizing and understanding your PostgreSQL execution plans made easy.</q><div class="bookmark__comment"><p>Free tool to help understand PG’s explain charts</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://explain.dalibo.com/">explain.dalibo.com - PostgreSQL EXPLAIN<br /><small class="text-muted">explain.dalibo.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>SpeedTyper.dev | Typing practice for programmers</h4></div><div class="bookmark__right-side"><q>speedtyper.dev is a typing application for programmers. Battle against other developers by typing challenges from real open source projects as fast as possible. Practice your typing to become a faster and more accurate programmer by practicing typing actual code sequences and symbols that are hard to find on the keyboard.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://speedtyper.dev">SpeedTyper.dev | Typing practice for programmers<br /><small class="text-muted">speedtyper.dev</small></a></div></div>
</div>
<h3 id="tools-and-apps">Tools and apps</h3>
<div class="bookmark-group">
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F%2BIH6ElDQ19QUk9GSUxFAAEBAAAH2GFwcGwCIAAAbW50clJHQiBYWVogB9kAAgAZAAsAGgALYWNzcEFQUEwAAAAAYXBwbAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALZGVzYwAAAQgAAABvZHNjbQAAAXgAAAWcY3BydAAABxQAAAA4d3RwdAAAB0wAAAAUclhZWgAAB2AAAAAUZ1hZWgAAB3QAAAAUYlhZWgAAB4gAAAAUclRSQwAAB5wAAAAOY2hhZAAAB6wAAAAsYlRSQwAAB5wAAAAOZ1RSQwAAB5wAAAAOZGVzYwAAAAAAAAAUR2VuZXJpYyBSR0IgUHJvZmlsZQAAAAAAAAAAAAAAFEdlbmVyaWMgUkdCIFByb2ZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAHwAAAAxza1NLAAAAKAAAAYRkYURLAAAALgAAAaxjYUVTAAAAJAAAAdp2aVZOAAAAJAAAAf5wdEJSAAAAJgAAAiJ1a1VBAAAAKgAAAkhmckZVAAAAKAAAAnJodUhVAAAAKAAAApp6aFRXAAAAFgAAAsJuYk5PAAAAJgAAAthjc0NaAAAAIgAAAv5oZUlMAAAAHgAAAyBpdElUAAAAKAAAAz5yb1JPAAAAJAAAA2ZkZURFAAAALAAAA4prb0tSAAAAFgAAA7ZzdlNFAAAAJgAAAth6aENOAAAAFgAAA8xqYUpQAAAAGgAAA%2BJlbEdSAAAAIgAAA%2FxwdFBPAAAAJgAABB5ubE5MAAAAKAAABERlc0VTAAAAJgAABB50aFRIAAAAJAAABGx0clRSAAAAIgAABJBmaUZJAAAAKAAABLJockhSAAAAKAAABNpwbFBMAAAALAAABQJydVJVAAAAIgAABS5hckVHAAAAJgAABVBlblVTAAAAJgAABXYAVgFhAGUAbwBiAGUAYwBuAP0AIABSAEcAQgAgAHAAcgBvAGYAaQBsAEcAZQBuAGUAcgBlAGwAIABSAEcAQgAtAGIAZQBzAGsAcgBpAHYAZQBsAHMAZQBQAGUAcgBmAGkAbAAgAFIARwBCACAAZwBlAG4A6AByAGkAYwBDHqUAdQAgAGgA7ABuAGgAIABSAEcAQgAgAEMAaAB1AG4AZwBQAGUAcgBmAGkAbAAgAFIARwBCACAARwBlAG4A6QByAGkAYwBvBBcEMAQzBDAEOwRMBD0EOAQ5ACAEPwRABD4ERAQwBDkEOwAgAFIARwBCAFAAcgBvAGYAaQBsACAAZwDpAG4A6QByAGkAcQB1AGUAIABSAFYAQgDBAGwAdABhAGwA4QBuAG8AcwAgAFIARwBCACAAcAByAG8AZgBpAGyQGnUoACAAUgBHAEIAIIJyX2ljz4%2FwAEcAZQBuAGUAcgBpAHMAawAgAFIARwBCAC0AcAByAG8AZgBpAGwATwBiAGUAYwBuAP0AIABSAEcAQgAgAHAAcgBvAGYAaQBsBeQF6AXVBeQF2QXcACAAUgBHAEIAIAXbBdwF3AXZAFAAcgBvAGYAaQBsAG8AIABSAEcAQgAgAGcAZQBuAGUAcgBpAGMAbwBQAHIAbwBmAGkAbAAgAFIARwBCACAAZwBlAG4AZQByAGkAYwBBAGwAbABnAGUAbQBlAGkAbgBlAHMAIABSAEcAQgAtAFAAcgBvAGYAaQBsx3y8GAAgAFIARwBCACDVBLhc0wzHfGZukBoAIABSAEcAQgAgY8%2BP8GWHTvZOAIIsACAAUgBHAEIAIDDXMO0w1TChMKQw6wOTA7UDvQO5A7oDzAAgA8ADwQO%2FA8YDrwO7ACAAUgBHAEIAUABlAHIAZgBpAGwAIABSAEcAQgAgAGcAZQBuAOkAcgBpAGMAbwBBAGwAZwBlAG0AZQBlAG4AIABSAEcAQgAtAHAAcgBvAGYAaQBlAGwOQg4bDiMORA4fDiUOTAAgAFIARwBCACAOFw4xDkgOJw5EDhsARwBlAG4AZQBsACAAUgBHAEIAIABQAHIAbwBmAGkAbABpAFkAbABlAGkAbgBlAG4AIABSAEcAQgAtAHAAcgBvAGYAaQBpAGwAaQBHAGUAbgBlAHIAaQENAGsAaQAgAFIARwBCACAAcAByAG8AZgBpAGwAVQBuAGkAdwBlAHIAcwBhAGwAbgB5ACAAcAByAG8AZgBpAGwAIABSAEcAQgQeBDEESQQ4BDkAIAQ%2FBEAEPgREBDgEOwRMACAAUgBHAEIGRQZEBkEAIAYqBjkGMQZKBkEAIABSAEcAQgAgBicGRAY5BicGRQBHAGUAbgBlAHIAaQBjACAAUgBHAEIAIABQAHIAbwBmAGkAbABldGV4dAAAAABDb3B5cmlnaHQgMjAwNyBBcHBsZSBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgBYWVogAAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAAB0TQAAPe4AAAPQWFlaIAAAAAAAAFp1AACscwAAFzRYWVogAAAAAAAAKBoAABWfAAC4NmN1cnYAAAAAAAAAAQHNAABzZjMyAAAAAAABDEIAAAXe%2F%2F%2FzJgAAB5IAAP2R%2F%2F%2F7ov%2F%2F%2FaMAAAPcAADAbP%2FbAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP%2FbAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP%2FAABEIAGQAZAMBIgACEQEDEQH%2FxAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5%2Bjp6vHy8%2FT19vf4%2Bfr%2FxAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4%2BTl5ufo6ery8%2FT19vf4%2Bfr%2F2gAMAwEAAhEDEQA%2FAPqmiiigAooooAKKKKACiiigAooooAKKKKACiiigAorn%2FCHi7S%2FFVkJtNkdJQoaS2mG2WPPqO49wSK32IUEsQAOSTV1Kc6UnCas0TGcZrmi7oWigEEAjoab5qb9u9d2cYzzUFDqKKKACiiigAoqNp4lk8syIH4%2BUsM8%2B1SUAFFFFABRRRQB8aDxLd6bqdvc6JOYLi2fcsw%2FiPdcd1PQjuK%2Bq%2FBmv23i7wraakkahbhCk0DYYI44dD6jOfqMGvjaKM7VfjBr339mq8ZdL8QWkjBbeCaKcZOAC6kN%2F6LFfecRYKm8L7aK96HXybt%2BZ85lWIarez6P8zjPEttf%2FAAq8bWnjzRYpJdB1S4mh1K1U8KxlbKgcYBxuT0ZSOhAPu2jT6Xq%2BvQatpotbiG509J4rhIxlgznBzjIOOMfhTLPTNN8TeC7vSr8RXVjdGeKVUcN1lcggjoQcEHsQDXn%2FAMB9E1jwh4h8V%2BGdYmluLXTEhl09ivDwyvKxZP8AeKcr0DBvx%2BUqTVam2%2Fijp6q%2F6H1Lakn3R6Hd%2BP8AwxafaWuNWiWC2uhZT3HluYIpzj5GlA2KeRnJ474qzqnjHQtK1u10fUL9YNSuseRA0Tlpc8DZhcNzxxXzZ4n1nT9c%2BCXiu70axs9Ds5NYVjpsJMk7vuQtJMSflB4wqgAbep6V6L8YtDk1n4S6L4h0aYHVfD0UOoQTxNuIRUUyYI442q%2F%2FAACh4SEXFSbV21%2BCFyLS56X4rv8ASLjRtc07Vbq6trZbNxeSxRyKYYnVgXDhSBwGOeRwc9DWZ4GuPDPhf4YWM%2Bna0J%2FDVnC5TULqTqu9s5OB%2FESoAHoBVDXLiW4%2BDfiPV9TiW0vNU0ee5khZv9UWtiFjB9gBx6k14vrNne337MXg2axDT2dhetPfxxfMVjEsvzMB2BIz9c9qVLDqceVuy5kvwf8ASBQuvmdl8Z7%2By1H4ifCiW1DCQ6srESwNFIVMsG07XAbHB%2FUda9e1Txboek61baTqWoxW2oXQJghkVh5oAydpxg%2Fn14615H8dL%2Bym%2BJHwpaG4hk8vUxI8isCoRpYCpLdMEAke3NWPijJbt8ffhuJniKIJnO5hhTyVP5gEVbpKpCmnfaT%2B5sbSaR6Za%2BOvDV1ol5q8Wr24sLSY288km6Mxyj%2BAqwDbueBjJ7VfsvEOmXmqtpkdwY9REQn%2ByzxvDK0ZJG9VcAsuRgkZweDivH%2FjJ4Xh0LUPBuqaPZJa6BBr66hrBiB2CR3jxPJ1wAA4z0G73q%2F8S4bnWfjP8Oo%2FDz%2BZc6e8t3eyQnIhtmZMlyOgdQ6jPXOKyWHpyScXo7%2FK3f8ArqieVM7TWvif4O0PU5tP1fXLezvYSBJDNHIrLkAjI29wQfoaK%2BUP2kZUf4y6%2BY3VlxbjKnPSCPNFejRyqlUpxm29Un0NVRi0ncqRMRgCvo79nLSmj8L6lqM6fu7%2BcRoGGQ8cYK5%2Bm5nH4V4t8OPBOp%2BNtUWO0R4dNjbFzekfJGO6r%2Fef0A6dTX17pOnWuk6Za2FhEIrW2jWKNB2UDH4n3717HEuPhGl9Vg7ye%2Fkv87ny%2BV4WXP7aS0WxPDDFCCIo0QHk7VAz%2BVPwM570tFfEHvmI99osfiC50yRIk1N7M3cga3x5kG7ax34wwBwCM55HHNT6Ddabq3h%2B0utLjRtLuog8S%2BTsVo2%2F2CBgEHoR3rM13QbjUfEml6lCyQmwchiTkzwPGyyRY7ZYRHJ%2FuVyEPgrxLbeGdPsLa7hjnh0WLT32XciIs0cyPvBA7qGAOM5wDwcjpUISS96z0%2FUtJPqemXskMMcQmieRHkSNVSFpMEnAJABwB3Y8DuRU8cUcYPloq7jk4XGa4abw9r7ajPIl6Gt31K3u0DzYdI0nZpEDqBuQxkAKwyMlSxUA1r%2BDdHvtLsEXU5muNRECQz3JuGdZ3VnPmbDwpO7JPXovRVqJQio3UhNK25asr7SHiCQQxxWrwm6SQwBIXj4BcNjb3HXBwQenNar20Dlt0MZzwcoDmvNr%2FwAAXM%2Bi6ra6bFFpi3%2BmXEFxYJdyPZtdSFSskaHiMAh%2BQq53cg4rT1Dwxq93qGr3sVy1vJNc2sttGt4%2B0QqIxPEV%2B6u8Iwzg8tmrcIPaX9aDsu53ZAIIIyCMYxUNra29qhW2gihUnJEaBQT%2BFcVL4e1mLVdOks5G%2ByW88UjGe%2Bd5HiLXJkiIxtAHmxYAHITBJ2JVPTPCfiC1tdPWS7Bngt9JSR%2FtkjbpYJma7fkc%2BZGVXn7wGDgCp9nG3xByruehi3hGcRRjJzwgorzg%2BBdSubW1GparrL3sSMk09nqrWyTkyOwcqFPOGA56YCjIUElP2cP5%2FwCvvDlXc9Gs7W3srWO2s4Ire3jG1IokCIg9ABwBU1FFYNtu7ICiiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf%2FZ" /><h4>GitHub - navidrome/navidrome: 🎧☁️ Modern Music Server and Streamer compatible with Subsonic/Airsonic</h4></div><div class="bookmark__right-side"><q>🎧☁️ Modern Music Server and Streamer compatible with Subsonic/Airsonic - GitHub - navidrome/navidrome: 🎧☁️ Modern Music Server and Streamer compatible with Subsonic/Airsonic</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/navidrome/navidrome">GitHub - navidrome/navidrome<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAOEn8b3kGmyi407T7TU7fUG065W71JYraNxEJVZZNu9wyMhACbsscgAE0wfEHztC0K%2BhtLWJ9TuZ7Uvc3my1haEyB%2F3wU7txjOz5RuHPGCKtr4BtozbXNvq%2BqxavFcy3T6kDE0szyqqPuVozHjaiKAFG0IuO%2BcrWfA97a2Wl2%2BjXV5d21pd3V2wkvBFcBpsk7ZChDLueQkOM%2FMPm4wXoLUs6dr%2BoeIPCuglpFt77W7jdm13J5NujFnKsSSw2KFEnG4yKwAzisSD4uudR0CyudGSK4vdTutOvgLkkWRimWFXPy%2FMGZ164xmuy8H6FqFlFFd%2BIL2S71NI5YI90nmCKFpd4XdtXe2AgZsDOwccZOHqvwj0DUb3xFdSXOpxS62UabypkAgZXSTdFlDtLMik5zmjQNTFl%2BLV8%2FhfRtXh0nSbUalHc3Cf2lrCWyeXG5CKuVLvI4AIAXaMjJrA1%2Fxre65dXWq6Xd6hYWl14Au9SjtluGUQzh8Bxg43ryA3Wu%2FufhdpL3GlTWd%2Fqtg1hpg0f8A0WZF8%2B1HOxyUJBJ5LLtPv0qCw%2BEui2mni0%2B36rIi6LPoIZ5I8i2lcueifeXOAemByD1p6Bqc5qvxSvPCvhvR2mtLC7WHRbW%2BnkvtXSK5uyyDcIYsM7sOSS20HnGaQeLfEcXj%2FwAbzaBYS6zawWVhdR211fmCK3Qws7bFw3zv6AAfKcnoDv33wg0a6F9Guqa1b21%2FYQWF5BDPGFuEhj8uNm%2BTOQOwIUnqMEgvuvhNp873c0eveIba7vLW3s7me3uURpYoo%2FLwRsx8w5JxnPTAJBNA1MjX%2FjC1poumatp2nac1ndaWuqbdQ1aO2lkBODBDHhmeQYPJAXjgmqXjr4w3ljFcw6HZWdvIbC0uoJL%2BY%2BfcfaSAv2aAD98UzyNw547V0118I9DkdltL7VrC0k0yPSZ7a1nVUngjBCBiVLA8nO0jPfOTnjNe%2BG3i%2Bz1q4Phi8m8o2FrY2d8urm1kj8mMqGnjELCQ5JPybRjtkk0KwO57narIltEs8nmyqgDybdu445OO2T2qWq2lx3MOm2kV%2FOtxdpCizTKu0SOFG5gO2Tk4qzUjCiiigDKGvWbM%2BwTuqRmQsIzjGVGPXPzDjrwakbWbFePOYk5wBGxzjqOnUZGfTIBqGG80ceasP2fEUe59sXG0Y9ue3H0qKW80TY83lRSEAP8ALbklsDORxzj17d8UxFga7ZHGGkzt3MPLPycA%2FN6feHtninprVg0BmFwAiuIySp4Y9B%2F9fpwaqzSaJasS9tAoRjlxb8AqOecc46cZpZLrRgjIYYnXfvKiDgsCBnpjPP49qALLa1ZKrHzHOBnHlsOvTqO%2BRjPXtQdZshEshlYKx2j5G5b0Bxgntx34qlbSaGLaG4EEUS%2FLGBJEcozDO1vQ%2BtOiuNHmnCrZqWyCjG1PzHAIK8ZPBB9qALKa3ZMiMzyIWOAjRNuyegxjqcHjrgZpX1qyjkdZJGVFjWXzCh2FWzzn8vzA6mq9peaNNLCII4RLkIoEPKk84yBgc%2B%2FWm3d%2FpEN49tdwRKYcKC0asPurgADJ6OO3r6UAXZ9WsrfPnTFMBWO5GHDdO3%2F6u9INZsTJt878QpI%2Flxg4HPc4qs9zo93cLmGG5lLiEt5O7ae2SRwPT17VHHqWjSQZeJYVf5QJICpbdhuOPVsn06%2B9FgNeyuory2Se3YtE%2BdpIIzzjODU1ZukXFgIltdPYhEBZVKt0yDwW6%2FeH5itKkMKKKKAKwsLQKVFrBtKCMjyxjaOg%2BgobT7No1ja0tyi9FMYwKs0UAVpNPs5WdpbWBy5yxaMHJ96aNNsg24WdvuznPljrx%2FgKt0UAVf7OsypVraJlL%2BYQ6hvmxjPPsAPoMU5rG0b71tAenWMdsY%2FLA%2FKrFFAFVtOsm62lueQf9WOoGAafLaW82fNgifJ3fMgPPAz%2Bg%2FKp6KAKqafZxyK8dpbq6ncGEYBB9ad9htNoX7NBtB3AeWODkHP6D8qsUUARx28MZBjijQgYBVQOOOP0H5CpKKKACiiigAorKvNZW3vxbLbTy4KhmRSeW%2Fu%2BuByemAeM9KsyX6x6nFZGKUvIhcSAAqMdQecj64xyBnNAFyiiigAorOvNVjtr1bdop2Hy%2BY6oSE3nanu2Tx8ucd8CoNS1%2B2027MN7HLFEAmZztKAuwVR13ZLcDjkg4oA2KKBVDV9RGmwpK8EsqMxUmMD5TtJGfqQFHuwoAv0Vl32tQ2T2Mc8M%2Fn3f3IlAJX7o%2BY5wPmdV69SKj03xDa395DaoksdxLC0%2Bx9vyqGCjOCfvZ3DGeOeOKANiiiigAooooApXul2N7IHu7WKZwAMuuehBH5EA1XvZbW11L7Q9iXutioZo48vsy3GepAPb%2Fa961aKAMpdYV43kW1uQqhCQybT8zY6frV%2BzuFuoBLGHVSSMMMHg4%2FpU1FAFeaytZrhJ5raGSdMbJGQFlwcjB7c1m6nc2sdzKl1pvnpsUu4jDlgN2ARjsSQP94%2B9bVFAFWyvEui6pFLHsx%2FrF25BzjH5VLc28VzF5dxGske5W2sMjIIIP4EA1LRQBnaq0Ky27XFkLgR7pQ%2BwMYyMcj0PPt09qgs7m0a6hVNOkgdR5MTtAF2ptzgHsPlAx7CtiigAooooAKKKKAPijYvpRsX0oor6M4Q2L6UbF9KKKADYvpRsX0oooANi%2BlGxfSiigA2L6UbF9KKKADYvpRsX0oooANi%2BlFFFAz%2F%2F2Q%3D%3D" /><h4>GitHub - wallabag/wallabag: wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.</h4></div><div class="bookmark__right-side"><q>wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely. - GitHub - wallabag/wallabag: wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.</q><div class="bookmark__comment"><p>Self-hosted pocket-alternative</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/wallabag/wallabag">GitHub - wallabag/wallabag<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Paperless — Paperless-ngx 1.7.1 documentation</h4></div><div class="bookmark__right-side"><q>Paperless is a simple Django application running in two parts:
a Consumer (the thing that does the indexing) and
the Web server (the part that lets you search &
download already-indexed documents). If you want to learn more about its
functions keep on reading after the installation section.</q><div class="bookmark__comment"><p>Always thought about builing such thing myself, but happy with a Mac Archiver App i use ATM</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://paperless-ngx.readthedocs.io/en/latest/index.html">Paperless — Paperless-ngx 1.7.1 documentation<br /><small class="text-muted">paperless-ngx.readthedocs.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A8YooooAKKKKACiiigAooooAKKKKACiiigAooooADwOau2%2Bl39ygeCyuHQ9GCEA%2FnXVeFdBiit4r28jD3EgDxowyIx2OP7x%2FSutt7a5vCfstvc3OOCYomkx%2BQNeZXzHllyU1c%2BjweQOpTVXES5U%2Bn%2Bf8AkeW%2F2Fqv%2FQPuf%2B%2BR%2FjVW7s7mzcLd28sLN03rjP0r1eRGikMcqPHIOqOpVh%2BB5rI8VRJL4fvN4z5aiRfZgRzWdLMpymoyS1N8Tw%2FSp0ZVKc3dK%2BtunyPN6KmtLa4vbuK1srea5uZW2xwwoXdz6BRya1Na8K%2BINCtkuNZ0PUbG3ZgolngITJ6AsMgE%2BhxXrnypi0VbudMvrWxs726sriGzvATbTyIQkwHXae%2BKqUAFFXW0nUV0hNVawuhpbyeUt2Yj5RfJG3d0zkEfWkbTL9NKTVGsrgabJKYEujGfKaQZyobpng8exoAp0UUUAFFFFAHueiWkDw6he3EP2qOwjWQWgJHmZbbubHPlrwWxzyBwCTXqWl3mr2XhvTL22juri2eGG4mWwhQtIzvgQxofljjReuBk5HOcmvFfD%2BryNHa6np0zQzgZDL1RsYZSOhHUEHgg16H4a%2BI40ix%2ByyaQhjDFlW2m2IpPJ2owO0E84BwOwFeBhakaUnGb5X%2Bv9f1qz7nMKNTEwU6MVNOz%2BVv6d%2F8AJHQ%2FFURw3ulCe2e%2Bt752ge1HMoYY2vAeqvzjH3W4yO9eK%2BObVbCy1u0WdLhYN8QlTo%2BGAzXa%2BJfG1zq92Z7W1Wyk8sxLN5hklRD1VDgBM9yBuPrjivL%2FABtfJBpq2SEebORlR%2FCgOc%2FiQB%2BdXOca%2BJXs9dUZwpzweAl7bT3Wrebvb87efXZDvgv4msfCnjN77VILl7OW0ktnntojJJa7ip80AAnA2kHHY9%2BlegXFjqc%2FgfxMfBnj238Z6TNbl72y1XdLdQRgHLRkv8r4yeVAJUY5FeWfDvxjc%2BCtckvYbWK%2BtLmE213ZynCzRk5xnBwR9COSO9dI3xC8PaLo2q2vgXwgdHvdTg%2BzTXlxeNOY4jnKoDnHU45Azg4OMV7h8UXG8JDXfDHwls4tQvgdaeZH82dpI4EUbmMSHhTtB6d8Vs6B4R%2BHmv8AjvWPDVpp%2Bt28ukRTjzpL0sl20bBHJHVCGIxjAIzkdBXH6Z4znuoPhzpGmJb6beeHrgrHe3k37hy%2BB84AyqY%2BU%2BzV7bplu%2Fh7xP4j8Q6t4P07QLd7GWW91ldT%2B0LdSHaQsKnaVDHcTlQWIHfqAcx8Lr7SG%2BBehaR4lTOm%2BINRuNNeXdjypHaR0b2%2BZAAexKmsTxb4W1PRPgvpnhu7Qf2gPFhto3YbVl3%2BaI5B%2FssGU%2B2SO1ecTeKVuPhVpHhBrF0ksr1r1rrzRhtwk%2BXbjII39c9q6Lxf8Vb%2FAMUeBtF0W9tnXVdOuoro6kJQfNaMMFbZjhvmUk5xkH1oA6O48IfD6w8bW%2FgK6h1yXWJFSF9YW4Colw8e9QIs424x2OMgEnk1m%2BAPBugX%2Fim98Ja1o2r6hrNleTR3N%2FaXfk20UCthXYbsjjtjJJx64U%2FFXRZ9ch8UXvguKXxhDEFW7W9ZbZpAu1ZDHjqAcdCccbuARF4X%2BKen6b4a1bTdZ8Ny6ld6zcS3Gp3kN79ma6LuTtJUbgoU7cA4xn1NAHEfEmHQ4PFVxb%2BBnkbSIFEXmzSmTzZATuZGPJXoB64JHBFFQ%2BLr7RdR1GKXw1oR0SzWEI1sbpp9zgsS%2B49OCox%2Fs0UAVtI1W50qYvbEMjffif7rf4H3rqoPGFky%2Fv7e5ifuFAcfnkVy9zoWsWrwpdaRqUDzRNPEstpIhkjUbmdQRyoHJPYdaSLRNXlhkmi0nUXhjhW5eRbVyqRMpZZCcYClVYhjwQDXNWwlKs7yWp6GFzTE4WPLTlp2ep0V74xjCEWFq5c9HnwAP%2BAjr%2Bdclczy3U7z3EjSSucsx71oHw5rgu7S1bRNVFzeIXtoTZSB5lAySg25YAcnHTvVW20zULrUv7OtrC8m1EOyG0jgdpgy53AoBuBGDnjjHNVRw9Oj8CM8Xj6%2BLt7WV0unQqUV1GkeA%2FEOrIBaWJFz9vbT2tZg0UySLB55LKV4XZ36kkADkVjromrta2tz%2FZGpCC6l%2BzwSG0k2yy5I8tTjBbIIwOcgjtW5xmeRkYPIpNgwoxkL0BOQPoO1bDeGPECJM76BrCpApeVjYygRgKGJb5eMKynnsQal0vwl4g1O40uK10e%2FA1NwlpNLA8cUuVLZDkYxtBbPoCeaAMOitXUNA1LT7KG6uLWcROpaT9zIDbnznhCyZUBWLowAyfTrxUU%2Bi6tb2lzdT6VqEVrbS%2BRPM9q6pFJkDYzEYVskDB7kCgDPorXXw3rL6Rp2pxabdS2eoXD2tq0UTO0si9QAB35x67Wx0NNstB1G58S2mgy272Wp3NxHbCK8RoijORtLAjIHIOcHigDKorvtN%2BFPiHWYZJ%2FD13oOsWscjQyTWt%2BQqSL1Qh0UhhkHp0IooAtzfEXT2vWMekan9ju729v75Z79JJQ9zA0LJbtsAVFDEgMCSQM4xWXq3jdLjSTY6bZXNtGsOlwR%2BdcK%2BUshIAJNoG7fvXIxjg%2B1cVRQB6QfiHpq6zqd3DpGqmDV47xb6O6v0uBGbgxsfIjZPKCgxgfOpLA4PAFYp8XW91471LxBqlhPcxXsUsXleZH5ke6IRq5G0RuQByrLtOeQcc8jRQB6kPipB%2FbSXx0e5CHUVvXRbhA2z%2BzvsRVSFA3fxg4A7YFVrX4lxW1hokEWmXIbTzp8Un7yDbNDZy74%2Fm8vfvPGfm2g7iOpFebUUAdz4e8fPpU%2BnyzW11cm21O%2F1CTNx%2FrftFuYVU5zyuc5PbgVd0v4i2WmWehw2mjXKtYXFjcyfv48ObeNo2AbbvO4Nkb2OOgAFec0UAd5ofju00e90oJpM17pdlay2r215OrNP%2FpZuYXYqANyPszxzhvWmv8AEGWfwdNpd3bTSapLb3VrJeAw7JUuJ%2FOkZtyGQNuJ4VgDweCK4WigDs%2FDfjK30nSdNtJ7G9mks5r4F4bpYwYbqII%2B3KkrKpAKt05YHrxHN4vh%2FwCEv8Marb2Vz9h0CK1t4Ibi4Ek80cLMwMj4C7juI4GAABXIUUAeq%2BE%2FilpPhKzu7TR%2FCt1dQ3Ny93I%2BoaoPM3sACB5cQG0BRjv1oryqigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP%2FZ" /><h4>GitHub - SigNoz/signoz: SigNoz is an open-source APM. It helps developers monitor their applications & troubleshoot problems, an open-source alternative to DataDog, NewRelic, etc. 🔥 🖥. 👉 Open source Application Performance Monitoring (APM) & Observability tool</h4></div><div class="bookmark__right-side"><q>SigNoz is an open-source APM. It helps developers monitor their applications & troubleshoot problems, an open-source alternative to DataDog, NewRelic, etc. 🔥 🖥. 👉 Open source Application Performance Monitoring (APM) & Observability tool - GitHub - SigNoz/signoz: SigNoz is an open-source APM. It helps developers monitor their applications & troubleshoot problems, an open-source alternative to DataDog, NewRelic, etc. 🔥 🖥. 👉 Open source Application Performance Monitoring (APM) & Observability tool</q><div class="bookmark__comment"><p>As NR & co are extremely expensive IMO interesting to try this out later that year</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/SigNoz/signoz">GitHub - SigNoz/signoz<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAN%2BElEQVR4nO2cfVAV1RvHv7tcXuRdmJB3FDBFLK6RDaagZEamQ6IjE05qNjQU0thYMQ1jf1nMOE4j6TCThlBJVKBRyAw010KYAkpJZgRfwAIuLw5DvAjXvMrL%2Bf3h72532bP37nIvseZ%2BZs7M7jnP85xn99ndc%2FbsOcucOHFiCiqKQbNo0SJmrp1Q%2BQcGAJlrJ1T%2BgZ1rB1T4qAFRGGpAFIYaEIWhBkRhqAFRGGpAFIYaEIWhBkRhqAFRGGpAFIYaEIWhBkRhPFQBcXZ2nmsXrMIFhBCCqakpTE5OUhMhBKdOnUJoaKhV2cnJSUxNTYEQgvnz51MrzsrKAiEEhBC89NJLCAoKkmTXJCOVQ4cOYXx8HIQQGI1Grs6WlhbExMRQdXx9fbl6CBH%2FOlFWVsbZi4qKkuyTJXh3CMMwYFmWmgDA398fk5OTVmVZlgXD3P%2FuJXby5s2bx207ODhgYmJCkl2TjDW0Wi0IIcjOzoZGoxGUR0dHo7m5GXV1dYIyc18A4Ny5c9Q6FixYwG1bCpwchJ4CqK%2Bvh7u7Oy%2FP2dkZ586dg9FoRHt7O3e1GQwGxMXFcSfLpMswDJydnTE%2BPk6tePoB3L59Gzdu3MCdO3c4u6tWrQLDMBgfH8fvv%2F%2BOefPmgWVZ3Lp1y%2BJBJSQkoLa2lpdXXV2NxsZGBAYGYufOnXBxcQHDMIiPj0dvby%2BCgoJE7a1fvx5arRbNzc28fPOLzV4BAe5%2FMSQmjEYjMeVJTSbu3r0rWeedd97h9Hbu3EmVmZycJIQQUltbK9mum5sbMUen01HlNm7cyJM7e%2FYsV%2Bbl5cXlDw4Oih7b%2BfPnObklS5bIPm%2B0JGjUbWn4nJycZqRnurvE8l1dXSXbqq6u5rYvXbqEDRs2UOWqqqrg7%2B%2FP7W%2FevBkBAQECOVMb6OTkhA8%2F%2FFCyHzNFcCZMbcSDypo1a7jtJ554wqJsf38%2F9u3bx%2B3n5uYKZA4cOACj0QgAyMnJgZubm508pSNoQxiGwZYtW%2BDt7c3L9%2FDwwLFjx2bVGVuJi4vjtpuamiTpHD16FB9%2F%2FDEAIC0tDXv27OGVDwwMIDMzE4WFhQCA5uZmLF682E4eC9H4%2BvpicHCQy2BZFuXl5VThwsJC3L59e9acsZWFCxdy25WVlbL1aY9rNzc35OXl4fDhw%2FD19UVkZCSSk5NRUVFh14bcBOvi4sLLmJyc5Lp9AmGRZ71SMO8O37171y42HR0dAdzvJpv4%2FvvvAQD37t2zSx3maAYGBngZhBA88sgj8PHx4eW7urpibGzM7g7Yk87OTm579erVknScnJwwNTUFlmUtnuD%2B%2Fn7k5%2Bdj7969AO4%2F6gwGg03%2B0tBMd0Kj0WBkZAQjIyN2r2y2aWho4LY3bdokSSc3N5e788vKyizKZmVlISMjAxqNBrt370Z3d%2FfMnRVB2c%2BgGXDhwgVu%2B8yZMxZlFyxYgLfffpvbz8nJsWr%2FqaeeAgB4enryHmP2QhAQUxfvQcX8vWPr1q3UoREACAwMxM2bN7n9mpoa6PV6q%2FYvXbqEH374AcDsvCIIAuLi4oKxsTHqoN5XX31ldwfsza1bt%2FDCCy9w%2B%2FHx8SCEoLq6GpmZmcjJycGVK1fQ09PDdQKGhobwzDPPSK7j%2BeefB3B%2FDM7eUMeypo9jmfDz87NbxVIGCE3I7d1VVVVh7dq1vPGspKQkJCUlCWQvX76Mxx9%2FnJdn3p0V83P79u1W25yZIOtI79y5Y7eKzQ%2FU2pBLT0%2BPbPt1dXVgGAYFBQXU8t7eXqxbt04QDIA%2FEi12MZw%2BfRrt7e3cvr2%2BtTxUyxH8%2Ff0xPDxst3eU2eChCsiDwH%2Bu2%2FugowZEYagBURhqQBSGGhCFoQZEYagBURiapUuXwmg0YmhoCKOjo3Ptz0MPQ6Z9h9Tr9SgrK8ORI0fQ29s7V379J2BZFgkJCdxnbycnJ%2FT09KCrq0tciVjg4sWLJDQ01C7zjR7GtHTpUsE5LSoqkjcvy5zY2Fh0dXWhpKTEkpiKCLTBWGuffSU16mlpaRgcHKROJFOxL2xcXBy2b9%2BO7OxsnD9%2FXlTQx8cHRUVF%2F55nDzGC51hGRobg2VdVVTXnz%2BQHLYWFhQnO47Fjx%2BS3IcePHwfDMPj8888BADqdDhs3bqSHU8WuWGxDXnnlFWzYsAHPPffcv%2BXPQ4%2FVRl1ssYrK7KAOnSgMNSAKgzoNyN7Mnz8fiYmJCAgIgKenJ3p7e9He3s6b%2BmkLzz77LMLDw%2BHr64vh4WF0dnbyFu7MlJCQEKSnpyM6OhphYWHo7OzEhQsXcPTo0VmdUDhr3b79%2B%2FeTsbExS6Mz5KeffiIRERGyba9fv55cvXrVou3Ozk6ydetW2ba1Wi3p6uqyaPvUqVMEAGlsbOTlj46O2tTtnZWAaLVaiwdD45tvvpFk28HBgbS0tMiy3dPTQ7y8vCTZz8vLk2y3q6uLNDc38%2FI6OjpmFBBHR0ei1%2BuJJiAgAOHh4TNa6%2BDq6ipY7bpjxw58%2BeWXsm2lpqbi6aefRkhIiKhMYGAguru7Zc9kDAoKwsjICJYvX47W1lZRucrKSsmz5gEgNDQUoaGhsnyh4eHhgaGhIWg0GmgOHDiAzMzMGRtjWZaberly5UrRYFy7dg06nQ5jY2OIiopCSkqKQCY4OBhNTU2IjY0VlDEMgxs3blCDYTAYcPr0afT19cHPzw8pKSnw9fUVyLW0tMDDw4M6wHfw4EHRYFRUVKC1tRXu7u5ISkrCo48%2BSpWbKa2trf%2Bspf%2Fggw9k3f7TCQgI4G47Gt3d3aJD%2BDk5OVSdrKwsgWx1dTVVNiUlhWo7MTGRKt%2FY2CiQDQkJocp%2B9NFHVNtRUVFkdHSUqiP3kfX%2B%2B%2B%2Fzym0OSEhICNUwIfcbVdoBmactW7ZQ7ZrLREZGWqxbLLm7u1P1YmNjeXK%2F%2FPKLQOaNN96w6vvExIRAT25ABMedn59PdVoqGo1G1Dlvb29JDWl5eblA98UXX%2BTKv%2FjiC0F5RkaGJNupqakC3dLSUq6cZVlBudQfFSQlJQl05QRk8%2BbNgnIEBASQ1atXk5UrV1pMERERxGAwCA0AJDg4WJBfWVkp6aAAkIULFwr0z5w5Y%2FFRKNW2Nf309HRB2fLlyyXb%2Fvvvv3m6cgJSUlLCKzMYDAS2HNjExAQBQHbs2CEoS01Ntemk9fX1iV7BFRUVsmx%2F%2B%2B23AhsMwxAA5MSJE4IyObaLi4tnHJC2tjZeWXFxseVPuOYkJiYK8kzLg8PCwgRl169fl2oagHANiOnrJK0bfO3aNVm2zddxmDCtaV%2B0aBEvX%2B7Ejra2Nlny5gQHB%2FP2vb29pY9lZWdnC%2FIqKioA0FdcyVkhBYgvjPH09JRlhwbNFw8PDwDC30fJ9dsWzBcGAfdXDksKSHh4OLeuzhzTByza8uBly5bJci4wMJC3b1oTT5syI9c2bbWsye50%2B9P9sIYtPy7r6%2BsT5EkKyK%2B%2F%2FirIM5%2BJQnv73bVrl2THVqxYIcgzPQpok%2FfkvE0D4C0CNWH651ZjY6OgTOxPczS2bdsmyxdzrl69Ss0XbbBYliWdnZ2ChokQQtzc3Kz2ZPz8%2FCQ1jL%2F99ptAd%2F%2F%2B%2FVw57T3hzTfflGT7rbfeEug2NTVx5Q4ODoLyhoYGSbaTk5MFunIadVoPTzQgqamp3A%2FEppOZmSmQP3v2rEDO1FOylLKzs6l1eHp6cjJpaWlUmcjISIu2Fy9eTNV77bXXeHI%2F%2F%2FyzQObdd9%2B1aNvJyYlqW05ANBqNoJwXEHd3d5KdnU26u7uplRFCSElJCdVBHx8fqvzAwABZtmwZVefTTz%2Bl6nz99dcC2aGhIarsrl27qLZ3795Nlaf9MY%2F2HkUIIcePH6fajo2NJUajkaoj90395MmTvHJ0dHSQvr4%2BqvHpfPfddxavmkOHDonq6vV6UlBQQPLy8ohOp7NYj4uLi8D2k08%2BKSo%2FMTFBSktLyeHDh0lpaanonU0IIUlJSVTf33vvPVEdnU5H8vLySEFBAenp6bHou9yATH%2FPsji315wjR45Ieq6a%2F4dwJsTExIjafv31122yffDgQYu%2BFxUV2WSfkJl9D4mOjubKrQbk3r17ZO3atZKCYUrT316lotVqrdoWa0%2BsYd5JsJSysrIk29y3b59gFMB8QFXOB6qYmBhCiIWA6PV6QeMnJ23atImMjIxIOrDi4mLi6Ogo2XZISAipr6%2BXZLulpUW0DRNLzs7OFi%2Bqmzdvkvj4eAKA1NTU8MouX75MvfJNmD790pKXlxdhGhoaiMFgwNjYGNra2tDU1ITKykq7%2FUYjISEBe%2FbsQWJiIjfEMjw8jPb2dpSUlODkyZMz%2FhFYWFgY0tPTkZKSgoiICLi4uGB8fBx%2F%2FvknKioq8Nlnn%2BHKlSs2%2BR8TE4MlS5YgODgYer0e9fX1vBe669ev8z5Y6XQ6mycWzvguUJPwAVNYWGiTPXVelhlarRZ1dXXIz8%2BXJL9q1SpBnk6ns9mPOb%2FK5jolJyeTv%2F76i3el%2B%2Fv7W9X7448%2FBHcIrcsuM839CZnrtGbNGsGJnZiYII899piozo8%2F%2FijQuXjxoj38mfsTooRUWVlJ7VHV1NSQl19%2Bmaxbt45s27aNfPLJJ1Q5QghZsWKFGhB7poGBAdGTbQ0JMxLVgMhNLMuSjo4O2cEoLy%2B3px9zfyKUlnJzcyUH49VXX7V3%2FXN%2FApSa9u7dS2pra3kjDv39%2FaS0tFT2JA6pSf3Fn8JQXwwVhhoQhaEGRGGoAVEYakAUhhoQhaEGRGGoAVEYakAUhhoQhaEGRGGoAVEYGnt8lFexH5r%2FT31UUQj%2FA7GREF%2B6%2FG%2BLAAAAAElFTkSuQmCC" /><h4>Every Door - OSM App</h4></div><div class="bookmark__right-side"><q>The best OpenStreetMap editor for POIs and entrances.</q><div class="bookmark__comment"><p>A OSM app (for iOS too), too help adding shops, opening hours etc.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://every-door.app/">Every Door - OSM App<br /><small class="text-muted">every-door.app</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><h4>Notable people - Wikipedia Map</h4></div><div class="bookmark__right-side"><q>Using data from Morgane Laouenan et al., the map is showing birthplaces of the most "notable people" around the world. Data has been processed to show only one person for each unique geographic location with the highest notability rank. Click below to show people only from a specific category. Made by Topi Tjukanov. Inspired by People Map of the U.S by The Pudding.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://tjukanovt.github.io/notable-people">Notable people - Wikipedia Map<br /><small class="text-muted">tjukanovt.github.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiloA94%2FZU8ILfa7eeLLyMtDpJWGyQj5ZLpwcH3CLliPVlPavrGCMQwKuT05Hc%2B9eV%2Fs9yWx%2BFPhiO024Vbl5tuM%2Bf57AlvfbsxnsRXqmfXGfWhF7Ig8n53ZQQSc4HGBXg%2BqeCtZm%2BJVrqEcbTXKRDc5jkEHmAMqyt820YBztGc4PHOa9%2Ftn3W6sB97n8KeqDGaY07EMkYEEW4g7FVWYDGTjGce9V58NCQACP5VPJvlnSFQhjwfM%2BbDD0AHvSmHysqScn9aBNWPhj45eHW8PfEPURHD5dneN9qgIHynd94D6NnjtxXn9fZnx58NQeIPBt%2BXiH2qyja6t5MfMGUZKg%2BhAx%2BR7V8Z0hSXUKKKKCQooooAKKK9z8JfBGx1H4VDxbrmuzac80T3EarAHSKMOUUvyCxYjgD1FA4xcnZbm%2FwDsu6kIvCetwxRyCW31O3keQHjbLG6gAdPvR8%2FUenH0Tptw1zM0MiZCjJYdGrwL4IwWWgaBcaZDrem3l7f6klwsUUUyyCGNXUltyAZ5Uhfc85r33SAI42ZcDJwfrilFp7HRVpTpJRqRs%2FMv7HgZysYePqqqcE%2BtTbJGkI3Iqg8Ec7h%2FSlikLL8y7SecHrTwec1RjcbGmzp1PWm3IDxlTwR0NSueKiY59OaBHnfxO1SLT%2FBOuTSMA0dpMMH%2B%2FsOB%2BJwK%2BFK%2ByvjzpouNEmkvJbv%2ByHKi6itnVHbB%2BUhmVgBnGeOcAZGa8q%2BH3w88A%2BIfEVtp0tz4me4ulZIoGWGNd4XdkyKWOAAxxt9PxhzSfK9zpWErVKXtYRvFb%2BR4TRXTeMvC76H4o1LTLGR722tZ3iSYqFLbSRyM9eP89KKOePczeFrJ2cH9xzNFFFUYBX2V4kYQ%2FsxaFGnAk0%2FTVIHfOGP6ivjavsj4jRNpn7PfhiyuAY5xb6bE6N1DLCWYfhWdX4H6Hdlqvi6fqvzPFfD2qDRtf0%2B%2FkP7qJgz4BPHfivq3wZqcGr6NHf2jboZ8sh%2FT%2BlfIN4AEIHRRx%2BVfVXw40qPQvCWl6bbzmUJCGLse7%2FOce2W4rHCt6o9ziSlGMoz67HZSyhDyTyM4xSiYEcGsy4t5ggZAHKnuSCagsZZZbk5UowyDGTkY7EGus%2BYN4t8h9%2F0qnJcbZAu7LHtnGacZnKbWHGazWkSTVShhJ%2BzoHEmcD5sjb69qAMrx9p1zq%2FhfUrSytvtFxNbuiJuA3MRxya8T%2BDGl32k%2FGrQ7LVbSa1uYxPujlXB%2F1TDIPQj3HFfScRBQd896in020l1bTNSngVruwkJhl%2FiQONrAH0IPT2FZzp80lLsd2GxzoUalG2kk%2FwAj4t8YSOfFmtEd76c%2Bv%2FLRqKyvHE%2F%2FABVmqlSMNdTN%2FwCRGork5L6ntyxag%2BXsW%2FhF8LNR%2BJM2oGzvbaxtLHyxNNMCzFnJ2hVHU4Vj1HSu78T%2FAAb0rQYdQlfSfFc9nYnZLeG7tow3%2FTQRBGbZ36%2BmcduH%2BA3iLU9H%2BIOladYX8tra6tdRWk6qAylmykblSMEqz5H4joTX0v8AGC2v7b4Y3k01%2FJPdCWEXEyosfmKW2sNq8AZK8e1ddRtRbXQ8DAQhOtGE0mm0tb9fRo%2Bc%2FDnhzwXa61b3ms3WuXNnC4kawS0hHnY5CNL5vCk8HCZxnGDzXofxZ%2BJCeOIrSC2tpLO0t2aZkmYFnkIwOnAAHH415gz8k1d0bS7vWtSisdPTdPL74CgdSfYCuL205%2B6fXUsvwmEl7aK1Xd7CxvEt%2FbfaAph81N4YZBXcM59sZr65luEtL1W48vPybV42%2Bg%2FAfpXkTfBiG5PmDU5lQr0CAndjrn0zXpelWd9Pp4t7mF2NvgJKTjeR1%2FXkV1UKbhe54edY2li5RlSd7X%2FQ6qG5guIg8ciMrcgg9RVeSwdrrzY22oVwfXPrXO2sF7aSIYoQollUPHJlRycF1I%2FlXbsQowOlbnhmPeuYdolyC3pzXKa9rD6Skk7r5ltIAZAB8ygdMf4V1PiO0e7sGFvJ5dxGQ8bc9fQ%2BxrjPElgk%2BlPHql0kgEbSSBMxqB6kA5%2F%2FAFUDRL4E8ZJ4he%2FtLC3ubuey%2Bc%2BWuMoSduWbCq3BGCcnHHQ03WvHi6U27VJYLMxhJGs5hiYHfjYwyfQnIyMA9a8j%2FZ8n1b%2FhKvE2m6FqMFskw80yT2wn3CJioAywwMSH64rG%2BPdjNafEW5lkMMl08MEjy%2BVtyxjGSBngZHSs5VOVXO2lhFVlyvTS%2Fna9vQ8t8WySLrMpmKM7Zcsp3BssxyD6UUzWAk1xG0%2FL%2BWAcn3NFRBrlNMXCUq0nF6XPSfCuneH%2FAAn4e8H%2BIZtKuNS167L6kjzXTRQweVOyRhVQZY5j3Ek%2F%2FW7HxT8Wr7xN4dvdIv8AS7GKG6C7pIGfcpDhsjcSOorkPE8scnhvwGLUg26%2BH0GV6b%2FtEwk%2FHcCDXPbsKOa5a1Wak0nofQZVgcP7CFWULy3vruStDATlZZR9UB%2FrW74I1iHw3r66jIj3CiJowigKQWxzk59K53dxSg9axU2ndHs1KdKrFwnHR%2Bv%2BZ7ivxlshCwGn3auQduWUjPbPTvWb4b%2BMuoW14i63BHJaFfnNszZDd8K3b8ePevIc0E8Vr9aqHnf2LgrfD%2BLPoqf40eHJowgttRB4O5oVxnr03ZrSi%2BMPhVowZLq6Rscj7K5r5jz7UZ9qf1ufkZSyHBva6%2Bf%2FAAD6P1H4xeGhDJ9na%2Bmk2nav2Yrk%2FUmvNPF3xCk1DQXs9EBt7u6yLieVSPLXGNqYyST68YrzsYpO9H1qY45HhI9G%2Fmdb8E9esvBHimW91UTzW0ls8A%2BzIGfcxXBIYjj5fWtD4%2B3ltqvi611CwYta3em280ZYYOPmHI7EYxiuDU4xirfiJ2e307dkhLYqPp5sh%2FrSVRyi0zWeX0qTVaGjtb5bnn2vMftqgcAIP5mio9cOdQYeigUV3QXuo%2BKxcr1pep6sdO0bR%2Fh1oFurXd9q2qQLqP2tpiIrOPzHUwxJ6llbeT3A%2FDBCIODNcf8AfYP9K3blC3wo8AXCxnYsV%2Fbs%2BONwui%2BM%2FR8%2FnXPZyflyT0wOa4a7fOz7HKFH6pCy%2FMl2JziWT%2FgSqf8ACgoe0iH6of8AGo84ODwfSl7Vjc9PTt%2BLHYb%2B9H%2F48KQrJ2MR%2FwCBH%2FCmngZPFGRRcN9hT5ufuxn%2FALaY%2FwDZaQGXH%2BrX%2Fv5%2F9agHrz%2BVKDRfyJ17v8P8g%2Fe%2F881%2F7%2Bj%2FAAozLj%2FVJ%2F39%2FwDrUfjRnjoafyC%2F95%2Fh%2FkLH5rOMpEo95D%2FhWv4wubOe00ZLCN0%2Bz2IhmLY%2BeXzHZmB9Du7%2BlYxJH1FT3kb3AtobZDJLJhVVe5NXB9LE1IKVNyben%2FDHn%2BrnOoTfh%2FIUVJr8ElrrV7bzjEsErROAc4ZTtP6iivSjsj87ru9ST82fZvwH06yu%2FgX4at720t7q3mS5eSOeMOrH7TJyQfoOevFdlqMNl4Y0Ez6Nplhb%2BW20RpAFXA9SuCT%2BNFFO3USlK3LfQp6DPb%2BLdPJ1rS9NmUjlTbhx%2FwCPZP61Vk%2BFfgu9ZpX0OKI56QzSop%2FANRRQ4xlui44irS0pza9G0X9K8DeFdOmRLTw%2FpysDjfJF5rfm%2Ba6cWNuoESwQiPH3fJTH5YxRRQopbEurOprOTb82c9r%2FAIF8MatMsd%2Fotk7MAfNjj8l%2F%2B%2Bk21z118CPCBlRo31SIMfupcjH6qTRRUThF6tHdgsTWTcVN29WXY%2FhL4M0ogDSBdsB9%2B6mdz%2BQIH6VZm8BeEbmJYpPDWmKrdTHGUYfiCDRRVKnG2xy1MZiHNv2j%2B9mVD8EfB8etrc%2BTevCi7%2Fsj3GYifQ8bse26uZ8X%2BF9J0zXRLp9qlu91qNsG8sBQivIqsqADCrjPA9aKKzUIrZdTtniKspK838Pdnyj4zx%2Fwl%2Bt4AA%2B2zcDt85ooorRbHm1Pjfqf%2F9k%3D" /><h4>Enable automation on iOS device to automatically enable battery saving mode on 50%</h4></div><div class="bookmark__right-side"><q>The easiest iOS Shortcuts Automation you can write: when your battery is low, automatically turn on low power mode. Since doing this I've never run out of battery before the end of the day.</q><div class="bookmark__comment"><p>Why is this not a default option?</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://twitter.com/searls/status/1551217146281222145/photo/1">Enable automation on iOS device to automatically enable battery saving mode on 50%<br /><small class="text-muted">twitter.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABJGQEA6AMAAEkZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVKKKKACiiigAooooAKKKKALNlY3N80i2cLzNGnmMqDJC5Azjv1FVyCCQRgjgg1v%2BCdWttG1Sa6uy%2BzyGQBBks2VIH6VD4q1hNa1Np4YEhiHC%2FIA7e7EdTWKnP2rhy%2B73MlOftOW2ncxaKKK2NQooooAKKKKACiiigAooooAKKKKACtTVb63u7DTI4oik9vEY5W2gBueMY68Vl1p6jd2k2k6Zb20W2eBZPOfYBvLNkc98D1rOa96Lt%2FViJLVaf1YzKKKK0LCiiigAooooAKKKKACiiigAooooAK1PENxZXF8h02MJbxwpGCE2liBySPXNRaE9pHq9q%2BpZNoj7pBt3Zx0GO4ziqtzIstzLIkaxo7lgi9FBPQVnvP0%2FUjefoRUUUVoWFFFFABRRRQAUUUUAFFaSaHqsluk8en3TxP90rETn3wO3NUriCW3k8u4ikikHO11Kn8jUqcZaJkqUXomRU5FZ2CopZj0AGSav6Jpp1W5lgSXy3WF5V%2BXO4qM7fbPrVK3nltp0mt5GjlQ5VlOCDRzJtpboOa7aW5ow3Flb6FdW725fUpZVG50GIkHPynqCTwayqtIl3qd63lpLc3MpLkKpZmPUninwaZdTWMt4EVLaI7S8jhct%2FdGTyfYVK5YXu9WJWju9ylVvTrCfUJJUtgpaOJpSCcZCjJx71ftfD09xpBvlmhUlJJUiOdzpHgOc9BjI4PWtfwHpV3FrFre3CiC1IwPN487erABR36E%2FQZrOriIxhKUXqvzM6laMYSaeqLPgnw3per6Q9xemTzlmZDiTaAAAf60VhTzXnh27udPbcuyQkHOAw7EfUAUVx1KFepJzpz0exzTpVpycoT0ZHr2nQ2dppVxaljHdWwdiTn94PvY%2FSsau0srJL7QNEt7xXXy9Ta2KnhgrcsPbkVYi0a1006Tcz2HnP5rwzwlwWBZj5JYE46euB0reOKUFyy1ev6mqxCguV6vX9TnPDFlBf3N5DcJvYWkrwgEj94BkdOvfis65s7m1WJrmCWESDKF1K7h6jNd%2B1wnh%2FVLWc34T7TcAXNtLFDvVcY3kpkKBxwMfzrhNXmefUbgvcvdBXZVldixZQTg5Paqo1ZVJtr4WVSqSnJvodvotrq%2Bt%2BF7Vo7%2B4t3iuX%2FfGR8tHgdMctg5AFZ2olNc8Q6ZpM0l0sMCtGZ512zSnBPQ4xkgAZ9aw9N1iSx0m%2Bs0Em%2Bdo2jkWQqYipySPr0qSbxPqs9mba4uBMnG1pI1LofUNjOffrWSw9RTbVutvK%2FXzM1QmpNq3W3lfqbujaZHpni2Ga2kItIYlefzzzCZAU8tscbskcf4VNBpVqdFvNOiht5r%2BAyxOhCpLv3%2FACS72I%2BQL2FcnqOt6jqMCQ3t08sSHIUgDJxjJwOT7mqMsjyyNJK7O7HJZjkk%2B5q%2Fq9SVnKWun4fd3ZXsJy1lLXT8Pu7s73TbzR%2FD2myzWN4k11FIVkAOWnYLgBfSPcSc98CqsfiHTbW7ugs13LYSuLiO3EEbKrtkup3jI5xyPf61xNbPh3QpdaebbMkEUW0F3BOWY4VcD1NKeGpwTnUbCVCEU5TZabxQ2byFbGD%2Bzbhw4tCSFQ8dCuDzgEjpUE3ijU5IJ4hJHGkrlvkQAoCoXav90YAHHPvU%2Bk6XbQw63LqMP2mXTtqiJZCqsSxUnI5wMVf1awsINHvo7cRR7lgv7TeR5hR%2FlZMnkgYzii9GMuVRvt%2Bn%2BaFekpWUf60%2F4BydxczXPl%2FaJXk8tBGm452qOgHtRUNFdqVtjsStsa2qeIdS1NrZrq4Obc7kKKEw397jvxVGa9upjOZbiZzOQZcuTvI6Z9cVXoqY04RVoqxMYRirJBVi2s7i6jne3iaRYE8yQj%2BFfWq9aGh6nLpOox3UQDAfLIh6Oh6qac3JRfLuErpe7uSHT4V8NDUHdvPe68lEHTaFyT%2BZFZgBJAAyTXfXQ0myfQ08yN9PmNxMhlTese%2FGzcuedp4P0pI5tC0bV7meQWshmcyW6wESpBs5ViRyCzDoOgrjjinZ%2B63e9vvtY5Y4h22b3%2FM4yTTr2OGWaS1nSKJgkjMhAUnsc9%2BR%2Bda8fhqa9vZltCttbhYmQ3coy3mD5QCowSTmrWleJrZdOkh1uBr9g7OiNEhBLcklzyDknnBqGDxbPAYfLtLdljhjiCSZZcxsSjDuCM469qqUq7uorVfcVKVZ3SRLD4XUaHNNcTEai0cksMK9NsZw4PHJ%2BlZfhiZrfVUkjubS3lCnY90pKAnjsODgkgniojreomWCT7U4eAuY2AAKlyS355NZtaRpzcZKo73%2FAK%2Fy%2FEuMJtNTe52F1rWmWeu6lNbxNcxTgQOiYWOZSv7xvY7sEY9%2FWs%2B%2F8QLJdK1paRi3SyFkqT%2FOdvrnjnNc%2FRRHDQjruONCC8woooroNgooooAKKKKAFyeOelJRRQAUUUUAFFFFABRRRQAUUUUAf%2F%2FZ" /><h4>Hemingway Editor</h4></div><div class="bookmark__right-side"><div class="bookmark__comment"><p>Check your readability and get feedback on better word choices and grammar.</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://hemingwayapp.com">Hemingway Editor<br /><small class="text-muted">hemingwayapp.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAPJbfXL6wM1013eWccujad5FrdgSGHdPJG8jO%2BCdoKlpGHAdS44C1raF4l1O8axe6uUW0t4tQlvGS33PKLedUjAOABuRt3A%2BbgrgGtHx58QtI8I292kssdzqsEC3C2Ak2s6lwoy2CFJ5wDycHFXp%2FHPhq3utQt5tXgSSwSSS4yGwojx5mGxhimRuCklc84piPK%2FHEF9aeII3ubdrieXTLOWdHRnQSSatAzrx%2FdBwPQKO1UvE%2FirxNqeieNLH%2B0rky2qPOGsbFlWBEu9hj3fLIrGPBKspJCswbbwfXG%2BIHhYWN1d%2F21bGG2uFtJMBi3msMqqrjcxI5G0HIBI4Fb%2BlahZ6tp1vf6bcxXVncIJIpom3K6nuDRcLHkZ8aeJT42isIbyCSyBiWFGtTm9t2tfMa6Uqhwd%2FuEGNpGTmsm78R%2BJr3RNPh1todRi1LTdJ1QxmwMYt5WvrdHTg88MW55BXIwOK99xRRcLHiV9408XWFs2oPdwSQTpraJA9gQsBtGlMMjMDk5CAEcAgjHPJ3vhtrWt6lYatcx3dtrF%2Bb1Q1veXpga0h8lNgZEhIVi284C4IIOScivRtRsbXU7Cey1C3iubSdDHLDKoZHU9QQetVdE0LTNDjmTSrOK385g8rLktIQMAsxJJwBgZPAouBpLnA3AA98HNLRRSGFFFFABRRRQB514l%2BGUeqXOqf2dq0ul2OpWtvb3FpDbRsn7g5iKE%2FdAHBUdeMYqlefCC0uH1tF1MpbX8d4sS%2FY42kga5OZD5h%2BZgDnA44OCTgV6lRTuKxwWsfD1rzxBc65ZazNZam1xb3Nu4t0kWFooZISCp%2B%2BGSVs9CDjBrpPB3h%2BDwv4bs9ItppZ0gDs0suN0ju7O7EDgZZmOBwOlbNFK4wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorLt9W828jjMO2KUlY33ZJ%2B9gkY4B2NjknjkDNS6dqkN%2FPcRQrIrQnkuBhhuZdwwem5GHODx7igC%2FRRVTUr0WUAcRSTSO2yOOMcsxBwMnhenUkCgC3RWRfa%2FZ2WlwahKs5tpjgHyyCowTkg44wD9eMZzWuKACioruVoLWaVInmaNGcRp95yBnaPc9KoQazDLp8975UwgjfYnAzL0%2B7z%2FeO3nHIPagDUoqCxukvLVJ4gyq2flYYKkHBB9wQRU9ABRRRQAUUUUAVY7C2juTOkeJMkj5iQpPUgZwCe5A5qhFfWdpcTBLGSGSRy0rxw8MefmJHXpWzRQBSsNRS8cqsNxGQu797Ht7kf0qxc28N1H5dzDHNHkHbIoYZHQ4NS0UAZmqrb29nbxtYJcQo6rHEFGEwDtwMe2BTrbVo7iVI1guV3OU3NHhQQCevpx1rRooAKo3EEFppUkENmkkAUr9nVflYE8jH41eooAyE1OG2RYYrG5SGJWX93FhV2joPy%2FkO9asbh0VgCAwB5GDTqKACiiigAooooA%2BOdi%2BlGxfSiivuz48Ni%2BlGxfSiigA2L6UbF9KKKADYvpRsX0oooANi%2BlV9i%2BlFFc2I6GlMNi%2BlGxfSiiuY0DYvpRRRQB%2F%2F2Q%3D%3D" /><h4>GitHub - DanEEStar/listening-history-deno</h4></div><div class="bookmark__right-side"><div class="bookmark__comment"><p>This project uses deno to make a copy of the Spotify listening history to a Postgres DB Setup Create a Postgres DB (tested with Supabase)</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/DanEEStar/listening-history-deno">GitHub - DanEEStar/listening-history-deno<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BqaKKKACiiigAooooAKKKKACiiigAooooAKKKKAOFXx4y%2BLINKnttOEM989gnlaistyjqrsHeJV2qp2HjfuG5cgZIFXxd4vudAtvEHiGK2nvrLTmi0%2BK3SQrEZSwMszkA4Vd6qTg42P61oQ%2BALeG5s2j1jVRa2WoNqNrabovKikZ3Zx9zcyt5jj5iSA3BBANaV54UtrjwwNFjv8AU7VQ%2Fmi8tbkxXAk3ly%2B4DBJYkkEEHJ4p6COLg%2BKl3Polk1ppWm6hq9%2FqZ0yySw1VJrWYiPeZTKF3IoGcqyBumBg5oPxVvIrKCObw6f7aTXV0G6sUvAQsjRM6OkhUBlbA64xznpzpN8J9HeyuBLqOrvqs%2BoLqZ1YSolylwqbAy7UCAbcjbtwc89qzdb%2BFSjTtFstHu7iVk19NX1K9u7oi5nOxlLq6rw4yu0DaBijQNSG%2F%2BK%2BpaTp%2FiCPWPDkcGsaPc2sMqR3hktljuM7J2lCZVFwd3y%2Bnrx2vw98TS%2BKtDkvporBGjuHgD2F%2Bl5BKFxh0dcEA5%2B6wVh3HSsiz%2BGNjbWmp7dd8RNqmoXEVzNqv2wLdbohiNcqoQoASNpUg55HTG54M8J2fhSC%2FW1uLu7ub%2B6a8u7q6ZTJNKwAJIVVUDAHAAo0DU6KiiikMKKKKACiiigAooooAy212yHKu7rsLhlQlSAcdfrxz3p41myaNJI5GkjaTytyIxAbbu9O%2Fb1JFWDp9mSpNpb5XofLHFKbG1MZjNtCYy28rsGN2MZx64p6AVW1qzAJR3kwjv8qHogO7GepBGMDoeDTodYs5QcSMrCMysrIQVUdSeOnb6g%2BlTpYWiElLaBSRtOIxyMYx%2BVOSztkMhW3hUyAh8IPmB65o0AqnWrAAFp9uTt%2BZGU559R7H8Rikk1zT4%2FvTkNjO3y23fe24xjOc9utWZLC0lYGS1gcjoWjB%2FwA9TUV1pNjdbjNaxFmOSyjax%2FEc0aARtrdigO6VgQ2zbsYktnGBgcnkdPWnT6xYQStHNcBHVipDKeoGT26cjnpUlzplncRqktvHtVt42%2FLz65H0FSNY2jStK1tAZGOSxQZJxjr9KNAKtxrdjArGSSQOATs8pg3C7sYI64I%2FMetW7S6iu0ZoSxCttYMpUg%2BmDTRYWgRFFrAFTlR5YwOMfy4qS3tobcMLeKOIMckIoGT0zSAlooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAorKvNZW3vxbLbTy4KhmRSeW%2Fu%2BuByemAeM9Ktm9QaoLExy%2BYYfOD7fkI3bSM%2BvI49xQBaooooAKKxr7XorO8lhkjBWJlVsSLv5XdkJ1IHr7H0p%2Bq63FpskyS211IIoDcM0SqRtHXvkfj1wcZINAGtRSIwZQw6EZFLQAUUVnW%2BrRTai9osU4wWVZGQ7WZfvD1AGV5OAc8ZoA0aKwbnxRYWk7R3aXECrK0JkkQBdwZFHfuZFx65reFABRWNrOs3Gn3SRQaPqF8rIGMluFKg5IxyRzx%2BtFOwrly90uxvZA93axTOABl1z0II%2FIgGo728itbsM9q8kgUDeibmCknP4ZC8e4rRopDMpdYV43kW1uQqhCQybT8zY6frV%2BzuFuoBLGHVSSMMMHg4%2FpU1FAEFxZ29x%2Fr4IpDlTllB%2B6cr%2BR5FZGpjT%2Ft05u9KiuGZVEkgiDswAyN3HQcgc9c1vUUAZZ1iFFX%2FR7rnoBF0H9OnSk%2FtqPaW%2By3hAG44j7f5%2FzxWrRQA2NhJGrAEBgDyMGoY7K1juXuY7eFbhwQ0qoAzZxnJ6noPyFWKKAMCa6smnkS60rfmRk3CEPuJ4JPHcKufwrYsp1uYBIiPGMldrjBGDj%2BlT0UAFFFFAHyngUYFFFfdH4wGBRgUUUAGBRgUUUAGBRgUUUAGBRgUUUAGBRgUUUAGBRRRQB%2F%2F9k%3D" /><h4>GitHub - mozilla/sops: Simple and flexible tool for managing secrets</h4></div><div class="bookmark__right-side"><q>Simple and flexible tool for managing secrets. </q><div class="bookmark__comment"><p>An Abstraction to specific tools like Ansible-Vault or Rails credentials.enc.yml</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://github.com/mozilla/sops">GitHub - mozilla/sops<br /><small class="text-muted">github.com</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABJGQEA6AMAAEkZAQDoAwAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2BVcUYpcUYp2CwmKMUuKMUWATFGKXFGKLDsJRWuL6yCBRDjAxnb%2F9erlneaQq5uovNJHTBTb%2BXWmlchytuc5RXU3F5ockIWCMwS7s7zucbfTGOvvWfJf2TbNkATaoUkJncRn5jk8E%2Bg44pWsCknsY1Fa3220%2FuH%2Fv2KPttp%2FcP%2FfsUDMmitb7baf3D%2F37FFAGXRTqStLFiYopaWiwDaKdSUWAjop4jYxl1BIB5wDx07%2FjSMjqAWVgD6isiRtFFFABRRRQAUUUUATUV1tt4B1u4uNYto1t%2Ftmm6jFpTW7SYee6kkdFjjyME%2Fu3YkkAKM1oP8NLt7XV5tO8Q%2BHNSOkW0l1fRWl27PEqAZxuQCTJONyFlz1IyM73RehwVFeiy%2FCXWU1%2Bz0NNU0KXWbtHlis47slwi25nDP8ALhAyjA3EHJBICndWRrHga5sdCutX0%2FV9H1qys5VhvTpszubUscKXDouUY%2FKHXKk8Z6UXQHI0UtFVYCa1uLqOPy7We7VN4fbGSBuGCDgHqOOafdXN9djy7ue9n58zbIWbnpnk%2B2KuaBEjRhjFuk81VBF8sDckDAU89yM9s5PAqyioLm6RkUKuUCtqijA4OM%2Fxckn0yfY1zEGCLdyCRFMQDgnZ3pjoEYq4dWHYjFdNPHDFOEiWGJHm2tjVQ6kbScEj3wd3TPHesbW%2FIF3sgiVCo%2BZlufPDZ5%2B8OOOnFAFH5PVvyo%2BT1b8qZRQA%2FwCT1b8qKZRQB7bf%2FFq1g1PwjqWlW08lzb3aarrccoCrcXYhjt22H02JIwJzhpm%2BlZui6l4G8LWPiZtJ1fWtQn1fR7mwtYptOWEW2%2FaQJWEh3N8oGVG0cnuAPLqK6fZovlPZdG1%2FSvEnx9l1eFLuXSZNLuFdAojlZY9KaNwMkgHKNj8K5W61DwxoHhLWrDw9qOo6ve63FBA73NkLVLSFJVlII3vvkLIg4%2BUDccnIriba4ntZfNtZpYZdrJvjcqdrKVYZHYgkEdwSKip8gWG0U6iqsUQqI%2FJYszCUEbRjgio6u2tvLNC8n%2Bk%2BWobLJGWUYGeT2%2FpXtw8GaEGVBpFyRtHziQ7fu59fwp4PAVMZf2bWlt%2FP5PseTj8zo4Dl9qm%2Ba%2B1ulu7Xc8Eor39PBOhNj%2FiU3OM4%2B%2B3%2BNWU8B%2BHyQDpF0fo7f412SyPER3lH73%2FkeW%2BKsFHeMvuX%2FwAkfO9FfSKfD7w4Rk6Pdnp%2Fy0b%2FABrmvih4Q0XQvD9pc6fZNBNLcKh8yRm44OMHvXJWwFSjFyk1p6%2F5F4XibB4qvHDwUuaW10rfmeJ0V3kFjpzQxtImpF2UFvLtEK59jnke9FcVj6G5x1FLRXfY3EopaKLAJRS0dqLASWl%2FHDYvbSxSyBmLDE7KozgH5RwTgdf8K7O21RjBH9o1nWUlwNwjO5fwJcdq4W3uDFbzICvzDGDErZz15PT6iutglsRCgmsppJAmGZbnaCc9cbTjj9a4oTlH4XY5Z04z%2BJXL7atIGTy9b1kgk7izFcDHGAHOecelJ%2FbFyMbdd1j%2FAL7Ydj%2FteuP1rPaS0LyEW0qgj5QJs7eBzkjnnJ%2FGgPZbCDbXG%2FHB88Yz9NtX7Wf8zM%2Fq9L%2BRfcjTGtXQOP8AhINZA9d7f%2FF1j6xqt%2FdWR%2B23t3dJGwdUmmZwDkcjJODiplkshndaznnjE%2BOMf7vrVDU3QQTvApVBgqrkPjkdeMH8qlyk92ONClF3jFJ%2BiKy%2BIJVAVTcBRwAJjgUVmi9n9Iv%2B%2FS%2F4UVFzaw%2Bilor0rHRYSiloosFhKOxpaKLBYS0tZJ4HlZbvyVDZeOIuowM8nI%2FH061uRa%2FbQRpFJY2kjRjaTJCSSfchhk9s1hbZBD5QmkEWS2zPGTwTj8BUZgySS5JPU1xexn2MnBm7%2Fbtr8%2BbWA7v%2BmJG3gDjB9s%2FWlbXbRgR9ktwT3ERBH%2Fj1YP2cf3j%2BVH2cf3j%2BVHsZ9hezZvNr1oc4s7Zc%2BkJ9c92qjqGpQTwzCNSjP0VVwo5HvWf9nH94%2FlR9nH94%2FlR7GfYORkG9%2FwC8350VP9nH94%2FlRS9hPsPkZPRRRXomwUUUUAFFFFABRRRQMKKKKACiiigAooooA%2F%2FZ" /><h4>Warp: The terminal for the 21st century</h4></div><div class="bookmark__right-side"><q>Warp is a blazingly fast, rust-based terminal reimagined from the ground up to work like a modern app.</q><div class="bookmark__comment"><p>Very nice console alternative with modern UI upgrades like command/output grouping, modal auto completion</p>
</div></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://www.warp.dev">Warp<br /><small class="text-muted">www.warp.dev</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8Aj83jqD3q%2FoF1Ha35edco0TrkHGCQQKqLp940ixi2m8xj8qlMZqW30rUJpzDHZ3G8dQ0ZHT6ivYfK1a55qutUjpHgVhAsWCMAlgwOCfeurv8AwlJc2FsZpkXaoYNmuQsNI1XTrZLt7OWSNnAaJVLHA71o6h4j%2B26TJBG11GVOSuPufpXG6Tb0eh1Kore8tTD8SRCy1Z4kmScgA5Q8A46V1fhyHTr3TLa1eTMtyCjBOsbc8mvP23FmZsnJ%2FwAmtPQLyXTLpbuJ1UhwGUjJI9q6Z07xsYQqe8WvFPhG602ViqmSAKW81OR%2BNedXmUc5r6HvtSimsJkRRI867VCjIBI6GvGda0KeG5ZZF2kngYrj1eh1O25y8Jy%2BSelaqXCssYkXIFbOl%2BGEupvJMhVvU9K6bR%2Fh59rmMckpUg8AjqKG7CSbOb0%2B9NtErxL%2BNd14C8Q2tveN9ocIzjG%2F0NYvijw7BoZW2Eu8kZPGMVU0Tw3d34EtsR9nBwzEip3Hszub77RFdybmLlzv3R4KnPTn6YootNBuo7dFbUIojj7rNzRSTQ7Gut2kcWJo0mEQDBwBuH0Ncxr%2FAIvu1uSNLiItiMtvTnP1rBbxVNpcswtGSRH4PmDOBWVN4ku7zeI4EJPZB0qkm9xXR6p4a1u41OyVrjNtMpzkjAdfxplzY6I1zJMkqxXUw2syD5T%2BB715%2BNS1GW0glugUaIFY8fKBUU2rGWGG4Z%2F30fyuB6dj9aIprYTaZunwlb3LSmw1WB3jbLq5C8Z5Az3rPl02806F57GJp7SQENIE3lCDzk%2BnvWTFeGZpMg737qcVv2q3lnpsPlTyLBI25QDn5vTFbqq46MydNPYr6b4iv9OtxsgV1z95kP5Vmahqst%2F5nnAbnbdkdR7V06avMYczzwGccRoUUfmMVWWz03XYJLgv9k1FATJGMBHI7%2FlVxnFy1RMoSS0ZW0rW1soJZorESzcL5h%2B6P%2Fr11XhPVzqMs91dkx%2BVHmRl4B7ACuBHEhjhkKxDjn17103hy70m3t3F3MUkkBVolB24%2BvvTqwVroVObT1F1KKHXLuR5pG8lQdkm4ZJ7DFa728OgaVFHaIzTBN%2FUkZPr71zGpTWlsnnW1wGuAfkiTlRzWpoNzam3bUtWuXZ5AUWANwvGM1zeydrs6PaJuyOeuNdned2uHXzCe56UUy8sdMa5dlmKqxyB1xRU8oXL0drpd1K7S20kpOW2gcnP0qlJYrEJZIIjEy9F284rdkt4JLE3dngXGcEQE7TVeGyuZ2QxbpZCuWH932JrTli3oZ80luZltJbPpjR3ccxwevOBUEK6cUZWiJHRTmuhubK7tLTzo1SY52yQrg4X1%2BtcpqULzztLFp15GjHjy0JH8qgu5HJY4y8EgDdcetbWmWd%2B9rA0kE4jZtqM2cAnjpXOCLUhLtht7lmXsYW4%2FSuw8KXesTRGynEiKzBlEqEAYOepol3COpUl0ua01BBIqXDsSpYcEN6Yq5eaa8FoY2sZluXI2umSB9cV0NzcwLqkEc0BM6HmRFO3p1pbyZZZYA97sKvlgTgFTwQfwpxlZ3CUbq1zkjoN8Qu1I3LDosin8etU7vT57SYx3CANjjawYEfXpWj4rWzj1CMafLLGiociJyQc5pPDE1nPJNBfvI%2BRlCynAOO3vXUq73ZzOklsY5g68Y9637PUbeysVW3gSP5gZGkGS5%2FH%2BlXZbPSv3UUd27DlmGM5Pp04qd7GxubJUlKqQdy7P4frSq1FNaDpxcXqVm8QhT%2B9soS55JRFwfzorIfRDI7NFenbn%2B4TRXPoa6nL6n8R9K8O6W50C4XURI%2BxQ42hH6hiOCR0rT8FePLjxFbxS3ka28yMQVhGNw%2FvY%2FOvmi7ljGPLXAHatPTNZvbJT9ikeJNm18Hkg9v%2FANVcirO92W10PrWTVLKz2zRXEIMrZkaRug9fQfjVoeI0YIlrdWU6OCwCyoG2j%2BLrXyBdeIbzZLFHPKqzf6wFsgjGMc1ShuZojlJ5VYpt%2BVz09KbqdQufUF74s022vpd%2Bs2wkU4aPdllP4Vv2fiM3Vn9pMsccUSFzKCChUe9fHcjiRWcsVfqWBzux6mrFv4hv4rJ7SO7lW3cEFNxxVKpdbBc%2BnZ%2FiH4Y1m4WI60ltLCTtZYzg4GTzjmuntJrS%2FsGnHl3MbphJ0OVlHqMd%2B1fFgvGiwyIhOCMEcY9PxresvGGtWNlHBa38kCbduxeABnPGelUpaCPqQeHraUEJDIrkZVnJ3fl6VGuh3hkEcc4iC8hVXJr5kXx14itLR4bfWbtRIc8kE9c8Ej9KcPiB4rm2ebrE7BDxkKpPHfiq9q0KyPp238PyRzmWecsc5JHBrWa2gCB2Vhu9Dx0r4%2BtvFet2N4bmHUbtZuTuZyw69MHirmqePde1Yp9t1OchAAvl%2FJj8qHWZPLqfWcUEGzlJQR1CHiivkWDxNqsKFYtXulUnOBJ%2FjRU%2B1ZfKjOsdOkvbaWdm%2BXBAIIwDjvVSaKe3GASwHRgMfpXoa6XD9oaOPIRxn5cDJxVyLw%2FZFl3q5%2BUrlvftXmxrO%2BpVjy2RJZgHUAnHQnFaEMFt5SrPIVeRfvZGF9jXpkHhDSQAfswaTOPvn%2FGrv%2FCH6QoG%2B0X8WNdMKlwskeLOhUlVwUBIBzya0La1sY40aS63yMQpQjhQeufXg9q9bXwxowHFihA4PJ%2FxpreFNGcbhYxgD0J6%2FnVKV9Qujxu6tB9qZLdl%2Bzbvl9cetE9oHbIkyw6Y7V6xP4O0lgQkLx5PUNWRqPgdPvWtwV44D9P0pOTEcOkNhHAiTG5e4zk7F%2BX9RVC9EjnaEkH93jFdDeaVJZknzwwzg45H51XLtv6jGOAeal1bPVCsYUQnZjGyNnuD3%2BlWDp8giysch9cGtqK98lCZcEKcABQcVYjuoblSygEflTVVDucs1nOD8kT49yKK6dkgz0Ye2aKftkLmOhS%2BY3RUD7pHTsfStR9VlEWVUE7umO%2FrXP6UFluC0YY7SQxI61dld5JsKvVsYFebNuLNDWXUZEd2Qn5k5xzzS32qXFxHbomVAcMx%2BlZyROs7EdCPWp3k%2BXacdOPes1XlF2Q0iT%2B25YLdgCxyW5xmiLX5GeM7tscgPHpxVRVCpJvIPPSovKjKsrKDnjjtWkcS0hNG6uuITOCy%2Fu4%2BTnvWNqmuSyiM2zE7wFOBxiqk1lCd0WXJkHY9B0pFt%2FJQrH9xBx6itniGkLl1MqJZ381bgMqZOE6gn2rMbCSMpxwcda6e2tbgMpLKynLDJ60raZbm4kkZVZmA%2FA1k66HY5tbWKQ8qck9jxUsdp5UZeFcrnGQc81v2tnBGZOcBjxn%2BGnrA0YESBHiOS2ODS%2BsK9hcpgeUSASvJ9aK22ht87XOdvA%2BlFWqouVFbSRiRSCc7j39q0c7VcDuc0UVnWL6ESXEgVRu6g1dRi4IbHTNFFc0twQp5QnuBUFqvPmHlsk0UVrTWodRGAN6Wxz%2F9aoYJGNywPTpRRXTNaIt7jo%2BZpBk4UAD86kl5lY%2BnI%2FKiiuVr3hDNRYmBjxkrnimD5YFwT9zNFFE1qJnOTTyCQ4aiiiutJWMj%2F9k%3D" /><h4>ThumbHash: A very compact representation of an image placeholder</h4></div><div class="bookmark__right-side"><q>
A very compact representation of an image placeholder.
Store it inline with your data and show it while the real image is loading for a smoother loading experience.
It's similar to BlurHash but with the following advantages:
</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://evanw.github.io/thumbhash/">ThumbHash<br /><small class="text-muted">evanw.github.io</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QC8RXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP%2F%2FAAACoAQAAQAAAGQAAAADoAQAAQAAAGQAAAAAAAAA%2F9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko%2F9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo%2F8AAEQgAZABkAwEiAAIRAQMRAf%2FEAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC%2F%2FEALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29%2Fj5%2Bv%2FEAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC%2F%2FEALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5%2Bjp6vLz9PX29%2Fj5%2Bv%2FaAAwDAQACEQMRAD8A%2Bd7cfOR7V0vgqIyeJLZQM%2FJL%2FwCgGubswWk4BI%2Bldn4B04X%2FAIihiZnVTG7Fo22kYU96m9mmaNXgz1jw9ZAWwHAJm%2FoK5vXLT%2FiqNWyOm0%2FyrYsdK1a2klGnaxOixudqzRCVaxdYu76x1Wc30cF1NLHh3hynTvg960UtbnJybpM861mPbp9lx1g%2F9mrHtLN7pnCFQVx944re1plaxtUX70URRs%2Boc%2F0qloZRJ5hJ0baBSbsrnQld2ZWbSLkdAh%2BjVVmtngbbIADjPWu7L6esrKw%2BYqwTPAzgEE%2B3WuY1%2BOJL3bA%2B9Ag5Hrjn9aUZXHOKiZcMRcgYX8a6LRNCmu4xP5WYBIIi46Bj0FUtFspbpsRoCqgFnb7qfX%2FCuw0%2FVbbTLM2zSyzJJIJGES4QNzzk88c9qznKSWhrCMXuWG8Gy%2F2m1lHEPORSxUjB4GTWTeeH5LaDc6EAnOSOvNdRp%2BsWmoSGa2ubk3KjLRSAiRl6Ha3f09frWhqerwalZGKIRslpiLbuGQSxJ%2FXPFcftpqSTR1KjFxucFdeGLuNoyIW2ugdeOxor0c63p7RQpeRF5I41jGHIwB0FFaKtO2xhKCTseMacAsm1GZQrcgdBXrPwjtbbUNejlEXl3EKOjHB%2Fegg4yOgYYP4Vwfh9fLt3%2BwvbLebvl89Nyn29vxr1XwA66Ldx3%2Bo3Nq8UFq9w%2FkRBMMw2HB75PQe1VWlqn5mkKf7uS8mdtb6WYjdtwMuTj8K838VwiPWJmm2qoTvwK2NW%2BLWngywaTZyyzsxHmTsFVAD8xIHt0968r8S%2BILi6u5Ha4adcnKzDcrj3HT8q3hUVrHAsNPmuzI1UArJtZWGTyDkferKizG5wcHcOfwrsNX0cL4fstRt1RY5k2yxo5fy36g89Aw6DnGCK5lLdjLwoIPPNXF8yujSS5ZWYGfuT8wyeelU3Jfk%2B9epQ%2BDJNP8OSag0EE86D5lkPzbschExghenXJOccDngZpobiZE2Abzjd6E9CPb2pKa6FODaJQ8lvoVpMm4W%2FmGM4yMyYBP6EVj3k5EzchTu%2BZfWun0yJxoGrxzgPBCI5ETPHmeYuT%2F3yP1rL1XT31GKS5gVA3mEqinGUIBA%2BooHZ20IPD97L%2Fblo6OdxlX8Oa7TWr%2B2hMkb4WV8uyR4OD7%2B%2FSuM8J2Ny2twr5TBhuwSP4sED%2BdegeN4RPplvHFZJZJa7Yo1LIzSgfLvZgAffmsZpc%2BppC8o2OSN5buciUx9trDn9KKx7%2BFYLp4i4JXHbHbNFaKNyG0nZli3juY7uf7OGaNIzLLtONqDqc5Fdlp2l39za32kafE7eVHG7W0m3dJtG5wOcZ3Et1Gfxri9IvLp8SxSjy1Xy3XruB7kd%2B35V1fgXU30rW5GldpCW2OXOS6n1J77T%2BlRWjZc%2FY0o1eZ%2BzS1ZyGrR3dreFbqCS2kZchGXb8h6bfan29kJ7a2lR2YPjzR2HzEYx14Ar33xt4R0zX%2FDUbzzray2Ify5yQNqEnCn2yRXkK6PPYata2FqYmmMeWdm%2BXGMk5HYe1VF3WhCkm3c1w4l0yW1trm2SLCnCkg5Hfnrgds%2BvWsmxtGcBlkSKQkDzD91CeM%2Fh1rVttGuLeKdt0UjyYC%2BWcqRnknpjkCsOXUZXufstoDI0jjfiMsTz6DkCtKcWkzKvOMnGx22tTztHZQnXNRjW5ILDkJF5akMPoxIJ%2FwDr1569kh1NfIk8yASY8zbt3HqcCtbxFexyxyFzGhtyuwMcsCeOccds98Y96qaJdx7kjBRpt2UGc4yCDWKTSR1KUSxPBFHayxQLmeVGUkJ8xzk4zn6cVTsWitNJWEXAkun%2BeUZGEJ%2FhB57AfU10Y1Gw063YWe1pyP3lwfvMPRcjhf5964zW9QS8lLMeexwAR%2BVdNOPItdzhq1HVdloine3e7jaMjvgVo2GpXV9pwsd7SXEZzCG6uvdQT3HUevI9K5maYhzkkj6UyObawIJpTipIqnNwZ3B8HazegXENq2xxnLnBJ7nmim6d4z1KG1VDdS8f7VFYrnWhpKzd0czotx5dyUJ%2BWVdp%2Bvath7nbqAdSRuRTx65x%2FhXOaarTXcMcaNI24MVU4O0Hk57cd66LVLe3gtfNEjefnYiAEYXPUnoelVJrl5WFNNTU10PaJdWLaSkEgDtOoeXnp3A%2Fr%2BNcLeQCxil1KwXNsB5c8ROXgBIIkXHVM4zxxS3mqLGrK5wZMg%2BwD7cfpWFdam1rOGic%2BYvzEZ4IPVT7EcYqJRa1REGr2ZO9%2FfXFxaW8To6eYo8t243M3UDoetbsWr2%2BnW0VpYwy%2FZwxA%2BzqC0jA%2Fff1zyfYcCuTsjb%2FAG%2BL7M5WHymmg%2BbkfK37v6qwOPp9KLG%2BVJlMq7grMMf8CrWNnquoTeijLoZt3bvKGXO5QSAfUZqfw7Zrai%2BuXHzJGI48DoWzn%2Fx0EfjWw9hbC1lljvIvMQF2iR8ke2BWXdTGCwITcyvISSE9BjnHbk0U3d6bF1YpRu9zMvrkq7YYqrHpnge4%2FwA81mNJuHJxUV1OTwWyCc1X8wkg1oc5LM2Wpq9aZnJyelOU96AJwzAYBopq5IooGb2makLfTjDb7IVbl9oAZvXJ6ke2aTU2m8mJ5LeWOJ2yHKYVh9cVzanselW97eSp3McdixrPlvubc7irI6bVrv8A09MnhN5I%2Bjuf5kVl3lwFUxMA8rjc5%2Fu59ajvpd1y8hPSRv15qlgmN5O7NliardGWzuWYblltIAhPmI5KY65OCMe%2BRXS6ctpplvPcapDFcXzuRFbudyQj%2B86g8t6A8Dqck8cvpk62cP2gsTNyqdjGOm4epqJJHmkY9F74P6Ucttg5rvXY19Qvnlt5zGGVe4XhQPwwP0qpczFNLtEaRTIwZzGDlgCeCfTIxWOynzWxyAas3k5aKBQQuyJQxU9%2Ffn6UQViqsuZFGZyWJNMUnFD9TzSDpVEEqning1GDgUqmgC5CrFOPWikjk2oBiikMmkUMxKoMD0FXoIbU26%2BbGucck8VSjBXfkce1aNsYJLZTdygKM%2FL3NC1MZxa0TKN4YmDGAsQy7ufUHHFU3bdGOflA4FaMsEDpm1kKqCcB%2FwDGsq6ikhbaykBunofoaLGiYyaTPyjpjFWLZwkTZ6c%2FyqqFx19KBJiMimBIpzz60k752gHICjqOhqPzBjJp8wOFwBjaOlGxWrRWY4%2BlIp5pHyDg0gpXCxPnNPX1NQhqepyevFMRZ%2BbtRUkm1NoLHO0E0UAXIbhyWXjB9qqM5MjZx1oooJW4RyNzTJ5nKlScjrRRTGVJGNRsTiiipGR7jzVwk7V%2BlFFItFJmJJJ60A0UUCFzTlY0UUxM1lctGhIXO0dqKKKBn%2F%2FZ" /><h4>Followgraph for Mastodon</h4></div><div class="bookmark__right-side"><q>Find people to follow on Mastodon by expanding your follow graph.</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://followgraph.vercel.app/">Followgraph for Mastodon<br /><small class="text-muted">followgraph.vercel.app</small></a></div></div>
<div class="bookmark"><div class="bookmark__title"><img src="data:image/jpeg;base64,%2F9j%2F4QDgRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAPAAAAcgEyAAIAAAAUAAAAgodpAAQAAAABAAAAlgAAAAAAAABIAAAAAQAAAEgAAAABUGl4ZWxtYXRvciAzLjYAADIwMTc6MDc6MTQgMTc6MDc6ODcAAAWQAAAHAAAABDAyMTCgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGQAAAAA%2F%2BEJ9Gh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOk1vZGlmeURhdGU9IjIwMTctMDctMTRUMTc6MDc6ODciIHhtcDpDcmVhdG9yVG9vbD0iUGl4ZWxtYXRvciAzLjYiPiA8ZGM6c3ViamVjdD4gPHJkZjpCYWcvPiA8L2RjOnN1YmplY3Q%2BIDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY%2BIDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw%2FeHBhY2tldCBlbmQ9InciPz4A%2F%2B0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv%2FbAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP%2FbAEMBBwcHCggKEwoKEygaFhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP%2FAABEIAGQAZAMBIgACEQEDEQH%2FxAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5%2Bjp6vHy8%2FT19vf4%2Bfr%2FxAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv%2FxAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4%2BTl5ufo6ery8%2FT19vf4%2Bfr%2F2gAMAwEAAhEDEQA%2FAPpHxbdarZaDcXGgWkd5qMZQxwOMhwWAbuOxJ69q5nSvE3jB4rlNQ8JqtwlmLiN1nKJJKZNoixhsYHzE5Jx25Fd9RgelAHm1z4x8Ztuht%2FBUsMu6YCV5TKgCSALwAudyhj19CMg1e%2F4S7xA%2BhLdweGJJ7r%2B0n094opSwCIGVpxxynmLgAkcc57V3eB6CvL73R%2FiQkU7R6%2FBK0duoRYljTznyQV%2BZPkJAVt5yASQFPUAFyLxj4thCrfeC5pHSIGVraYkM%2BcZQFeQTjj7w5JG0ZOn4Q1zxLqWsTW2uaIun2sVuHEuG%2BeQv0BzjG3sCTxzjIFY934b8fT2yIPFsamS1ZJwsSoTIzn7jqmUCrgAgZ6%2BoI6fwfp%2Bv6dbzw%2BIdVi1V2lZo5li8tlTgKmAOmATyScnqaAOioqq2o2S3DQNd24nUkNGZBuBChjkZ%2FukH6HNSXF3b20fmXM8USblTc7hRuYhVGT3JIAHcmgCaioJby2ieJJbiFGlk8qMM4Bd8E7R6nAJx7VFJqlhFaLdS3tslqwBErSAJgjI56cjmgC5RVXT9RstSSZ9Pu7e6WGQwyGGQOEcdVOOhGRx71aoAKKKKACiiigAooooA4nWfiXoWi6%2Ff6Xqv2i2%2BxorvcMgZGJEZ2qASxOJVPTs3pzteGfFGneJDf%2F2W7ulpN5Jd12iT5FbcoPJX5gMkDODWjNptjPLJLNZW0kkgCu7xKS4ByATjnB6U%2B3srW2keS3toIpJCWdo4wpYk5JJHXJ5oA5jxB8PPD%2Bu39xfXts%2F26YgtcIwDjCqoHIIK4UHaQRnnGarQfC%2Fw1a6bqdjaW88MGoNE0o84vjynLoF35AAJ6Y5AHpUes%2BIfFmneLbuK30Br%2FQooUZDChEjE7ckMWwcEt8oGePxqzaeIvELaFYy3Ggt%2Faz3v2e6gUOqQxkuVYNg7vlCKWHAL5OADgAZpHwy8PaTq1tqNnHdC4guGuULzl%2FmKBOc88AeuT3Jpsfww8Opp%2BoWQjujbXzRPKhnJGY4vKUj%2FAID1znJAz0rPXxj4wSB7m48GbLaJHeTN0Q52jPC7Pw99pIyCuVh8YeMpY5ivgiTKQ%2BYpe52CUhJGwAVyCSsYAIBBcg4xyAd5p%2BnwWH2kwA7rmZriVmOSznAyT7AAD0AA7VbrgLXxJ4xnh1CWTwytu8C2Zhty5Yyl5cTYfgcR4I4%2BU%2Fe7qCfxF4xew0i4tPDkXmzecbq3lLgqEkULhuNu9N5G5Tg44oA7%2BivLL%2Fxz43s5Y4k8A3d3mJHaSKUY3FQSpHYgkjgnp17AoA9Nurq3tFRrqeOFXdY1MjBQzMcBRnuT2qKDUrK4gWaC7t5IXRXV1kUgq2CpznocjH1FQ%2BINHt9c042ly88QEiSpLBIUkjdGDKynsQRXLN8KfCJyBpgCkYI8wnI5wDnk47Zz0HpQB2f2225%2F0iHhd5%2FeD7vXPXpyKeJ4mjVxIhRjgMGGCfr%2BBrij8K%2FCZYk6dyTz855H93%2Fd9umAPSoNb8H%2BG7bSNO8O3dveSaZf3u23t45toglWGWUlSMMAQj5GTy3TrQB3JvLYbs3EI2nDfOODgHB59CD%2BNSpIkmdjK2CVODnBHUV4NbP8NdQs53fT9WthfIwCvGxkjQujgx7d38SHkEsMMCcAAegfCpfDj2N7ceE5rlLV7ucTW8r5zMHAZ%2BfmPRQDk8EdTQAvirwz4m1fVp3svE0tjprBdkEIKMvyFT8y88El855JAIGwEzaFoPiq01kT6p4pa%2BsEYlbYW6IWHllQGYLngnccHkgHjoe0ooA8ztvDnj4aGhuPFQOokRsYxGhVMI25d2wbiXIOeBgY4xkuj8K%2BN5LB4bnxYcuj7fLTyzESibAGVctgqwPOed2Sflr0qigDK8OaS%2BkW11HJdXFwZrqa4HmyvJ5as3yopYkgAY4z1LEdcVq0UUAFFFFABRRRQAUjIrFSyglTlSR0OMZH4E0tcF8VPiloPw4trYaqZ7rUbvP2extVDSuOm45ICrnjJ684BwcAHapZWqKqpbQqF4AEYGP09zT4raCKQyRQxo5G0sqAHHpmvI%2FAvx40bxD4kg8P63pWpeHNXuSBbx364SUn7qhsAhm7ZGD0ByQD7DQAUUV4l4l%2FaR8H6RrFxYWNtqusJakie6sYkaFcHB2szDcAe%2BNp7E0Ae20VzngLxponjrQU1bw9dedbltkiOu2SF8ZKOvY8%2B4PUEiujoAKKKKACiiigAooooAK%2BbfGF9Y%2BFv2rdP1jxmVj0m604R6bdzD91bSBduSegw2%2FP93zATgc19JVheMfDOg%2BKtIey8T6dbX1kuX%2FfceWQPvK4IKHHcEcZoA%2Bf%2FwBp3xBoXjA%2BEtC8HXtpq3iltRV7eawlWbyEIIILqSBltjYz0TJxxn6dFfE%2FwA%2BIXgf4e%2BF7q%2B1XTZb7xdNeSRwC2t98qwGNAoDthVBbeDty3qDxX2F4S1h9f8N6fqsun3emyXUQka1u12yRH0I%2FUexHA6UAVfiHb3134C8R2%2BkhzqMum3EduI%2FvGQxMFC%2B%2BenvXj%2F7Lfifwfpvwohtm1LTNO1SCWZ9RW5mSF2beSrncRldhQZ6DGOoNe0eK%2FEukeE9Fm1bxDepZWERAaRgWJJOAAoBJPsBXxH8WvE%2Fg3xd490fVfDXhC9FnJdn7fjMJ1VtyEqipkK2M5YfMTICRmgD2j9mw2158T%2FiTqXheLyvCc1wiwBU2xvJvYgoOwwXOOwdRgcV9GV5J8EPiL8P9asbfw94NhOjzwozrpc8WxyB95t2SHPcncWOMkV63QAUUUUAFFFFABRRRQAV87%2FtgeHNSu9A0vX4Li8n0fT5Qmo6dHKURkZhiX0yD8pJBxuUgcGvoivJf2lPGr%2BFvAT6bpwMut68Tp9pCq7mKsMSMB3wGCj%2FadaAOP%2FYu0rTm8BalqhsLU6kuqywrdGJTMsfkwnYHxnGWPHTk19FV8w%2FAp9T%2BEvxIm%2BHfiiVDa6zBHe2Uq8J9o2AMo%2Bu1kz3aNcD5q%2BnqAKOtaRp2uWD2Ws2Nrf2bkM0FzEJEJByCQeODXhP7QFtBZ%2FE74KW9pDHBbxasVSKJQqoPOteABwBX0Ia%2BN%2FiHceIvi14r8R%2BKvCU7rpHgtFbTnTrNIjhmeP8A2iFZ8jnCxjGSKAPrSPw%2Fo8ettrMelWCasyGNr1bdRMVPUF8ZNalch8KPGlv498DadrkGxZpF8u6iX%2FllOvDr9O49mFdfQAUUUUAFFFFABRRRQAV86pCvib9sW%2Bt9YJnt%2FD2nJPYRH7qP5cTZI7kNMzZ65C%2BlFFAGh%2B2BYQx%2BBdL8QQ74dX0rUIza3MZwybsk%2Fqin6qPevafDd5LqHh7TL242%2BdcWsUz7RgbmQE4%2FE0UUAcT%2B0Vqt5o3wY8T3mnSmG58mOAOOoWWZI3x6Ha7c9qf8ANEstD%2BEXhuOwi2fa7SO%2BnY9XllUMxP6AewAoooA83%2BBsY8N%2FtAfELwnpJMWhLH9sjtjyI3DR4C%2BgAlYfQLnOK%2BjKKKACiiigAooooA%2F%2F9k%3D" /><h4>libyear</h4></div><div class="bookmark__right-side"><q>
A simple measure of software dependency
freshness. It is a single number telling you how
up-to-date your dependencies are.
</q></div><div class="bookmark__left-side"><a class="btn btn-default" href="https://libyear.com/">libyear<br /><small class="text-muted">libyear.com</small></a></div></div>
</div>Stefan WienertRetrofitting a DI2 hydraulic on my road bike2023-04-13T20:00:00+02:002023-04-13T20:00:00+02:00repo://posts.collection/_posts/2023/2023-04-11-retrofitting-a-di2-hydraulic-on-my-road-bike.md<toc></toc>
<p>As a passionate cyclist and tinkerer, I’m always looking for ways to improve my road bike’s performance and make it more comfortable to ride. Recently, I decided to tackle the challenge of retrofitting my bike with a Shimano DI2 electrical shifting system and hydraulic disc brakes. While I’m no expert, I’m excited to share my experience with this process and discuss the benefits and challenges that come with upgrading a bike’s components. Whether you’re a seasoned cyclist or simply curious about bike modifications, I hope you’ll find this post helpful and informative.</p>
<h2 id="motivation">Motivation</h2>
<p>In a previous blog post, I wrote about building my current road bike (all terrain style). At that point, I’d chosen the Sensah Empire Pro 2x11 gear with a Z-Race hydraulic cable-actuated brake. At that time, the choice of using a cable-actuated brake was ok, as I had already a lot of new tech to handle (full bike build, tubeless setup). After more than one year, the experience in total was quite satisfying but, compared to my Canyon Grail, which has a hydraulic GRX, the shifting and brake performance was noticeably worse. So I began searching the online bike part stores for groupsets with hydraulic. But, even “entry” sets of hydraulic drop-bar groupsets are expensive, around 700-900 EUR. At the same time, I came across a very good offer for the new Shimano 105 DI2, for 1150 EUR, which was a fantastic deal. Interested in trying out the electrical shifting experience, I pulled the trigger and bought the full group set.</p>
<h2 id="prerequisites-for-di2---check-your-frame-has-a-hole-or-bottom-hole">Prerequisites for DI2 - Check your frame has a hole or bottom hole</h2>
<p>Compared to the previous Ultegra/Dura-Ace DI2, the new 105 DI2 needs less “stuff” (Junction Boxes etc.). You only get the battery, which connects to both derailleurs. So, you don’t need special openings or boxes for other parts. The only prerequisite for the frame is:</p>
<p>a.) a hole in the frame for the rear derailleur cable (near the seat tube bottle cage)
b.) or a bottom hole for the rear derailleur cable, and a full cable routing from the seat-post to the rear derailleur.</p>
<p>Of course, for hydraulic brakes, you need a frame which large enough holes to fit the hoses and the normal Center Mount brake callipers.</p>
<p>In my case, I have an aluminium frame from Mossos, which by default has no extra hole, but I have an opening at the down tube (See the picture). Before buying the case, I wasn’t sure, if the electrical cable would be long enough, but more about this later.</p>
<h2 id="the-parts">The parts</h2>
<p>I bought the groupset from <a href="https://www.bike-discount.de/de/shimano-105-di2-r7100-2x12-fach-gruppe-inkl.-scheibenbremsen-140/160mm">bike-discount.de</a> for about 1150 EUR, which includes <em>almost</em> everything needed. Additionally, I bought:</p>
<ul>
<li>A bleeding kit for the hydraulic brakes (36 EUR) <a href="https://www.bike-discount.de/de/bleedkit-entlueftungskit-workshop-fuer-shimano-bremsen">Link</a></li>
<li>Shimano Mineral oil (12 EUR)</li>
<li>Olives and Barbs for the hydraulic hoses - BH90 compatible (10 EUR) <a href="https://www.amazon.de/dp/B082V2JNQ8">Amazon</a> <a href="https://s.click.aliexpress.com/e/_DB8PVR3">Aliexpress Affiliate</a></li>
<li>Because my seat post diameter is 31,4, I tried ordering a seat post adapter, but the Amazon seller sent the wrong size, so I build some bodge myself. Otherwise, <a href="https://www.bike-discount.de/de/ritchey-di2-battery-mount-sattelstuetzen">this model from Ritchey might be ok</a> (10 EUR)</li>
<li>Internal routing kit - <a href="https://s.click.aliexpress.com/e/_DdIf5ul">Aliexpress Affiliate</a> (4 EUR), very handy.</li>
</ul>
<p>Tools, I already possessed before, but are needed:</p>
<ul>
<li>Wire cutter, to cut the hoses to length - Next time I would try <a href="https://www.aliexpress.com/item/33022389283.html">this model from Aliexpress</a>.</li>
<li>If you have a pressfit bottom bracket, you probably need to remove it, to work with the electric cables. For me, cheapish tools from Ali like <a href="https://www.aliexpress.com/item/1005002649806669.html">this installation tool</a> and <a href="https://s.click.aliexpress.com/e/_DFzsqlT">this removal tool (Affiliate link)</a> worked well enough.</li>
<li>And the usual tools for installing bike stuff: hex keys, cassette lockring tool, etc.</li>
</ul>
<h2 id="the-installation">The installation</h2>
<h3 id="di2-installation">DI2 installation</h3>
<p><img loading="lazy" src="/images/blog/2023/di2/di2-schematics.png" alt="DI2 Schematics" class="img-frame aligncenter" /></p>
<p>First, I tried out the electrical installation, because I wasn’t sure, the cable would fit. But as you can see, my frame has a hole in the down tube, so I could easily route the cable from the seat post, through the down tube exit up to the derailleur and back to the rear derailleur.</p>
<p>Instructions used:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=G48UFKolz94">Shimano Ultegra Di2 12 Speed Upgrade Project: Installation // Part II</a></li>
<li><a href="https://si.shimano.com/en/pdfs/dm/RAGN010/DM-RAGN010-03-ENG.pdf">Shimano ROAD Di2 Series General Guide</a></li>
</ul>
<h4 id="pairing-and-updating">Pairing and updating</h4>
<p>Next, I downloaded the Shimano E-Tube App and paired the battery with the app. After that, I updated the firmware of the battery and the derailleurs and the brifters. Using the app through Bluetooth was relatively painless, only a little slow the app. Nevertheless worked without any issues. After that, I could already move the derailleurs with the brifters.</p>
<p><img loading="lazy" src="/images/blog/2023/di2/seatpost.jpeg" alt="Seat post wrapped in bubble wrap" class="aligncenter img-frame" style="max-width: 500px; width: auto" /></p>
<h4 id="issue-seat-post-battery-mount">Issue: Seat post battery “mount”</h4>
<p>After unpacking the Shimano stuff, I figured the default battery mount does not fit my rather large 31.4mm seat post. So I tried ordering a Ritchey mount from an Amazon seller (No Ali or another shop because of shipping time/cost), but it was the wrong size (27mm again), so I decided to just use some bubble wrap with gaffer tape for the time being :D - No problems so far.</p>
<div style="clear: both;"></div>
<h4 id="issue-no-hole-for-front-derailleur-cable---zip-tie-down-tube-routing">Issue: No hole for front derailleur cable - Zip-tie down-tube routing</h4>
<p>Because my frame is not prepared for DI2, I had to route the front derailleur cable through the down tube. I used a zip tie to secure the cable to the down tube. Maybe next time I will use a zip tie in the frame colour :D.</p>
<p><img loading="lazy" src="/images/blog/2023/di2/frame-with-cables.jpeg" alt="Frame cable" class="aligncenter img-frame" /></p>
<p><img loading="lazy" src="/images/blog/2023/di2/fd-zip-tie.jpeg" alt="Zip tie" class="aligncenter img-frame" /></p>
<h3 id="hydraulic-installation">Hydraulic installation</h3>
<h4 id="routing-and-shortening">Routing and shortening</h4>
<p>The internal routing kit was very handy, again. The hoses came pre-attached to the callipers, but I had to release the rear derailleur because my frame’s entry point was too small to fiddle the hose from the bottom to the exit. So I unwrenched the hose, then turned it around and could route it from the top. Then, cutting the hoses to length was the next step.
Most guides and videos use a proprietary Shimano tool, but I used a wire cutter to cut it, and metal pliers to hammer the new barb inside, which worked fine.</p>
<p>Instructions used:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Xlil6gOJXUc">Shane Miller’s instructions on shortening hoses</a></li>
<li><a href="https://www.youtube.com/watch?v=RfRWMPMGFW8">GCN: Swap hydraulic hoses</a></li>
<li><a href="https://si.shimano.com/en/pdfs/dm/RADBR01/DM-RADBR01-10-ENG.pdf">Shimano dealer’s manual Hydraulic Disc Brake</a></li>
</ul>
<h4 id="bleeding">Bleeding</h4>
<p>This was my first installation of hydraulic brakes, so I took a lot of time watching videos of other riders doing it.
The problem is, that most videos are Mountain-Bike specific, and some brakes have different procedures. Also, the hose entries and nuts are sometimes quite different. At first, a looked for like 5-10min to figure out, this Shimano 105 has two covers on each calliper: One for the bleeding port, and one for the release nut.
I used a bike stand and towels, to catch the oil that sprinkled around when cutting the hoses.
In the end, I used instructions from:</p>
<p><img loading="lazy" src="/images/blog/2023/di2/bleeding-br.jpeg" alt="Bleeding brifter." class="aligncenter img-frame" /></p>
<p>Instructions used:</p>
<ul>
<li>Bleed-Kits installation instructions <a href="https://youtu.be/2cRg-FAgByQ">Youtube</a></li>
<li>Shimano’s instructions from above.</li>
</ul>
<p>The front brake bleeding went great and without any issues. On the rear brake though, I had the problem that the oil would not flow through the hose. I tried cutting the hose, remounting it, and just bleeding into the open rear derailleur. Also, I reset the pistons using a tire lever. That last one or any of the former fixed the blockage, and I could bleed the rest.</p>
<h3 id="finishing-touches">Finishing touches</h3>
<p>After reassembling the bike - Bottom bracket, bar tape, the installation of Disc rotors, Cassette, Chain, and Crankset was pretty standard, also aligning the disc brake callipers.</p>
<p>Now, the fun part. By using the app, I can set the derailleurs easily, just follow the instructions from the app and adjust using buttons on the app.</p>
<h2 id="final-thoughts">Final thoughts</h2>
<p><img loading="lazy" src="/images/blog/2023/di2/finished.jpg" alt="Finished Groupset build" class="img-frame aligncenter" /></p>
<p>I hurried to get the bike ready to take it to our Eastern vacation. During that time, I already rode about 200km with the new setup. What can I say: the shifting is really nice, not game-changing (especially compared to quality groupsets like GRX), but very swift and easy. After about 2h I was adjusted to the shifting and also enabled the semi-automatic shifting. That means, it will automatically shift the front derailleur and perform correction shifts on the back when you reach the 2nd or 3rd outer-most sprocket. Because shifting is much easier, especially compared to the Sensah Empire, I now feel I shift much more frequently. And of course, a fully hydraulic disc brake is another great upgrade from the Zrace hybrid setup before.</p>
<p>In the end, a “nice” upgrade - Do you need it? Probably not, but if you get a good deal, I would say the Shimano 105 DI2 is well worth the price, especially when even Aliexpress hydraulic group sets (Crank+Brake+Shifters) set you at more than half the price already. Also, the installation procedure seems to be easier than the former DI2 models. No junction boxes are needed, no extra Bluetooth etc. Everything just worked via Bluetooth and App pairing.</p>Stefan Wienert