<rss version="2.0">
	<channel>
		<title>Arm1.ru</title>
		<link>https://arm1.ru</link>
		<description>A blog about IT and software development.</description>
            
                <item>
					<title>Swift Adwaita library</title>
					<link>https://arm1.ru/blog/swift-adwaita-library</link>
					<description><![CDATA[<p>
	<img alt="Swift Adwaita" src="https://arm1.ru/img/uploaded/swift-adwaita-2.webp" style="width: 100%;">
</p>

<p>
	A project that I’ve always wanted to create: a library that enables the development of GNOME applications using Swift. While there are some similar libraries available, they appear to be incomplete or not actively maintained. Thanks to Vibe Coding, I managed to complete the project in approximately a week.
</p>

<p>
	<b>swift-adwaita</b> is an imperative Swift 6 wrapper for GTK4 and libadwaita, built for creating native GNOME desktop applications on Linux.
</p>

<p>
	It provides a modern Swift API over GTK and Adwaita with type-safe widgets, signals, property bindings, async operations, and ergonomic convenience helpers, while preserving the native behavior, styling, and feel of the GNOME platform.
</p>

<ul>
	<li>
		Native GTK4 and libadwaita application development in Swift
	</li>
	
	<li>
		Imperative API without a custom DSL
	</li>
	
	<li>
		Type-safe enums, signals, and property APIs
	</li>
	
	<li>
		Async/await support for common platform integrations
	</li>
	
	<li>
		Extensive widget coverage with a real demo application
	</li>
</ul>

<p>
	Here’s a demo app built using <b>swift-adwaita</b>:
</p>

<p>
	<video style="width: 100%;" height="auto" controls preload="auto" poster="/img/uploaded/swift-adwaita-2.webp">
		<source src="/videos/swift-adwaita.webm">
	</video>
</p>

<p>
	This is an open-source project licensed under the MIT license. The source code is available on <a href="https://github.com/makoni/swift-adwaita/">GitHub</a>. Documentation with guides is available <a href="https://spaceinbox.me/docs/swift-adwaita/documentation/adwaita">here</a>.
</p>

<p>
	<a class="github-button" href="https://github.com/makoni/swift-adwaita" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star makoni/swift-adwaita on GitHub">Star</a>

	<a class="github-button" href="hhttps://github.com/makoni/swift-adwaita/fork" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="octicon-repo-forked" data-size="large" data-show-count="true" aria-label="Fork makoni/swift-adwaita on GitHub">Fork</a>
</p>

<!-- Place this tag in your head or just before your close body tag. -->
<script async defer src="https://buttons.github.io/buttons.js"></script>


]]></description>
					<pubDate>Tue, 31 Mar 2026 17:43:50 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/swift-adwaita-library</guid>
					<comments>https://arm1.ru/blog/swift-adwaita-library#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift 2.4.0</title>
					<link>https://arm1.ru/blog/couchdb-client-for-swift-2-4-0</link>
					<description><![CDATA[<p>
	<img src="https://arm1.ru/img/uploaded/couchdb-client-swift.webp" width="100%">
</p>

<h2>Highlights</h2>

<ul>
	<li>
		Refactored the internal request pipeline in <b>CouchDBClient</b> to use cleaner async/await-style flows and reduce duplicated response handling logic.
	</li>

	<li>
		Improved buffering and decoding paths for raw and typed requests, with a focus on safer <b>EventLoopGroup</b> execution and better performance in response processing.
	</li>

	<li>
		Expanded test coverage around <b>EventLoopGroup</b>-backed request execution, including raw and typed <b>get</b>, raw and typed <b>find</b>, attachment download, Mango index listing, and Mango query explanation.
	</li>

	<li>
		Refreshed user-facing documentation across the README, DocC articles, and tutorials.
	</li>

	<li>
		Updated documentation tooling for newer DocC workflows, including Markdown export support.
	</li>
</ul>

<h2>API and Behavior Improvements</h2>

<ul>
	<li>
		Added and refined <b>EventLoopGroup</b> support across more <b>CouchDBClient</b> request paths.
	</li>

	<li>
		Improved internal error-handling paths and response decoding behavior for CouchDB operations.
	</li>

	<li>
		Simplified request helper layering and reduced duplicated request/response processing code.
	</li>

	<li>
		Improved attachment-related behavior and accompanying tests.
	</li>

	<li>
		Added <b>visionOS</b> to supported platforms in the package manifest.
	</li>
</ul>

<h2>Documentation</h2>

<ul>
	<li>
		Fixed and refreshed README examples for CRUD and Mango query usage.
	</li>

	<li>
		Updated DocC landing pages to better reflect the current API surface.
	</li>

	<li>
		Corrected the Advanced Mango Query tutorial snippets to match the current typed query API.
	</li>

	<li>
		Corrected Vapor tutorial examples.
	</li>

	<li>
		Fixed Hummingbird tutorial package setup and dependency snippets.
	</li>

	<li>
		Updated <b>buildDocs.sh</b> to support:

		<ul>
			<li>
				configurable output and hosting base path
			</li>

			<li>
				static hosting content embedding
			</li>

			<li>
				experimental Markdown output
			</li>

			<li>
				Markdown manifest generation
			</li>
		</ul>
	</li>

	<li>
		Added a post-processing step in <b>buildDocs.sh</b> that injects a relative <b>Markdown</b> link into generated DocC HTML pages.
	</li>
</ul>


<h2>Tooling and Dependencies</h2>

<ul>
	<li>
		Updated package dependencies in <b>Package.resolved</b>.
	</li>

	<li>
		Updated the Ubuntu build workflow Swift version matrix.
	</li>
</ul>

<p>
	<a href="https://github.com/makoni/couchdb-swift">CouchDB Client</a> on GitHub | <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient">Documentation</a> with examples and tutorials.
</p>]]></description>
					<pubDate>Sat, 28 Mar 2026 20:36:59 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/couchdb-client-for-swift-2-4-0</guid>
					<comments>https://arm1.ru/blog/couchdb-client-for-swift-2-4-0#comments</comments>
				</item>
            
                <item>
					<title>Actioneer for Linux 1.0.8</title>
					<link>https://arm1.ru/blog/actioneer-for-linux-1-0-8</link>
					<description><![CDATA[<p>
	<img alt="Actioneer for Linux 1.0.8" src="https://arm1.ru/img/uploaded/actioneer-for-linux-1-0-8.webp" style="width: 100%;">
</p>

<p>
	Actioneer 1.0.8 focuses on making live GitHub Actions monitoring more reliable while using the GitHub API more efficiently.
</p>

<h2>Highlights</h2>

<ul>
	<li>
		In-progress workflow runs now keep refreshing while they are still active, so expanded jobs and steps stay current before the run finishes.
	</li>

	<li>
		Expanded run details are more stable and easier to read, with clearer badges, preserved job context, and contiguous step numbering.
	</li>

	<li>
		Workflow status badges are now translated more consistently across the app's supported languages.
	</li>

	<li>
		Background refresh is lighter on the GitHub API, reducing duplicate requests and helping preserve rate-limit headroom.
	</li>
</ul>

<h2>Technical improvements</h2>

<ul>
	<li>
		Fixed several live-refresh lifecycle issues in the detail pane so switching repositories or rebuilding rows no longer disables the active refresh loop.
	</li>

	<li>
		Removed duplicate initial jobs fetches caused by rerender races around freshly expanded runs.
	</li>

	<li>
		Reduced unnecessary polling pressure by tightening selected-repo refresh ownership and job-refresh reuse.
	</li>
</ul>

<p style="text-align: center;">
	<a href="https://snapcraft.io/actioneer"><img width="182" alt="Get it from the Snap Store" src="https://snapcraft.io/en/dark/install.svg" /></a><br>
	<a href="https://flathub.org/en/apps/me.spaceinbox.actioneer"><img width="182" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
</p>]]></description>
					<pubDate>Thu, 12 Mar 2026 18:02:53 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/actioneer-for-linux-1-0-8</guid>
					<comments>https://arm1.ru/blog/actioneer-for-linux-1-0-8#comments</comments>
				</item>
            
                <item>
					<title>Actineer for Linux got translations</title>
					<link>https://arm1.ru/blog/actioneer-for-linux-got-translations</link>
					<description><![CDATA[<p>
	<img alt="Actioneer for Linux 1.0.7" src="https://arm1.ru/img/uploaded/actioneer-1-0-7.webp" style="width: 100%;">
</p>

<p>
	Actioneer for Linux has translations available in numerous languages, including Russian, Spanish, French, Portuguese (Brazil), Hindi, Simplified Chinese, Arabic, Bengali, Urdu, German, and Dutch.

</p>

<p>
	It also includes a built-in crash reporter, which you can copy and paste the report or open an issue on GitHub. Additionally, there are some tweaks and improvements made under the hood.
</p>

<p style="text-align: center;">
	<a href="https://snapcraft.io/actioneer"><img width="182" alt="Get it from the Snap Store" src="https://snapcraft.io/en/dark/install.svg" /></a><br>
	<a href="https://flathub.org/en/apps/me.spaceinbox.actioneer"><img width="182" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
</p>]]></description>
					<pubDate>Thu, 05 Mar 2026 20:39:52 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/actioneer-for-linux-got-translations</guid>
					<comments>https://arm1.ru/blog/actioneer-for-linux-got-translations#comments</comments>
				</item>
            
                <item>
					<title>Recent updates for Actioneer for Linux</title>
					<link>https://arm1.ru/blog/actioneer-1-02-1-05</link>
					<description><![CDATA[<p>
	<img alt="Actioneer for Linux" src="https://arm1.ru/img/uploaded/actioneer-1-02-1-05.webp?1" style="width: 100%;">
</p>

<p>
	There were a bunch of updates of Actioneer for Linux recently, which I forgot to post here. Here's what's new in these updates:
</p>


<h3>1.02</h3>

<ul>
	<li>
		Faster and smoother UI with refreshed repo/workflow lists and improved scrolling behavior.
	</li>

	<li>
		New run filtering controls with better caching, so switching filters is instant and doesn’t reload data.
	</li>

	<li>Better workflow auto-refresh and run status updates, including fewer duplicate fetches.
	</li>

	<li>
		Notifications are more reliable across Snap/Flatpak, with improved icon handling and fallbacks.
	</li>

	<li>
		Improved sandboxed credential storage using the secret portal for Snap/Flatpak.
	</li>

	<li>
		Offline-friendly cache persistence for workflows, runs, and jobs.
	</li>

	<li>
		Packaging and CI updates across Snap, Flatpak, and AppImage for better compatibility.
	</li>

	<li>
		Dependency updates and stability fixes.
	</li>
</ul>

<h3>1.03</h3>

<ul>
    <li>
        Job logs now render ANSI colors, grouped workflow sections, and clearer command/output formatting.
    </li>

    <li>
        Aligned timestamps and command prefixes improve scanability, with stronger error highlighting.
    </li>

    <li>
        Packaging CI refreshed with multi-arch updates for AppImage/Snap/Flatpak builds.
    </li>

    <li>
        Dependency updates and demo log refreshes for improved accuracy.
    </li>
</ul>

<h3>1.04</h3>

<ul>
    <li>
        Handle expired job logs (HTTP 410) with clearer messaging instead of a broken view.
    </li>

    <li>
        Strip BOM markers in job logs so first-line timestamps render correctly.
    </li>
</ul>

<h3>1.05</h3>

<ul>
    <li>
        Manual workflow triggers now support workflow_dispatch inputs with dynamic parameter fields.
    </li>

    <li>
        Dependency updates for ryu, unicode-ident, and zmij.
    </li>
</ul>

<p style="text-align: center;">
	<a href="https://snapcraft.io/actioneer"><img width="182" alt="Get it from the Snap Store" src="https://snapcraft.io/en/dark/install.svg" /></a><br>
	<a href="https://flathub.org/en/apps/me.spaceinbox.actioneer"><img width="182" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
</p>]]></description>
					<pubDate>Fri, 13 Feb 2026 18:16:01 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/actioneer-1-02-1-05</guid>
					<comments>https://arm1.ru/blog/actioneer-1-02-1-05#comments</comments>
				</item>
            
                <item>
					<title>Claw Screenshot - a console tool to make screenshots on Linux</title>
					<link>https://arm1.ru/blog/claw-screenshot-0-1-0</link>
					<description><![CDATA[<p>
	<img alt="Claw Screenshot - a console tool to make screenshots on Linux" src="https://arm1.ru/img/uploaded/claw-screenshot-0.1.0.webp" style="width: 100%;">
</p>

<p>
	Recently, I've been playing with <s>Clawd</s> / <s>Moltbot</s> / Openclaw bot. Of course, it ended up with asking it to write some code. Since I'm running it in a VM with Ubuntu Linux, I've been playing with developing some apps for it. And at some moment, I realised that I'm sending screenshots of an app, but each time I have to do it manually.
</p>

<p>
	So I decided to automate that part. I tried some console apps for Linux that promised they can do screenshots, but none of them worked for me for some reason.
</p>

<p>
	So I decided to write my own. I picked Rust, and Openclaw did some research for me about how it should be done. It ended up with a console app that uses the FreeDesktop Screenshot portal. It required creating a .desktop file so I could see that Gnome permission request and click Allow. That is required just once, so now I've automated it. 
</p>

<p>
	That's a pretty cool thing to be honest, which I already tried with an iOS app using UI tests - the AI agent just runs UI tests, gets screenshots from a report, analyzes them, and understands what is wrong with the app UI.
</p> 

<p>
	I pushed the app to GitHub and published a release with binaries, .deb, and .rpm packets for arm64 and amd64. And it got a nice automatic installation script. Since I made it using Openclaw, I called it Claw Screenshot.
</p>

<p>
	Check it out: <a href="https://github.com/makoni/claw-screenshot">https://github.com/makoni/claw-screenshot</a>
</p>]]></description>
					<pubDate>Tue, 03 Feb 2026 17:38:53 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/claw-screenshot-0-1-0</guid>
					<comments>https://arm1.ru/blog/claw-screenshot-0-1-0#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.14.0</title>
					<link>https://arm1.ru/blog/appmetric-1-14-0</link>
					<description><![CDATA[<p style="text-align: center;">
  <picture>
    <!-- Dark-mode image -->
    <source srcset="/img/uploaded/appmetric-1.14.0-dark.webp" media="(prefers-color-scheme: dark)">

    <!-- Light-mode image (used as fallback if prefers-color-scheme is light or not supported) -->
    <img
      src="https://arm1.ru/img/uploaded/appmetric-1.14.0-light.webp"
      alt="AppMetric screenshot"
      style="width: 100%; max-width: 960px;"
      loading="lazy"
    >
  </picture>
</p>

<p>
	Вышло обновление AppMetric версии 1.14.0. 
</p>

<h3>Новое</h3>

<ul>
	<li>Окно настроек с переключателем «Запускать при входе».</li>
	<li>Обновлённые иконки приложения для Liquid Glass.</li>
</ul>


<h3>Улучшения</h3>

<ul>
	<li>Более быстрые и стабильные обновления: параллельные запросы с backoff при лимитах и учётом дневной квоты.</li>
	<li>Поповер подстраивается под контент.</li>
	<li>Улучшено форматирование дат в графиках.</li>
</ul>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Загрузить" height="40" src="https://arm1.ru/img/mac_app_store_badge.svg" width="165"></a>
</p>]]></description>
					<pubDate>Wed, 21 Jan 2026 11:49:42 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/appmetric-1-14-0</guid>
					<comments>https://arm1.ru/blog/appmetric-1-14-0#comments</comments>
				</item>
            
                <item>
					<title>Actioneer 1.01</title>
					<link>https://arm1.ru/blog/actioneer-1-01</link>
					<description><![CDATA[<p style="text-align: center;">
  <picture>
    <!-- Dark-mode image -->
    <source srcset="/img/uploaded/actioneer-dark.webp" media="(prefers-color-scheme: dark)">

    <!-- Light-mode image (used as fallback if prefers-color-scheme is light or not supported) -->
    <img
      src="https://arm1.ru/img/uploaded/actioneer-light.webp"
      alt="Actioneer screenshot"
      style="width: 100%; max-width: 960px;"
      loading="lazy"
    >
  </picture>
</p>

<p>
	The first update for Actioneer has been released. Here's what's new:
</p>

<ul>
	<li>Workflows refresh in the background so newly-dispatched runs appear automatically.</li>

	<li>Reduced API usage and fewer rate-limit hits with ETag-based caching — lists load faster and your quota lasts longer.</li>
	
	<li>The app remembers the repository you were viewing between launches.</li>

	<li>Better diagnostics and reliability for smoother everyday use.</li>
</ul>

<p style="text-align: center;">
	<a href="https://apps.apple.com/us/app/actioneer-command-your-ci/id6753989681" target="_blank"><img src="https://arm1.ru/img/mac_appstore_badge_en.svg" alt="Download" width="165" height="40"></a>
</p>

<p>
	Follow updates on X: <a href="https://x.com/ActioneerCI">https://x.com/ActioneerCI</a>
</p>]]></description>
					<pubDate>Tue, 20 Jan 2026 15:07:52 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/actioneer-1-01</guid>
					<comments>https://arm1.ru/blog/actioneer-1-01#comments</comments>
				</item>
            
                <item>
					<title>CompareShots 1.7</title>
					<link>https://arm1.ru/blog/compareshots-1-7</link>
					<description><![CDATA[<p>
	<img alt="CompareShots 1.7" src="https://arm1.ru/img/uploaded/compareshots-1.7.webp" style="width: 100%;">
</p>

<p>
	This week I've released a new version of CompareShots. Nothing special, just updated the user interface to support Liquid Glass. Also, sharing the result image will not capture UI elements anymore.
</p>

<p>
	Hard to believe, but this year CompareShots turns 10 years old. Time runs fast.
</p>

<p style="text-align: center;">
	<a href="https://apps.apple.com/ru/app/compareshots/id987237199"><img alt="Download" src="https://arm1.ru/img/mac_appstore_badge_en.svg"></a>
</p>]]></description>
					<pubDate>Tue, 25 Nov 2025 18:50:27 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/compareshots-1-7</guid>
					<comments>https://arm1.ru/blog/compareshots-1-7#comments</comments>
				</item>
            
                <item>
					<title>Actioneer for Linux</title>
					<link>https://arm1.ru/blog/post-1762578203.208283</link>
					<description><![CDATA[<p style="text-align: center;">
  <picture>
    <!-- Dark-mode image -->
    <source srcset="/img/portfolio/actioneer-linux-dark.webp" media="(prefers-color-scheme: dark)">

    <!-- Light-mode image (used as fallback if prefers-color-scheme is light or not supported) -->
    <img
      src="https://arm1.ru/img/portfolio/actioneer-linux-light.webp"
      alt="Actioneer screenshot"
      style="width: 100%; max-width: 960px;"
      loading="lazy"
    >
  </picture>
</p>

<p>
	Actioneer is a native GNOME desktop client for GitHub Actions. It combines a GTK4/libadwaita interface with a Tokio-powered API client so you can browse repositories, inspect workflow runs, watch job logs, and receive notifications without leaving your desktop.
</p>

<h2>Key features</h2>
<ul>
	<li>
		Browse your GitHub repositories and view Actions workflows and recent runs quickly.
	</li>

	<li>
		Inspect run status (success, failure, queued, in progress) with clear badges and counts.
	</li>

	<li>
		View job logs: download and preview run logs for quick troubleshooting.
	</li>

	<li>
		Dispatch workflows, cancel running workflows, and re-run failed runs directly from the app.
	</li>

	<li>
		Favorites and quick search let you focus on the repositories and workflows that matter most.
	</li>

	<li>
		Desktop notifications for run completions and failures so you never miss important results.
	</li>

	<li>
		In-memory caching and efficient refresh make the app responsive while respecting GitHub rate limits.
	</li>

	<li>
		Secure authentication using OAuth, tokens are stored securely in keyring.
	</li>
</ul>

<p>
	<video style="width: 100%;" height="auto" controls preload="auto" poster="/img/portfolio/actioneer-linux-dark.webp">
		<source src="/videos/actioneer-linux.webm">
	</video>
</p>


<p style="text-align: center;">
	<a href="https://snapcraft.io/actioneer"><img alt="Get it from the Snap Store" src="https://snapcraft.io/en/dark/install.svg" /></a> <a href="https://flathub.org/en/apps/me.spaceinbox.actioneer"><img height="56" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
</p>

<p>
	Acntioneer for Linux is an open source project, source code is available on <a href="https://github.com/makoni/actioneer-gtk" target="_blank">GitHub</a>.
</p>

<p>
	<a class="github-button" href="https://github.com/makoni/actioneer-gtk" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star makoni/actioneer-gtk on GitHub">Star</a>

	<a class="github-button" href="hhttps://github.com/makoni/actioneer-gtk/fork" data-color-scheme="no-preference: light; light: light; dark: dark;" data-icon="octicon-repo-forked" data-size="large" data-show-count="true" aria-label="Fork makoni/actioneer-gtk on GitHub">Fork</a>
</p>

<!-- Place this tag in your head or just before your close body tag. -->
<script async defer src="https://buttons.github.io/buttons.js"></script>]]></description>
					<pubDate>Sat, 08 Nov 2025 08:03:23 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/post-1762578203.208283</guid>
					<comments>https://arm1.ru/blog/post-1762578203.208283#comments</comments>
				</item>
            
                <item>
					<title>Actioneer - Command your CI</title>
					<link>https://arm1.ru/blog/actioneer-command-your-ci</link>
					<description><![CDATA[<p style="text-align: center;">
  <picture>
    <!-- Dark-mode image -->
    <source srcset="/img/uploaded/actioneer-dark.webp" media="(prefers-color-scheme: dark)">

    <!-- Light-mode image (used as fallback if prefers-color-scheme is light or not supported) -->
    <img
      src="https://arm1.ru/img/uploaded/actioneer-light.webp"
      alt="Actioneer screenshot"
      style="width: 100%; max-width: 960px;"
      loading="lazy"
    >
  </picture>
</p>

<p>
	Actioneer — a lightweight macOS app for developers and DevOps engineers who want fast, reliable access to GitHub Actions from the desktop.
</p>

<h2>Key features</h2>
<ul>
	<li>
		Browse your GitHub repositories and view Actions workflows and recent runs quickly.
	</li>

	<li>
		Inspect run status (success, failure, queued, in progress) with clear badges and counts.
	</li>

	<li>
		View job logs: download and preview run logs for quick troubleshooting.
	</li>

	<li>
		Dispatch workflows, cancel running workflows, and re-run failed runs directly from the app.
	</li>

	<li>
		Favorites and quick search let you focus on the repositories and workflows that matter most.
	</li>

	<li>
		Desktop notifications for run completions and failures so you never miss important results.
	</li>

	<li>
		In-memory caching and efficient refresh make the app responsive while respecting GitHub rate limits.
	</li>

	<li>
		Secure authentication using OAuth (PKCE); tokens are stored securely in the macOS Keychain.
	</li>
</ul>

<h2>Privacy & security</h2>

<p>
	We only request minimum GitHub scopes required for the features you use. Authentication uses OAuth PKCE and tokens are stored in the macOS Keychain. We do not send your logs or tokens to third-party servers without your explicit consent. See the app’s Privacy Policy for details.
</p>

<h2>Getting started</h2>

<p>
	Sign in with your GitHub account (OAuth), grant the requested scopes, and the app will list your repositories and workflows. For CI/CD administrators and individual developers alike, Actioneer makes monitoring and simple management of GitHub Actions fast and convenient.
</p>

<p style="text-align: center;">
	<a href="https://apps.apple.com/us/app/actioneer-command-your-ci/id6753989681" target="_blank"><img src="https://arm1.ru/img/mac_appstore_badge_en.svg" alt="Download" width="165" height="40"></a>
</p>

<p>
	Follow updates on X: <a href="https://x.com/ActioneerCI">https://x.com/ActioneerCI</a>
</p>]]></description>
					<pubDate>Thu, 16 Oct 2025 11:37:18 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/actioneer-command-your-ci</guid>
					<comments>https://arm1.ru/blog/actioneer-command-your-ci#comments</comments>
				</item>
            
                <item>
					<title>CompareShots 1.6</title>
					<link>https://arm1.ru/blog/compareshots-1-6</link>
					<description><![CDATA[<p>
	<img alt="CompareShots 1.6" src="https://arm1.ru/img/uploaded/compareshots-1.6.webp" style="width: 100%;">
</p>

<p>
	A new version of CompareShots has been released. It's a simple app I wrote years ago to compare two images.
</p>

<p>
	The new version 1.6 has been rewritten in SwiftUI. And I've implemented a couple of ideas from app reviews that a user suggested.
</p>

<p>
	What's new:
</p>

<ul>
	<li>Choose your view: Easily switch between aspect fill and aspect fit with a new button.</li>
	<li>Move your images: In aspect fill mode, use two fingers to reposition images for the perfect comparison.</li>
	<li>Faster setup: Select up to two images at once for side-by-side comparison.</li>
	<li>Expanded language support and improved accessibility.</li>
	<li>Various bug fixes and performance enhancements for a faster, more reliable app.</li>
	<li>Various bug fixes and performance improvements.</li>
</ul>

<p style="text-align: center;">
	<a href="https://apps.apple.com/ru/app/compareshots/id987237199"><img alt="Download" src="https://arm1.ru/img/mac_appstore_badge_en.svg"></a>
</p>]]></description>
					<pubDate>Wed, 13 Aug 2025 18:56:13 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/compareshots-1-6</guid>
					<comments>https://arm1.ru/blog/compareshots-1-6#comments</comments>
				</item>
            
                <item>
					<title>HTMLEditor for SwiftUI 1.0.3</title>
					<link>https://arm1.ru/blog/htmleditor-for-swiftui-1-0-3</link>
					<description><![CDATA[<p>
	<img alt="SwiftUI text editor for macOS with HTML syntax highlighting" src="https://arm1.ru/img/uploaded/swiftui-text-editor-for-macos-with-html-syntax-highlighting.webp" style="width: 100%;">
</p>

<p>
	Spent some more time on HTMLEditor for SwiftUI. There are significant performance improvements in the new version 1.0.3 (thanks to Claude Code).
</p>

<p>
	Try it on GitHub: <a href="https://github.com/makoni/HTMLEditor-SwiftUI">https://github.com/makoni/HTMLEditor-SwiftUI</a>
</p>]]></description>
					<pubDate>Mon, 11 Aug 2025 20:50:18 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/htmleditor-for-swiftui-1-0-3</guid>
					<comments>https://arm1.ru/blog/htmleditor-for-swiftui-1-0-3#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift 2.3.0</title>
					<link>https://arm1.ru/blog/couchdb-client-for-swift-2-3-0</link>
					<description><![CDATA[<p>
	<img alt="CouchDB client for Swift 2.3.0" src="https://arm1.ru/img/uploaded/couchdb-client-for-swift-2-3-0.webp" style="width: 100%;">
</p>

<p>
	Recently, I've implemented a feature that I wanted to add to the CouchDB Swift client for a long time. It's Mango Queries support. Finally, it is done in <b>2.3.0</b>. Feels like the last remaining big feature.
</p>

<p>
	Changelog:
</p>

<ul>
	<li>
		Introduced a robust and type-safe MangoQuery API for building complex selectors, projections, sorting, and pagination in CouchDB.
	</li>
	
	<li>
		Added support for specifying indexes via useIndex in queries to optimize performance.
	</li>
	
	<li>
		Added first-class support for uploading, downloading, and deleting document attachments (files/images).
	</li>
	
	<li>
		Comprehensive Attachments API test suite ensures reliability for file operations.
	</li>
	
	<li>
		Added models and API for creating, listing, and managing Mango indexes (MangoIndex, IndexDefinition).
	</li>
	
	<li>
		Tutorial and code samples for creating indexes are now included in documentation.
	</li>
	
	<li>
		Added support for CouchDB Mango _explain endpoint via MangoExplainResponse to inspect how queries are executed and which indexes are used.
	</li>
</ul>

<p>
	<a href="https://github.com/makoni/couchdb-swift">CouchDB Client</a> on GitHub | <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient">Documentation</a> with examples and tutorials.
</p>]]></description>
					<pubDate>Fri, 01 Aug 2025 19:25:49 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/couchdb-client-for-swift-2-3-0</guid>
					<comments>https://arm1.ru/blog/couchdb-client-for-swift-2-3-0#comments</comments>
				</item>
            
                <item>
					<title>A story of one bug in Leaf</title>
					<link>https://arm1.ru/blog/a-story-of-one-bug-in-leaf</link>
					<description><![CDATA[<p>
	<img alt="A story of one bug in Leaf" src="https://arm1.ru/img/uploaded/a-story-of-one-bug-in-leaf.webp" style="width: 100%;">
</p>

<p>
	This website is working on Vapor - a server-side Swift framework. It's pretty old, popular, and well known. 
</p>

<p>
	I’ve used it for a few years already and always liked that it's fast and doesn't require a lot of memory on the server.
</p>

<p>
	I'm keeping all dependencies up to date. But recently I've noticed that the website started to eat a lot of memory. It starts with about <b>20 mb</b> of memory usage, but after a few weeks, I found that it ate about <b>750 mb</b> on the server.
</p>

<p>
	That's a lot for such a simple website, so I started digging. After reviewing the site code (which I didn't change for a long time), I couldn't find any issues (and AI agents too).
</p>

<p>
	I use Leaf - a template engine from the Vapor team to render HTML. And there was an open issue on their GitHub repo describing exactly the same problem. 
</p>

<p>
	So I've asked Copilot to help me debug what's wrong. Pretty quickly, it added some new tests to my fork that did a lot of renders in a cycle. And <b>leak</b> util found retain cycles. So I fixed that with some <b>weak</b> annotation, but during the review of my PR, a maintainer suggested to just use <b>unowned</b>. 
</p>

<p>
	And that's it. 2 lines of code fixed memory growth. It's hard to believe, but after a few hours since the deploy, the website still takes only <b>2 mb</b> of memory. So I'm very proud of myself today.
</p>

<p>
	Morale: contribute to the open-source project that you use.
</p>]]></description>
					<pubDate>Thu, 31 Jul 2025 22:18:04 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/a-story-of-one-bug-in-leaf</guid>
					<comments>https://arm1.ru/blog/a-story-of-one-bug-in-leaf#comments</comments>
				</item>
            
                <item>
					<title>A Swift package for spell checking using Yandex.Speller</title>
					<link>https://arm1.ru/blog/a-swift-package-for-spell-checking-using-yandex-speller</link>
					<description><![CDATA[<p style="text-align: center;">
	<img alt="A Swift package for spell checking using Yandex.Speller" src="https://arm1.ru/img/uploaded/a-swift-package-for-spell-checking-using-yandex-speller.webp?1" style="width: 100%; max-width: 800px;">
</p>

<p>
	For my own purposes, I wanted to add a spell checker to one of my apps. It should check the text and automatically correct it. Built-in macOS writing tools work fine for English, but don’t work for Russian.
</p>

<p>
	So after it's done, why not share it?
</p>

<p>
	<a href="https://github.com/makoni/YaSpellChecker">https://github.com/makoni/YaSpellChecker</a>
</p>]]></description>
					<pubDate>Thu, 10 Jul 2025 14:05:58 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/a-swift-package-for-spell-checking-using-yandex-speller</guid>
					<comments>https://arm1.ru/blog/a-swift-package-for-spell-checking-using-yandex-speller#comments</comments>
				</item>
            
                <item>
					<title>SwiftUI text editor for macOS with HTML syntax highlighting</title>
					<link>https://arm1.ru/blog/swiftui-text-editor-for-macos-with-html-syntax-highlighting</link>
					<description><![CDATA[<p>
	<img alt="SwiftUI text editor for macOS with HTML syntax highlighting" src="https://arm1.ru/img/uploaded/swiftui-text-editor-for-macos-with-html-syntax-highlighting.webp" style="width: 100%;">
</p>

<p>
	A few months ago, I wanted to add a text editor to one of my apps with HTML syntax highlighting. I tried a couple of libs that I found on GitHub, but none of them really worked for me. Mostly, they are too heavy and try to do everything. And in the end, they are glitchy and buggy.
</p>

<p>
	So inspired by vibe coding, I made my own. It works fine for me and doesn't try to be an IDE or a real code editor. Just a simple SwiftUI view with a text editor with syntax highlighting. Colors are customizable with a simple struct.
</p>

<p>
	Try it on GitHub: <a href="https://github.com/makoni/HTMLEditor-SwiftUI">https://github.com/makoni/HTMLEditor-SwiftUI</a>
</p>]]></description>
					<pubDate>Wed, 09 Jul 2025 23:01:48 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/swiftui-text-editor-for-macos-with-html-syntax-highlighting</guid>
					<comments>https://arm1.ru/blog/swiftui-text-editor-for-macos-with-html-syntax-highlighting#comments</comments>
				</item>
            
                <item>
					<title>Recent updates of my projects</title>
					<link>https://arm1.ru/blog/recent-updates-of-my-projects-july-2025</link>
					<description><![CDATA[<p>
	Recently, I've been playing a lot with AI agents, and it really inspired me to update my projects. Playing with real-life tasks makes it more fun. 
</p>

<p style="text-align: center;">
	<img alt="" src="https://arm1.ru/img/uploaded/recent-updates-of-my-projects-july-2025-1.webp" style="width: 100%;">
</p>

<h2>Couchdb Swift client lib</h2>

<p>
	There are 2 new releases of <a href="https://github.com/makoni/couchdb-swift">couchdb-swift</a> library. Copilot kindly added more unit tests to the library to cover more use cases. Mostly failures. I still had to tweak a lot manually, but it gave me some ideas. So I've added more error handling in these 2 recent releases. Also, it found a couple of minor bugs and fixed them, reviewed my PR, and suggested some improvements. Far from being perfect yet, but still pretty impressive.
</p> 

<p style="text-align: center;">
	<img alt="" src="https://arm1.ru/img/uploaded/recent-updates-of-my-projects-july-2025-2.webp" style="width: 100%;">
</p>

<h2>Release Informer Bot for Telegram</h2>

<p>
	At some moment, I found that Copilot Agent is available for my account, and I can simply start with an issue on GitHub, assign it to the agent, and see what it will do. I've started with a request to update the README for <a href="https://github.com/makoni/ReleaseInformerBot">Release Informer Bot</a> with some nice details about how it works and how to set it up. 
</p>

<p>
	After the agent finished the updated README, it gave me another idea. Setting up might be automated. So I've opened Visual Studio Code and asked the Copilot agent to add automatic creation of the required database and set it up with the required CouchDB indexes.
</p>

<p>
	It also did a good job, but it still required some manual tweaks and changes. And during that, it led to one more release of the CouchDB client lib because I wanted to rely on a proper "not found" error.
</p>

<p>
	It's hard to tell how much time Copilot saved me. But definitely a lot. Including my favorite automatic string translations. Hopefully, that will inspire me to ship more. 
</p>]]></description>
					<pubDate>Tue, 08 Jul 2025 19:57:59 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/recent-updates-of-my-projects-july-2025</guid>
					<comments>https://arm1.ru/blog/recent-updates-of-my-projects-july-2025#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.13.0</title>
					<link>https://arm1.ru/blog/appmetric-1-13-0</link>
					<description><![CDATA[<p>
	<img alt="AppMetric 1.13.0" src="https://arm1.ru/img/uploaded/appmetric-1.13.0.webp" style="width: 100%;">
</p>

<p>
	Вышло обновление AppMetric версии 1.13.0. Теперь на Swift 6, слегка подправил UI и убрал открытие поповера при запуске (кроме первого запуска) — пришёл к выводу, что это скорее раздражает, особенно если приложение запускается автоматически после перезагрузки. Ну и добавил локализацию на несколько новых языков. 
</p>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Загрузить" height="40" src="https://arm1.ru/img/mac_app_store_badge.svg" width="165"></a>
</p>]]></description>
					<pubDate>Mon, 19 May 2025 08:00:34 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/appmetric-1-13-0</guid>
					<comments>https://arm1.ru/blog/appmetric-1-13-0#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift version 2</title>
					<link>https://arm1.ru/blog/couchdb-client-for-swift-version-2</link>
					<description><![CDATA[<p>
	<img alt="CouchDB client for Swift version 2" src="https://arm1.ru/img/uploaded/swift-couchdb-client-2-0-0.webp" style="width: 100%;">
</p>

<p>
	Recently, I’ve released a few new versions of the CouchDB client for Swift. The latest version is version 2, and it includes several key changes:
</p>

<ul>
	<li>Updated the minimum required Swift tools version to <b>6.0</b>.</li>
	<li>Adopted <b>Swift Concurrency</b>. <b>CouchDBClient</b> has been updated to be an <b>actor</b>.</li>
	<li>Renamed the library from couchdb-vapor to <b>couchdb-swift</b> to better reflect its purpose as a general CouchDB client for Swift, beyond Vapor-specific use cases.</li>
	<li>Made some changes to the initializer. Instead of passing a lot of parameters, it now accepts a <b>Config</b> structure.</li>
	<li>You can pass your own <b>HTTPClient</b> instance to be used in the client.</li>
	<li>Added translations for error messages.</li>
	<li>Introduced a dedicated tutorial for integrating CouchDBClient with the <b>Hummingbird</b> server-side framework.</li>
	<li>Added a <b>shutdown()</b> method to properly release resources associated with the HTTPClient.</li>
</ul>

<p>
	<a href="https://github.com/makoni/couchdb-swift">CouchDB Client</a> on GitHub | <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient">Documentation</a> with examples and tutorials.
</p>

]]></description>
					<pubDate>Wed, 16 Apr 2025 09:48:58 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/couchdb-client-for-swift-version-2</guid>
					<comments>https://arm1.ru/blog/couchdb-client-for-swift-version-2#comments</comments>
				</item>
            
                <item>
					<title>Adding translations to an app or a package with AI help</title>
					<link>https://arm1.ru/blog/adding-translations-to-an-app-or-a-package-with-ai-help</link>
					<description><![CDATA[<p>
	<img alt="Translated String Catalog" src="https://arm1.ru/img/uploaded/adding-translations-to-an-app-or-a-package-with-ai-help-1.webp" style="width: 100%;">
</p>

<p>
	In the <a href="https://arm1.ru/blog/localizing-a-swift-package-with-a-string-catalog">previous article</a>, I've explained how to add a Strings Catalog to a Swift package to support localizations. Now, we'll try to translate it into more languages.
</p>]]></description>
					<pubDate>Tue, 14 Jan 2025 10:44:53 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/adding-translations-to-an-app-or-a-package-with-ai-help</guid>
					<comments>https://arm1.ru/blog/adding-translations-to-an-app-or-a-package-with-ai-help#comments</comments>
				</item>
            
                <item>
					<title>Localizing a Swift Package with a String Catalog</title>
					<link>https://arm1.ru/blog/localizing-a-swift-package-with-a-string-catalog</link>
					<description><![CDATA[<p>
	<img alt="" src="https://arm1.ru/img/uploaded/localizing-a-swift-package-with-a-string-catalog-2.webp" style="width: 100%;">
</p>

<p>
	Recently, I've been working on a Swift Package with some strings that I wanted to localize. Apple's documentation on this topic seems to be a bit outdated. The documentation still suggests using language-specific directories for localizing resources and strings.
</p>

<p>
	But, at WWDC 2023, Apple introduced String Catalogs. It's much more handy - just a JSON file that Xcode can fill with all the strings that need to be localized. Most of the examples you can find are about apps, not packages. So, I've spent some time trying to figure out how to use String Catalogs in a Swift package.
</p>]]></description>
					<pubDate>Tue, 14 Jan 2025 09:13:59 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/localizing-a-swift-package-with-a-string-catalog</guid>
					<comments>https://arm1.ru/blog/localizing-a-swift-package-with-a-string-catalog#comments</comments>
				</item>
            
                <item>
					<title>Funny thing in macOS Sequoia with iPhone Mirroring  </title>
					<link>https://arm1.ru/blog/funny-thing-in-macos-sequoia-with-iphone-mirroring</link>
					<description><![CDATA[<p>
	One of the new features in macOS Sequoia is iPhone Mirroring. You can connect to your iPhone, see its screen and control it.
</p>

<p>
	My Mac is using 2 folders to store apps: one is in the user folder <b>~/Applications</b>, the second is the system applications folder at <b>/Applications</b>.
</p>

<p>
	One day I created a search filter in Finder and saved it to have all the available apps in one place, also did put it to the sidebar in the Favourites section.
</p>

<p>
	<img alt="" src="https://arm1.ru/img/uploaded/funny-thing-in-macos-sequoia-with-iphone-mirroring-1.webp" style="width: 100%;">
</p>

<p>
	 But also I love to have a shortcut in the Dock. So I've added a grid here too. It worked as I expected until I updated to macOS Sequoia and tried the iPhone Mirroring app once. Now the grid shows some apps from my iPhone too:
</p>

<p>
	<img alt="" src="https://arm1.ru/img/uploaded/funny-thing-in-macos-sequoia-with-iphone-mirroring-2.webp" style="width: 100%;">
</p>

<p>
	An interesting thing is that only Dock's grid shortcut shows the apps from my iPhone, but not the search in Finder.
</p>

<p>
	And here comes the funny part - that's what you'll see if you will try to launch an app from your iPhone:
</p>
<p style="text-align: center;">
	<img alt="" src="https://arm1.ru/img/uploaded/funny-thing-in-macos-sequoia-with-iphone-mirroring-3.webp" style="width: 100%; max-width: 372px;">
</p>

<p>
	macOS 18.0 or later? Really? I wonder if that's some feature planned for a future macOS update. Will see :)
</p>



]]></description>
					<pubDate>Fri, 20 Sep 2024 15:51:40 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/funny-thing-in-macos-sequoia-with-iphone-mirroring</guid>
					<comments>https://arm1.ru/blog/funny-thing-in-macos-sequoia-with-iphone-mirroring#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.12.0</title>
					<link>https://arm1.ru/blog/appmetric-1-12-0</link>
					<description><![CDATA[<p>
	<img alt="AppMetric 1.12.0" src="https://arm1.ru/img/uploaded/appmetric-1.12.0.webp" style="width: 100%;">
</p>

<p>
	Вышло обновление для AppMetric, версия 1.12.0. Допиливал его в свободное время. Из нового в последних версиях:
</p>

<ul>
	<li>Ревьюверам Apple почему-то не нравится теперь OAuth-авторизация через Safari, пришлось переделать через встроенное окно с WKWebView. Надеюсь, в следующем SwiftUI наконец-то появится свой WebView, и больше не придется использовать обертку.</li>
	<li>Добавил кнопку для быстрого перехода на статистику приложения на сайте Appmetrica.</li>
	<li>Добавил просмотр статистики в виде графиков - как каждого показателя, так и всех показателей вместе. Всего спустя 7 лет после того, как один из пользователей попросил добавить графики :)</li>
	<li>Добавил перевод интерфейса на несколько языков. Благо, с помощью ИИ это сделать теперь <a href="https://arm1.ru/blog/revamping-documentation-with-ai">совсем просто</a>.
</ul>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Загрузить" height="40" src="https://arm1.ru/img/mac_app_store_badge.svg" width="165"></a>
</p>
]]></description>
					<pubDate>Mon, 27 May 2024 23:06:24 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/appmetric-1-12-0</guid>
					<comments>https://arm1.ru/blog/appmetric-1-12-0#comments</comments>
				</item>
            
                <item>
					<title>Revamping Documentation with AI</title>
					<link>https://arm1.ru/blog/revamping-documentation-with-ai</link>
					<description><![CDATA[<p>
	<img alt="Revamping Documentation with AI" src="https://arm1.ru/img/uploaded/revamping-documentation-with-ai-1.webp" style="width: 100%;">
</p>

<p>
	Recently, I’ve been updating docs for the <a href="https://github.com/makoni/couchdb-swift">CouchdbClient</a> library. After struggling with some phrases, I decided to try AI to do that for me. Microsoft has <b>Copilot</b> as part of Bing search in the <b>Edge</b> browser.
</p>]]></description>
					<pubDate>Fri, 24 May 2024 17:18:07 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/revamping-documentation-with-ai</guid>
					<comments>https://arm1.ru/blog/revamping-documentation-with-ai#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.9</title>
					<link>https://arm1.ru/blog/appmetric-1-9</link>
					<description><![CDATA[<p>
    <img alt="AppMetric 1.9" src="https://arm1.ru/img/uploaded/appmetric-1.8.webp" style="width: 100%;">
</p>

<p>
   Обновил AppMetric для macOS - клиент для сервиса AppMetrica от Яндекса. 
</p>

<ul>
	<li>Исправлена ошибка, когда при выборе сегодняшней даты она не обновлялась при смене дня.</li>
	<li>Добавлено форматирование цифр показателей (в зависимости от языка и региона в системе).</li>
	<li>Небольшие исправления.</li>
</ul>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Загрузить" height="40" src="https://arm1.ru/img/mac_app_store_badge.svg" width="165"></a>
</p>]]></description>
					<pubDate>Tue, 23 Apr 2024 13:41:39 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/appmetric-1-9</guid>
					<comments>https://arm1.ru/blog/appmetric-1-9#comments</comments>
				</item>
            
                <item>
					<title>Creating a DMG File from the Terminal</title>
					<link>https://arm1.ru/blog/creating-a-dmg-file-from-terminal</link>
					<description><![CDATA[<p>
	<img alt="Creating a DMG file from Terminal" src="https://arm1.ru/img/uploaded/creating-a-dmg-file-from-terminal.webp" style="width: 100%;">
</p>

<p>
	Have you ever needed to package your application for distribution on macOS? The solution is simpler than you might think, and it's right at your fingertips in the Terminal. I recently stumbled upon a handy bash function that streamlines the creation of a DMG (Disk Image) file. Here's how to set it up:
</p>

<h2>Step 1: Edit Your Profile</h2>

<pre><code class="bash">nano ~/.zprofile</code></pre>

<h2>Step 2: Add the Bash Function</h2>

<p>
	Next, insert the following function into your <b>.zprofile</b>. This script utilizes the <b>hdiutil</b> command, which is built into macOS, to create an HFS+ filesystem within a DMG file.
</p>

<pre><code class="bash">dmg(){
    hdiutil create -fs HFS+ -srcfolder "$1" -volname "$2" "$2.dmg"
}
</code></pre>

<h2>Step 3: Save and Source Your Profile</h2>

<p>
	After adding the code, save the changes and exit `nano`. To make the function available immediately without restarting your terminal, source your profile:
</p>

<pre><code class="bash">source ~/.zprofile</code></pre>

<h2>Step 4: Use the Function</h2>

<p>
	Now, you can easily create a DMG file for any folder or application. For example, to create a DMG for the 'ModulbankInformer.app', simply run:
</p>

<pre><code class="bash">dmg ModulbankInformer.app ModulbankInformer</code></pre>

<p>
	This command will generate a <b>ModulbankInformer.dmg</b> file with the contents of the <b>ModulbankInformer.app</b> directory.
</p>

<p>
	And there you have it - a quick and efficient way to create DMG files directly from your Terminal!
</p>]]></description>
					<pubDate>Thu, 11 Apr 2024 21:33:56 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/creating-a-dmg-file-from-terminal</guid>
					<comments>https://arm1.ru/blog/creating-a-dmg-file-from-terminal#comments</comments>
				</item>
            
                <item>
					<title>Swift CouchDB client 1.5.0</title>
					<link>https://arm1.ru/blog/swift-couchdb-client-1-5-0</link>
					<description><![CDATA[<p>
	<img alt="Swift CouchDB client 1.5.0" src="https://arm1.ru/img/uploaded/swift-couchdb-client-1-5-0.webp" style="width: 100%;">
</p>

<p>
	And here we go, one more new version of the CouchDB client library. After the recent post about 1.4.0, <b>Swift on Server</b> released a new version of <b>async-http-client</b> that includes a new implementation of the client singleton. Now it's <b>HTTPClient.shared</b>, so I've updated the CouchDB library to adopt that change. This also means that you no longer need to call <b>httpClient.syncShutdown()</b> if the singleton is used. Additionally, they've bumped the minimum Swift version to 5.8 (which I aslo did in version 1.4.0 of the CouchDB client library). So, I'm keeping the library up to date.
</p>

<p>
	Changelog:
</p>

<ul>
	<li>Bumped the minimum version of <b>async-http-client</b> to the new 1.21.0. If you can't use it in your project, you can still stay on 1.4.0.</li>
	<li>The library will now use <b>HTTPClient.shared</b> (new in <b>async-http-client</b> 1.21.0) internally for requests if no <b>EventLoopGroup</b> is provided.</li>
	<li>No more internal calls for <b>httpClient.syncShutdown()</b> in case of <b>HTTPClient.shared</b> usage.</li>
</ul>

<p>
	<a href="https://github.com/makoni/couchdb-swift">CouchDB Client</a> on GitHub | <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient">Documentation</a> with examples and tutorials.
</p>
]]></description>
					<pubDate>Mon, 08 Apr 2024 21:27:09 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/swift-couchdb-client-1-5-0</guid>
					<comments>https://arm1.ru/blog/swift-couchdb-client-1-5-0#comments</comments>
				</item>
            
                <item>
					<title>Swift CouchDB client 1.4.0</title>
					<link>https://arm1.ru/blog/swift-couchdb-client-1-4-0</link>
					<description><![CDATA[<p>
	<img alt="Swift CouchDB client" style="width: 100%;" src="https://arm1.ru/img/uploaded/swift-couchdb-client-1-4-0.webp">
</p>

<p>
	A new version of CouchDB Client has been released:
</p>

<ul>
	<li>The library migrated from <b>HTTPClient.Response</b> to <b>HTTPClientResponse</b>, which is similar to <b>HTTPClient.Response</b> but used for the Swift Concurrency API. It also migrated from <b>HTTPClient.Body</b> to <b>HTTPClientRequest.Body</b>. These changes impact the <b>get</b> and <b>find</b> methods. Old methods are marked as deprecated, please refer to the <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient/"> documentation </a> for the updated methods.</li>
	<li>The minimum Swift version is now 5.8.</li>
	<li>The <b>CouchDBRepresentable</b> protocol is now marked as <b>Codable</b>.</li>
	<li>
		Additionally, a new data model called <b>RowsResponse</b>  has been added. It accepts a generic <b>CouchDBRepresentable</b> type, making it easier to retrieve rows from a database. For example:
		<pre><code class="swift">let decodeResponse = try JSONDecoder().decode(RowsResponse&lt;MyApp&gt;.self, from: data)</code></pre>
	</li>
	<li>Lastly, there have been small improvements in the documentation and tutorials.</li>
</ul>

<p>
	<a href="https://github.com/makoni/couchdb-swift">CouchDB Client</a> on GitHub | <a href="https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient">Documentation</a> with examples and tutorials.
</p>]]></description>
					<pubDate>Mon, 08 Apr 2024 11:11:39 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/swift-couchdb-client-1-4-0</guid>
					<comments>https://arm1.ru/blog/swift-couchdb-client-1-4-0#comments</comments>
				</item>
            
                <item>
					<title>A middleware for Vapor 4 routing to trim a slash in url path</title>
					<link>https://arm1.ru/blog/a-middleware-for-vapor4-to-trim-a-slash-in-url-path</link>
					<description><![CDATA[<p>
	It’s a common thing for a website or a backend to allow URLs like <b>mySite.com/webpage</b> and <b>mySite.Com/webpage/</b> for the same page. These pages are different URLs for a search engine. If you want to avoid duplicates, you can add a simple middleware to trim the ending slash and redirect a user.
</p>

<p>
	Here’s an example code for such a middleware class for Vapor 4:
</p>

<pre><code class="swift">final class TrimSlashInPathMiddleware: Middleware {
    func respond(to request: Request, chainingTo next: Responder) -&gt; EventLoopFuture&lt;Response&gt; {
        if request.url.path.count &gt; 1, request.url.path.hasSuffix("/") {
            let newPath = String(request.url.path.trimmingSuffix(while: { $0 == "/" }))
            let response = request.redirect(to: newPath, redirectType: .permanent)
            return request.eventLoop.makeSucceededFuture(response)
        }
        return next.respond(to: request)
    }
}</code></pre>

<p>
	Just add it to configure.swift file:
</p>

<pre><code class="swift">import Vapor

public func configure(_ app: Application) throws {
    app.middleware.use(TrimSlashInPathMiddleware())

    app.http.server.configuration.port = 8081

    try routes(app)
}
</code></pre>

<p>
	Works with Vapor 4.92.5.
</p>]]></description>
					<pubDate>Thu, 04 Apr 2024 15:08:16 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/blog/a-middleware-for-vapor4-to-trim-a-slash-in-url-path</guid>
					<comments>https://arm1.ru/blog/a-middleware-for-vapor4-to-trim-a-slash-in-url-path#comments</comments>
				</item>
            
	</channel>
</rss>
