<rss version="2.0">
	<channel>
		<title>Arm1.ru English</title>
		<link>https://arm1.ru/en/blog</link>
		<description>A blog about IT and software development.</description>
            
                <item>
					<title>Testing Qwen3.6-27B</title>
					<link>https://arm1.ru/en/blog/testing-qwen3-6-27b</link>
					<description><![CDATA[<p>
	<img alt="Тестирование Qwen3.6-27B" src="https://arm1.ru/img/uploaded/testing-qwen3-6-27b-1.webp" style="width: 100%;">
</p>

<p>
	Over the past few months I've tried out a lot of different local models. I have my own kind of benchmark for them — a file with a detailed spec for a notes editor for Linux written in Rust. Syntax highlighting (not hard, it's available out of the box in the system component) and a preview panel that should render formatted text. Overall, it's pretty similar to my Swifty Notes app, but in Rust.
</p>

<p>
	So, Qwen3.6-27B is so far the only model that's made it to the finish line. It worked for 3 days (not around the clock, only when I was at the computer and could guide it). Occasionally the model had issues with tool calls. Sometimes it couldn't edit a file and would just stop — I had to ask it to try again. Overall I'd give this part a 4 out of 5.
</p>

<p>
	The most important thing is that the model didn't go in circles. Rust is a great choice here: if there's an error, the project simply won't compile. Combined with the fact that the spec requires writing tests first and then the code (Test Driven Development), a lot of issues get caught and fixed at the earliest stages. And here the model performed pretty well. It fixed errors fairly quickly, followed the instructions from the spec, and consulted documentation if it suddenly used a nonexistent API or just needed to check what was available. A solid 4 out of 5 here.
</p>

<p>
	The model size is 17.5 GB. I downloaded it through LM Studio but ran it via llama.cpp — surprisingly, the performance there is significantly better, even though LM Studio supposedly uses llama.cpp under the hood. Maybe more recent versions of llama.cpp are just better optimized.
</p>

<p>
	The model doesn't fit entirely into VRAM (I have 16 GB), so it ran partially on the CPU, which heavily impacted speed. This whole thing was eating 15.94 GB of VRAM and another ~12 GB of RAM at peak (when the context was nearly full). I set the context size to 64k — at first that was plenty, but towards the end, as the codebase grew, the model would compact the context fairly often. Still, overall it handled a task of this size.
</p>

<p>
	<video style="width: 100%;" height="auto" controls preload="auto">
		<source src="/videos/testing-qwen3-6-27b.webm">
	</video>
</p>

<p>
	I'd give the speed a 2 out of 5.
</p>

<p>
	When the model reported that everything was done, I launched the app and saw raw HTML text in the preview panel instead of a rendered view. I had to ask the model to fix it, and after another hour and a half or two I got an acceptable result. That said, it's worth mentioning that this kind of thing happens all the time even with flagship models — large tasks rarely work on the first try and usually require revisions and clarifications.
</p>

<p>
	<img alt="Тестирование Qwen3.6-27B" src="https://arm1.ru/img/uploaded/testing-qwen3-6-27b-2.webp" style="width: 100%;">
</p>

<p>
	Bottom line: Claude Code would've done this task in 20–30 minutes, and I'd probably spend another 20–30 minutes finishing things up. Let's round up to 1 hour. With Qwen3.6-27B it took about 20 hours of continuous work in total, roughly 3 full working days. Of course, most of that time you're just sitting there watching the model work. Generation speed on the preliminary tests Claude helped me run was 12–18 tokens per second on my hardware.
</p>

<p>
	The speed difference is huge. The result is acceptable. A lot of the required functionality just doesn't work, but I blame the context size for that — it's hard for models to hold that much code in memory.
</p>

<p>
	Still, I'm happy with the result. It gives me hope that programming with local models on regular hardware is feasible. A year ago even cloud models were making similar mistakes, and local models of this size were simply not suitable for programming at all. Maybe in another year progress will get us to the point where subscriptions won't be needed for small projects. And I really like the trend that open-source free models have already caught up with the flagships from OpenAI and Anthropic.
</p>]]></description>
					<pubDate>Mon, 25 May 2026 11:30:42 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/testing-qwen3-6-27b</guid>
					<comments>https://arm1.ru/en/blog/testing-qwen3-6-27b#comments</comments>
				</item>
            
                <item>
					<title>Swift Adwaita: from 1.2.0 to 1.3.1</title>
					<link>https://arm1.ru/en/blog/swift-adwaita-from-1-2-0-to-1-3-1</link>
					<description><![CDATA[<p>
	After the <a href="https://arm1.ru/en/blog/swift-adwaita-1-1-0">1.1.0</a> release, the <b>swift-adwaita</b> library has shipped seven releases in a row. As I keep working on the first real application built with this wrapper, things keep surfacing that synthetic tests never catch — and almost every fix in this cycle came from there. The headline story: <b>swift-adwaita now builds and runs on macOS</b>, and along the way I stepped on a beautiful set of rakes involving Swift Concurrency inside the GLib main-loop, and carefully stepped back off.
</p>

<p>
	<img src="https://arm1.ru/img/uploaded/swift-adwaita-2.webp" alt="Swift Adwaita">
</p>

<h2>The story of a bug: async that never runs</h2>

<p>
	In <b>1.2.0</b> I collapsed all dialogs (<code>FileDialog</code>, <code>ColorDialog</code>, <code>FontDialog</code>) onto <code>async throws</code> and dropped the callback variants — felt cleaner that way. A day later it turned out that inside a running GTK application (<code>g_application_run</code>), code like <code>Task { @MainActor in await dialog.open(...) }</code> <b>simply never executes</b>. Swift's default main-actor executor is <code>DispatchQueue.main</code>, and the GLib main-loop doesn't drive it. The process looks alive, no errors surface, the button clicks — but the file dialog never appears.
</p>

<p>
	<b>1.2.1</b> urgently restored the callback variants for <code>FileDialog</code>, and <b>1.2.2</b> closed the hole completely: callback overloads were added for every async API (<code>Clipboard</code>, <code>ColorDialog</code>, <code>FontDialog</code>, <code>UriLauncher</code>, <code>Texture.load</code>). The async variants stay — they're useful for tests and non-GTK contexts — but inside GTK signal handlers the callback form is now the recommended default. The long-term fix (a custom <code>SerialExecutor</code> on top of GLib) is deferred as a separate task.
</p>

<h2>1.2.0: what landed in the API</h2>

<ul>
	<li>
		<b>Async image loading.</b> <code>Texture.load(from:)</code> decodes anything GdkPixbuf supports — PNG, JPEG, GIF, WebP, TIFF, BMP — off the main actor. That's a superset of what the native <code>gdk_texture_new_from_filename</code> handles.
	</li>

	<li>
		<b>Animated image playback.</b> <code>AnimatedImagePlayer</code> drives frames from a <code>GdkPixbufAnimation</code> into a <code>Picture</code> widget, with <code>start</code> / <code>stop</code> / <code>advanceFrame</code>.
	</li>

	<li>
		<b>Application.onOpen</b> and <code>Application.run(arguments:)</code> — file-open activation for apps registered with the <code>G_APPLICATION_HANDLES_OPEN</code> flag.
	</li>

	<li>
		<b>Runtime widget type checks.</b> <code>Widget.gtkType</code>, <code>isInstance(of:)</code>, and a stricter <code>tryCast</code> that now actually narrows the type instead of "successfully" casting any widget to anything.
	</li>

	<li>
		<b>Isolated deinits</b> on <code>GObjectRef</code>, <code>GVariant</code> and other wrappers — GObject release now always happens explicitly on the main actor, not on whichever random thread dropped the last reference.
	</li>

	<li>
		<b>Minimum toolchain bumped to Swift 6.2</b> — isolated deinit is experimental in 6.1, and the release toolchain refused to enable it.
	</li>
</ul>

<h2>1.2.3–1.2.5: conveniences and clipboard</h2>

<p>
	Three small releases about reaching for <code>CAdwaita</code> less often for routine things:
</p>

<ul>
	<li>
		<b>RGBA(hex:)</b> — CSS color parsing: <code>#RGB</code>, <code>#RGBA</code>, <code>#RRGGBB</code>, <code>#RRGGBBAA</code>.
	</li>

	<li>
		<b>IconTheme</b> — a wrapper around <code>gtk_icon_theme_get_for_display</code> with <code>addSearchPath(_:)</code> for app-local icons.
	</li>

	<li>
		<b>ApplicationFlags</b> as an <code>OptionSet</code>: <code>Application(id: "...", flags: [.handlesOpen, .nonUnique])</code> instead of raw bit masks.
	</li>

	<li>
		<b>MainContext.drainPending()</b> and <b>pump(for:)</b> — one-line replacements for the <code>while g_main_context_pending { g_main_context_iteration }</code> loop that every test suite kept reinventing.
	</li>

	<li>
		<b>Paste interception.</b> <code>Widget.onPasteClipboard</code>, the synchronous <code>Clipboard.containsImage</code> / <code>containsFiles</code> probes, async <code>readTexture</code> / <code>readFiles</code>, and <code>Texture.encodedPNGData()</code> — you can now intercept a pasted image in your editor and pipe it through your own import path, instead of letting GTK shove it in as text.
	</li>

	<li>
		<b>Silencing GTK-CRITICAL spam</b> from <code>GtkScrolledWindow</code> and misconfigured <code>GtkDropTarget</code> — an opt-in log filter plus the correct signatures for the <code>::enter</code> / <code>::motion</code> signals.
	</li>
</ul>

<h2>1.3.0: macOS as a development platform</h2>

<p>
	The main news of the cycle. <b>swift-adwaita now builds and runs on macOS 13+</b> on Apple Silicon. Linux remains the primary target platform, but you can now develop and test locally on a Mac without spinning up a VM.
</p>

<ul>
	<li>
		<b>Install via Homebrew:</b> <code>brew install libadwaita gtksourceview5 pkgconf adwaita-icon-theme</code>. Without <code>adwaita-icon-theme</code>, HeaderBar buttons and banners render empty — Homebrew doesn't pull it in transitively.
	</li>

	<li>
		<b>Required environment variable:</b> <code>XDG_DATA_DIRS=/opt/homebrew/share</code>, otherwise libadwaita can't find its GSettings schemas and aborts at startup.
	</li>

	<li>
		<b>DemoAppLib</b> — all 78 gallery examples now live in a separate library that downstream apps can link against directly. The <code>DemoApp</code> executable became a three-line shim.
	</li>

	<li>
		<b>Xcode example</b> in <code>examples/macos/DemoApp/</code> — a minimal Xcode 16+ project that wraps the gallery as a regular <code>.app</code> bundle. Cmd+R, and it works.
	</li>

	<li>
		<b>A parallel XCTest suite</b> for macOS. swift-testing on Apple platforms inserts autorelease-pool transitions between tests that conflict with the Cocoa CFRunLoop sources installed by <code>gtk_init</code> — everything aborts on the second test. XCTest doesn't do that, and the same coverage runs there. Linux keeps using swift-testing. Result: <b>1181 tests / 0 failures on macOS</b>.
	</li>

	<li>
		<b>Three Apple-specific bugs</b> that Linux/glibc happened to mask: <code>Variant.stringValue</code> returned nil for valid strings (a dangling pointer through <code>g_variant_type_checked_</code>); the localization helpers (<code>localized</code>, <code>nlocalized</code>) returned garbage when no translation was available (gettext returns the input pointer untouched, and the Swift→C bridge had already freed it); <code>MediaStream.timestamp</code> failed to compile because <code>gint64</code> is <code>long</code> on Linux x86_64 but <code>long long</code> on Apple arm64.
	</li>

	<li>
		<b>macOS CI job</b> on <code>macos-26</code> with Xcode 26.4.1 (Swift 6.3). Build only, no test runs: GitHub-hosted runners are headless, and GTK4-Quartz crashes without a WindowServer session.
	</li>

	<li>
		<b>REUSE 3.3</b> license metadata — SPDX headers in every source file, <code>reuse lint</code> reports clean.
	</li>
</ul>

<h2>1.3.1: cleanup</h2>

<p>
	A maintenance release with no API changes. I polished the paste-interception docs in the README, added <code>adwaita-icon-theme</code> to every macOS install snippet (stepped on it, wrote it down), and bumped the Xcode example's deployment target to macOS 26 so it matches what Homebrew now builds GTK4 against — otherwise the linker complains about every dylib.
</p>

<h2>What's next</h2>

<p>
	The big unsolved problem is still the Swift Concurrency ↔ GLib main-loop integration. Right now you can't write <code>Task { @MainActor in ... }</code> from a click handler in a GTK app, and that's frustrating. The long-term plan is a custom <code>SerialExecutor</code> that routes work through <code>g_idle_add_full</code> instead of <code>DispatchQueue.main</code>. The callback APIs cover every practical scenario today, but a proper executor will need to be written eventually.
</p>

<p>
	The project is open source under the MIT license. The source lives <a href="https://github.com/makoni/swift-adwaita/">on GitHub</a>, and the documentation with guides is <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="https://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, 19 May 2026 20:36:38 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/swift-adwaita-from-1-2-0-to-1-3-1</guid>
					<comments>https://arm1.ru/en/blog/swift-adwaita-from-1-2-0-to-1-3-1#comments</comments>
				</item>
            
                <item>
					<title>Video encoding with AV1 codec</title>
					<link>https://arm1.ru/en/blog/video-encoding-with-av1-codec</link>
					<description><![CDATA[<p>
	<img alt="Encoding video with the AV1 codec" src="https://arm1.ru/img/uploaded/video-encoding-with-av1-codec-1.webp" style="width: 100%;">
</p>

<p>
	A few months ago <a href="https://t.me/belbous">@belbous</a> was telling me about the <b>AV1</b> video codec — how great it is. Recently I decided to experiment with it. Turns out my Ubuntu laptop has the right hardware — an NVIDIA GPU with support for hardware AV1 encoding via NVENC. This capability only arrived with the RTX 40 series: on the 30 series and older, NVENC can decode AV1 but not encode it — for that you're stuck with software on the CPU. Thankfully, it's all integrated into <b>ffmpeg</b>, ready to use.
</p>

<p>
	With Claude Code's help, I dialed in the right settings using a handful of video files as test cases. The goal was to preserve quality while reducing file size. As a result, bitrate doesn't even appear in the configuration. What came out is a bash script that analyzes a video file with <b>ffprobe</b> and, depending on the resolution and color scheme, sets the <b>CQ</b> and other parameters.
</p>

<p>
	Claude Code didn't just pick values at random: it ran several passes on a clip of video, compared the input and output files, pulled out frames, and evaluated the quality itself, even describing the scenes it was comparing — a footprint in the snow, a landscape with trees, Dexter's face 😁.
</p>

<p>
	Initially, Claude Code based its approach on comparing three codecs — H.264, H.265 (aka HEVC), and AV1. The baseline assumption was: H.264 → H.265 yields about 50% compression, and H.265 → AV1 adds another ~30% at the same quality. That said, those 30% apply to software encoders (libaom, SVT-AV1) — hardware AV1 in NVENC runs many times faster, but at the same bitrate it loses to them in quality. I was mainly after disk space savings, so the tradeoff suited me.
</p>

<p>
	On the side, I downmixed the audio to stereo with the Opus codec, since I'm going to be watching on a TV with regular (and pretty mediocre) stereo sound anyway, and I planned to play it from an iPad — which, historically, for some reason can't output 5.1 audio over HDMI (instead of sound, you get hissing).
</p>

<p>
	<img alt="Encoding video with the AV1 codec" src="https://arm1.ru/img/uploaded/video-encoding-with-av1-codec-2.webp" style="width: 100%;">
</p>

<p>
	The results are impressive. An episode of <i>Foundation</i> — 4K, HEVC, HDR — shrank from 10.2 GB down to 2 GB. Five times smaller! At visually the same picture quality. To be fair, though: the 5x compression here isn't pure AV1 efficiency so much as a consequence of the source having a very high bitrate (rips usually leave a generous margin). On files that are already compressed more tightly, the gains will be more modest.
</p>

<p>
	A 45-minute episode took about 15 minutes to re-encode. For 4K video, that's very fast. And a 50-minute episode of <i>Dexter</i> in 1080p SDR re-encodes in just 5 minutes. Beautiful.
</p>

<p>
	But there are downsides — out of the box, NVENC doesn't support HDR10+ or Dolby Vision, so that dynamic metadata gets lost during re-encoding. Regular HDR10 with static metadata passes through fine, so basic HDR is intact — the problem is only with the extended formats. There's some workaround where you encode that part separately and splice it back in afterward, but I decided not to bother — my TV isn't all that fancy, it wouldn't have displayed HDR10+ or Dolby Vision anyway. You could also use a different codec that does everything on the CPU — better quality there, and metadata is preserved — but then this same 4K episode would take many hours instead of 15 minutes. So it looks like I've landed on the perfect quality/time balance.
</p>]]></description>
					<pubDate>Mon, 18 May 2026 13:08:33 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/video-encoding-with-av1-codec</guid>
					<comments>https://arm1.ru/en/blog/video-encoding-with-av1-codec#comments</comments>
				</item>
            
                <item>
					<title>Video players for Linux</title>
					<link>https://arm1.ru/en/blog/video-players-for-linux</link>
					<description><![CDATA[<p style="text-align: center;">
	<img alt="Video players for Linux" src="https://arm1.ru/img/uploaded/video-players-for-linux.webp" style="width: 100%;">
</p>

<p>
	Today at an IT breakfast meetup I was singing the praises of Video Player — a video player from GNOME, formerly known as Showtime. As far as I understand, at some point it became the default video player, including in the latest version of Ubuntu.
</p>

<p>
	I like its minimalism, it plays the files I need, and I appreciate that when you pick an audio track it shows the name of the translation (the dubbing studio) — for some reason not every player does this.
</p>

<p>
	Got home, decided to compare it with other players, opened a file with HDR and Dolby Vision — looks like I praised it a bit too soon. In the screenshot, from top to bottom: Video Player (Showtime), <a href="https://github.com/diegopvlk/Cine">Cine</a>, and VLC.
</p>

<p>
	All three render the colors differently. I think I'll switch to Cine. Judging by its repo, it's a fairly young video player. Like Showtime, it's also based on MPV and written in Python. It just develops more actively, updates ship more often, and — most importantly — the colors come out right. Showtime, as far as I remember, has had issues with HDR for years now, and updates only come out every three to six months.
</p>

<p>
	VLC is a legend, of course — it can play just about anything that's playable — but the interface, in my opinion, has aged quite a bit. Time to make room for the new generation.
</p>]]></description>
					<pubDate>Fri, 15 May 2026 13:05:40 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/video-players-for-linux</guid>
					<comments>https://arm1.ru/en/blog/video-players-for-linux#comments</comments>
				</item>
            
                <item>
					<title>Swifty Notes - a markdown notes manager for Linux in Swift</title>
					<link>https://arm1.ru/en/blog/swifty-notes-a-markdown-notes-manager-for-linux-in-swift</link>
					<description><![CDATA[<p style="text-align: center;">
	<img alt="Swift Notes for Linux" src="https://arm1.ru/img/uploaded/swift-notes-1.0.0.webp" style="width: 100%;">
</p>

<p>
	After shipping <a href="https://github.com/makoni/swift-adwaita">swift-adwaita</a>, I've been focused on building a first app using it. Something simple, but handy for myself. So now the first app has been shipped.
</p>

<p>
	Swifty Notes is a native GTK/libadwaita Markdown notes application for Linux written in Swift.
</p>

<p>
	The desktop app is the primary experience: write, organize, and preview Markdown notes with native GTK widgets, autosave, remembered workspace state, and adjustable editor settings such as font size, wrapping, indentation, and appearance.
</p>

<p>
	The included CLI works on the same file-backed notes so shell scripts, automation, and AI agents can safely inspect or update notes without a separate database or background service.
</p>

<ul>
	<li>
		Create, rename, duplicate, export, and delete Markdown notes.
	</li>

	<li>
		Autosave edits, remember workspace state, and keep note-local image assets together with each note.
	</li>

	<li>
		Adjust editor font size and other writing preferences to fit different screens and workflows.
	</li>

	<li>
		Choose where notes are stored, including a cloud-synced folder, so the same plain files can stay in sync across devices.
	</li>

	<li>
		Import images with drag and drop and render Markdown with a native GTK preview instead of a web view.
	</li>

	<li>
		Use the CLI for JSON-friendly note automation from scripts, shell pipelines, and AI agents.
	</li>
</ul>

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

<p style="text-align: center;">
	<a href="https://flathub.org/en/apps/me.spaceinbox.swiftynotes"><img style="height: 56px;" height="56" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
</p>

<p>
	Swifty Notes for Linux is an open source project, source code is available on <a href="https://github.com/makoni/swifty-notes-gtk" target="_blank">GitHub</a>.
</p>

<p>
	<a class="github-button" href="https://github.com/makoni/swifty-notes-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 Swifty Notes on GitHub">Star</a>
	<a class="github-button" href="https://github.com/makoni/swifty-notes-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 Swifty Notes 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>Fri, 10 Apr 2026 14:00:22 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/swifty-notes-a-markdown-notes-manager-for-linux-in-swift</guid>
					<comments>https://arm1.ru/en/blog/swifty-notes-a-markdown-notes-manager-for-linux-in-swift#comments</comments>
				</item>
            
                <item>
					<title>Swift Adwaita 1.1.0</title>
					<link>https://arm1.ru/en/blog/swift-adwaita-1-1-0</link>
					<description><![CDATA[<p>
	<img alt="Swift Adwaita" src="https://arm1.ru/img/uploaded/swift-adwaita-2.webp" style="width: 100%;">
</p>

<p>
	Swift Adwaita 1.1.0 has been released. I’ve been working on a first app built with this library, so I’ve extended it and fixed some bugs.
</p>

<h2>Highlights</h2>

<ul>
	<li>
		Added <b>GtkSourceView</b> integration with typed Swift wrappers for source editing, syntax highlighting, languages, and style schemes.
	</li>

	<li>
		Expanded widget APIs around popovers, windows, calendar compatibility, and runtime lifecycle handling.
	</li>

	<li>
		Improved release stability with better GLib main-loop integration, broader CI coverage, and additional regression tests.
	</li>
</ul>

<h2>Added</h2>

<ul>
	<li>
		<b>SourceView</b>, <b>SourceBuffer</b>, <b>SourceLanguage</b>, <b>SourceLanguageManager</b>, <b>SourceStyleScheme</b>, and <b>SourceStyleSchemeManager</b>.
	</li>

	<li>
		Typed identifiers for GtkSource languages and style schemes.
	</li>

	<li>
		A new source editor demo example.
	</li>

	<li>
		<b>MainContext.task { ... }</b>, <b>task(after:)</b>, and <b>task(every:)</b> as cancellable GLib main-loop work handles.
	</li>

	<li>
		Async MainContext.run, yield, and sleep(for:) helpers for bridging Swift concurrency onto the GLib loop safely.
	</li>

	<li>
		<b>Widget.unparent()</b> and <b>PopoverMenu.unparent()</b>.
	</li>

	<li>
		Convenience presentation helpers for <b>Popover</b> and <b>PopoverMenu</b>.
	</li>

	<li>
		Additional regression tests for widget/window parent-chain lookup and expanded coverage for source editing and media behavior.
	</li>
</ul>

<h2>Changed</h2>

<ul>
	<li>
		<b>GtkWindow.present()</b> now retains windows until close, making transient or locally scoped windows safer to use.
	</li>

	<li>
		<b>Widget.window</b> now resolves the containing window through the widget parent chain instead of assuming the GTK root is always a window.
	</li>

	<li>
		Calendar date handling now uses a GTK compatibility shim so the package builds cleanly across older and newer GTK versions.
	</li>

	<li>
		Documentation generation and hosted docs configuration were updated.
	</li>

	<li>
		CI now installs and tests with GtkSourceView 5 system dependencies.
	</li>
</ul>

<h2>Fixed</h2>

<ul>
	<li>
		Fixed deferred signal/user-data cleanup to release captured closures through the GLib main loop instead of Swift main-queue tasks, avoiding lifecycle issues in GTK applications.
	</li>

	<li>
		Fixed a common GTK scheduling pitfall by offering a Task-like API that stays on the GLib main loop instead of <b>DispatchQueue.main</b>.
	</li>

	<li>
		Fixed Swift 6.1 serialized suite visibility issues in the test suite.
	</li>

	<li>
		Fixed the popover/window regression tests to avoid GTK crash paths in CI while still validating the intended behavior.
	</li>

	<li>
		Fixed release documentation and installation instructions to include GtkSourceView 5 development packages.
	</li>
</ul>

<h2>Documentation and CI</h2>

<ul>
	<li>
		Added an API documentation link to the README.
	</li>

	<li>
		Updated installation instructions for Ubuntu/Debian and Fedora.
	</li>

	<li>
		Improved inline documentation consistency across the wrapper API.
	</li>

	<li>
		Extended CI coverage for documentation, formatting, and Swift 6.1 / 6.2 / 6.3 test runs.
	</li>
</ul>

<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="https://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>Fri, 10 Apr 2026 08:56:33 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/swift-adwaita-1-1-0</guid>
					<comments>https://arm1.ru/en/blog/swift-adwaita-1-1-0#comments</comments>
				</item>
            
                <item>
					<title>HTMLEditor for SwiftUI 1.1.0</title>
					<link>https://arm1.ru/en/blog/html-editor-for-swiftui-1-1-0</link>
					<description><![CDATA[<p>
	<img alt="HTMLEditor for SwiftUI 1.1.0" src="https://arm1.ru/img/uploaded/html-editor-for-swiftui-1-1-0.webp" style="width: 100%;">
</p>

<p>
	This release focuses on Swift 6.3 compatibility, a substantial rewrite of the editor's highlighting pipeline, and much better responsiveness when editing very large HTML documents.
</p>

<h3>Added</h3>

<ul>
	<li>
		Added the <b>HTMLEditorBenchmarks</b> executable target for repeatable performance measurements.
	</li>

	<li>
		Added benchmark support for full-plan highlighting, overlap reuse, edit invalidation, visible-highlight remapping, and large-document local repaint paths.
	</li>

	<li>
		Added focused regression tests for:
		<ul>
			<li>
				planner cache reuse and document-scoped invalidation
			</li>

			<li>
				invalid <b>NSRange</b> and UTF-16 edge cases
			</li>

			<li>
				quoted and unquoted attribute value highlighting
			</li>

			<li>
				visible highlight state remapping
			</li>

			<li>
				block-based highlight coverage
			</li>

			<li>
				large-document editing and scrolling policies
			</li>
		</ul>
	</li>
</ul>

<h3>Changed</h3>

<ul>
	<li>
		Refactored the editor runtime into smaller focused components, including separate coordinator lifecycle, viewport, editing, policy, coverage, structural-range, and visible-highlight-state files.
	</li>

	<li>
		Refactored the syntax highlighter into planner- and builder-based components for clearer separation of scanning, planning, and application.
	</li>

	<li>
		Moved the editor to an adaptive runtime model that changes behavior based on document size instead of treating all HTML documents the same way.
	</li>
</ul>

<h3>Improved</h3>

<ul>
	<li>
		Greatly improved large-document editing performance with:
		<ul>
			<li>
				viewport-first highlighting
			</li>

			<li>
				document-scoped planner caches and targeted invalidation
			</li>

			<li>
				cached visible-range plans
			</li>

			<li>
				block-based highlight coverage tracking
			</li>

			<li>
				structural dirty-range alignment around edits
			</li>

			<li>
				two-phase large-file editing with immediate micro-pass and deferred wider repaint
			</li>

			<li>
				burst-coalesced edit repainting
			</li>

			<li>
				scroll-idle semantic highlighting
			</li>

			<li>
				deferred binding synchronization for large documents
			</li>

			<li>
				<b>allowsNonContiguousLayout</b> enabled automatically in large-file mode
			</li>
		</ul>
	</li>

	<li>
		Improved highlight stability while typing in the middle of very large HTML by preserving visible overlay state and reducing repaint churn around the caret.
	</li>

	<li>
		Improved performance tuning and observability for large files with dedicated benchmark coverage and runtime probes.
	</li>
</ul>

<h3>Fixed</h3>

<ul>
	<li>
		Fixed compilation and concurrency issues needed for <b>Swift 6.3</b>
compatibility.
	</li>

	<li>
		Fixed several editor update-path issues related to coordinator state, highlighting tasks, and main-actor behavior.
	</li>

	<li>
		Fixed highlight regressions and edge cases involving:
		<ul>
			<li>
				partial tags
			</li>

			<li>
				empty input
			</li>

			<li>
				large payloads
			</li>

			<li>
				attribute-value coloring
			</li>

			<li>
				visible highlight loss during large-file editing
			</li>

			<li>
				invalid or clipped visible ranges
			</li>
		</ul>
	</li>
</ul>

<h3>Notes</h3>

<ul>
	<li>
		Full-document semantic highlighting is still used for smaller HTML inputs.
	</li>

	<li>
		Very large HTML inputs now automatically switch to a more conservative, performance-oriented editing mode to keep scrolling and typing responsive.
	</li>
</ul>

<p>
	Try it on GitHub: <a href="https://github.com/makoni/HTMLEditor-SwiftUI">https://github.com/makoni/HTMLEditor-SwiftUI</a>
</p>

<p>
	<a class="github-button" href="https://github.com/makoni/HTMLEditor-SwiftUI" 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/HTMLEditor-SwiftUI on GitHub">Star</a>

	<a class="github-button" href="https://github.com/makoni/HTMLEditor-SwiftUI/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/HTMLEditor-SwiftUI 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>Mon, 06 Apr 2026 17:39:07 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/html-editor-for-swiftui-1-1-0</guid>
					<comments>https://arm1.ru/en/blog/html-editor-for-swiftui-1-1-0#comments</comments>
				</item>
            
                <item>
					<title>Swift Adwaita library</title>
					<link>https://arm1.ru/en/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="https://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/en/blog/swift-adwaita-library</guid>
					<comments>https://arm1.ru/en/blog/swift-adwaita-library#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift 2.4.0</title>
					<link>https://arm1.ru/en/blog/couchdb-client-for-swift-2-4-0</link>
					<description><![CDATA[<p>
	<img src="https://arm1.ru/img/uploaded/couchdb-client-swift.webp" style="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>

<p>
	<a class="github-button" href="https://github.com/makoni/couchdb-swift" 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/couchdb-swift on GitHub">Star</a>

	<a class="github-button" href="https://github.com/makoni/couchdb-swift/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/couchdb-swift 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, 28 Mar 2026 20:36:59 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/couchdb-client-for-swift-2-4-0</guid>
					<comments>https://arm1.ru/en/blog/couchdb-client-for-swift-2-4-0#comments</comments>
				</item>
            
                <item>
					<title>Actioneer for Linux 1.0.8</title>
					<link>https://arm1.ru/en/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 style="width: 182px;" 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 style="width: 182px;" 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/en/blog/actioneer-for-linux-1-0-8</guid>
					<comments>https://arm1.ru/en/blog/actioneer-for-linux-1-0-8#comments</comments>
				</item>
            
                <item>
					<title>Actineer for Linux got translations</title>
					<link>https://arm1.ru/en/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 style="width: 182px;" 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 style="width: 182px;" 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/en/blog/actioneer-for-linux-got-translations</guid>
					<comments>https://arm1.ru/en/blog/actioneer-for-linux-got-translations#comments</comments>
				</item>
            
                <item>
					<title>Recent updates for Actioneer for Linux</title>
					<link>https://arm1.ru/en/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 style="width: 182px;" 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 style="width: 182px;" 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/en/blog/actioneer-1-02-1-05</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/claw-screenshot-0-1-0</guid>
					<comments>https://arm1.ru/en/blog/claw-screenshot-0-1-0#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.14.0</title>
					<link>https://arm1.ru/en/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 version 1.14.0 has been released.
</p>

<h3>New</h3>

<ul>
	<li>Settings window with a "Launch at login" toggle.</li>
	<li>Updated app icons for Liquid Glass.</li>
</ul>


<h3>Improvements</h3>

<ul>
	<li>Faster and more stable updates: parallel requests with backoff during rate limits, while respecting the daily quota.</li>
	<li>Popovers now adapt to their content.</li>
	<li>Improved date formatting in charts.</li>
</ul>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Download" src="https://arm1.ru/img/mac_app_store_badge.svg" style="width: 165px;"></a>
</p>
]]></description>
					<pubDate>Wed, 21 Jan 2026 11:49:42 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/appmetric-1-14-0</guid>
					<comments>https://arm1.ru/en/blog/appmetric-1-14-0#comments</comments>
				</item>
            
                <item>
					<title>Actioneer 1.01</title>
					<link>https://arm1.ru/en/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" style="width: 165px;"></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/en/blog/actioneer-1-01</guid>
					<comments>https://arm1.ru/en/blog/actioneer-1-01#comments</comments>
				</item>
            
                <item>
					<title>CompareShots 1.7</title>
					<link>https://arm1.ru/en/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/en/blog/compareshots-1-7</guid>
					<comments>https://arm1.ru/en/blog/compareshots-1-7#comments</comments>
				</item>
            
                <item>
					<title>Actioneer for Linux</title>
					<link>https://arm1.ru/en/blog/actioneer-for-linux</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="https://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/en/blog/actioneer-for-linux</guid>
					<comments>https://arm1.ru/en/blog/actioneer-for-linux#comments</comments>
				</item>
            
                <item>
					<title>Actioneer - Command your CI</title>
					<link>https://arm1.ru/en/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" style="width: 165px;""></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/en/blog/actioneer-command-your-ci</guid>
					<comments>https://arm1.ru/en/blog/actioneer-command-your-ci#comments</comments>
				</item>
            
                <item>
					<title>CompareShots 1.6</title>
					<link>https://arm1.ru/en/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/en/blog/compareshots-1-6</guid>
					<comments>https://arm1.ru/en/blog/compareshots-1-6#comments</comments>
				</item>
            
                <item>
					<title>HTMLEditor for SwiftUI 1.0.3</title>
					<link>https://arm1.ru/en/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/en/blog/htmleditor-for-swiftui-1-0-3</guid>
					<comments>https://arm1.ru/en/blog/htmleditor-for-swiftui-1-0-3#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift 2.3.0</title>
					<link>https://arm1.ru/en/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>

<p>
	<a class="github-button" href="https://github.com/makoni/couchdb-swift" 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/couchdb-swift on GitHub">Star</a>

	<a class="github-button" href="https://github.com/makoni/couchdb-swift/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/couchdb-swift 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>Fri, 01 Aug 2025 19:25:49 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/couchdb-client-for-swift-2-3-0</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/a-story-of-one-bug-in-leaf</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/a-swift-package-for-spell-checking-using-yandex-speller</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/swiftui-text-editor-for-macos-with-html-syntax-highlighting</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/recent-updates-of-my-projects-july-2025</guid>
					<comments>https://arm1.ru/en/blog/recent-updates-of-my-projects-july-2025#comments</comments>
				</item>
            
                <item>
					<title>AppMetric 1.13.0</title>
					<link>https://arm1.ru/en/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 version 1.13.0 has been released. Now on Swift 6, I've slightly tweaked the UI and removed the popover opening on launch (except for the first launch) — I concluded that it was rather annoying, especially if the app launches automatically after a reboot. Also added localization for several new languages. 
</p>

<p style="text-align: center;">
    <a href="https://apps.apple.com/ru/app/appmetric/id1147094095?mt=12" target="_blank"><img alt="Download" src="https://arm1.ru/img/mac_app_store_badge.svg" style="width: 165px;"></a>
</p>
]]></description>
					<pubDate>Mon, 19 May 2025 08:00:34 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/appmetric-1-13-0</guid>
					<comments>https://arm1.ru/en/blog/appmetric-1-13-0#comments</comments>
				</item>
            
                <item>
					<title>CouchDB client for Swift version 2</title>
					<link>https://arm1.ru/en/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>

<p>
	<a class="github-button" href="https://github.com/makoni/couchdb-swift" 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/couchdb-swift on GitHub">Star</a>

	<a class="github-button" href="https://github.com/makoni/couchdb-swift/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/couchdb-swift 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>Wed, 16 Apr 2025 09:48:58 +0300</pubDate>
					<guid isPermaLink="true">https://arm1.ru/en/blog/couchdb-client-for-swift-version-2</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/adding-translations-to-an-app-or-a-package-with-ai-help</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/localizing-a-swift-package-with-a-string-catalog</guid>
					<comments>https://arm1.ru/en/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/en/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/en/blog/funny-thing-in-macos-sequoia-with-iphone-mirroring</guid>
					<comments>https://arm1.ru/en/blog/funny-thing-in-macos-sequoia-with-iphone-mirroring#comments</comments>
				</item>
            
	</channel>
</rss>
