<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Blog on Capslock</title><link>https://caps.pgsty.com/blog/</link><description>Recent content in Blog on Capslock</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 06 Nov 2026 19:02:03 +0800</lastBuildDate><atom:link href="https://caps.pgsty.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Capslock goes native</title><link>https://caps.pgsty.com/blog/post/capslock-goes-native/</link><pubDate>Fri, 06 Nov 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/post/capslock-goes-native/</guid><description>&lt;p&gt;For years Capslock was a configuration file. You installed Karabiner-Elements,&#10;imported a set of rules, and Caps Lock became Escape on a tap and a Hyper key&#10;on a hold. With Command, Option, Control and Shift it reached sixteen planes&#10;of shortcuts for the cursor, editing, windows, apps and the mouse.&lt;/p&gt;&#10;&lt;p&gt;That worked, and it kept two costs. Karabiner-Elements had to be installed,&#10;with its driver and its permissions, just to change one key. And the layout&#10;was a JSON file: to change a binding you edited that file, and to learn the&#10;layout you kept a picture of the keyboard open.&lt;/p&gt;</description></item><item><title>How Capslock works: F18, an event tap, and a mapping it gives back</title><link>https://caps.pgsty.com/blog/post/how-capslock-works/</link><pubDate>Fri, 06 Nov 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/post/how-capslock-works/</guid><description>&lt;p&gt;Caps Lock sits in the best spot on the keyboard and does the least useful job.&#10;Capslock gives it a new one: tap it for Escape, hold it for Hyper, and combine&#10;it with the four modifiers to reach sixteen control planes. This post explains&#10;how a native app does that on macOS without a kernel extension, a driver, or a&#10;privileged helper.&lt;/p&gt;&#10;&lt;h2 id="not-a-modifier"&gt;Caps Lock is not a modifier&#10;&lt;/h2&gt;&#10;&lt;p&gt;macOS does not report Caps Lock as a key that goes down and comes back up. It&#10;reports a lock state that flips, and it adds a short delay so that brushing the&#10;key does not toggle it. That is fine for typing capitals and useless for a&#10;modifier that must be held.&lt;/p&gt;</description></item><item><title>Capslock 0.4.0</title><link>https://caps.pgsty.com/blog/release/0.4.0/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/release/0.4.0/</guid><description>&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Release candidate&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;0.4.0 is in candidate acceptance. It has not been signed, notarized, or&#10;published for download yet. See &lt;a href="https://caps.pgsty.com/download/"&gt;Download&lt;/a&gt; for the current status.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="whats-new"&gt;What's new&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;A clearer first run.&lt;/strong&gt; Onboarding ends on the complete keyboard. You can&#10;browse it before granting keyboard access, and the app says plainly whether it&#10;is running your keyboard or only showing a preview.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Lessons follow your configuration.&lt;/strong&gt; The first Playground chapter now&#10;includes Hyper+Space. If you changed or disabled a key a lesson uses, the&#10;lesson says so. Safe Practice previews are marked differently from actions&#10;that really ran.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Profile behaviour travels with your mappings.&lt;/strong&gt; Choose what unmapped keys do&#10;and which modifier sides select a plane. An explicit pass-through is kept&#10;apart from a removed binding, and both survive Undo and export.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Recovery reports what it verified.&lt;/strong&gt; Restoring Caps Lock reports success&#10;only after the system mapping has been read back. When the mapping cannot be&#10;read, ownership is shown as unknown instead of guessed.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Clear local-data and trust boundaries.&lt;/strong&gt; Statistics explain what a trigger&#10;count is and how long it is kept. Shell approval explains that a command runs&#10;with your user privileges, may use the network, and is not undone by Pause or&#10;Undo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="since-candidate"&gt;Since the candidate was cut&#10;&lt;/h2&gt;&#10;&lt;p&gt;Work on 0.4.0 continued after the candidate was cut, and the following fixes&#10;are part of the same version:&lt;/p&gt;</description></item><item><title>Capslock 0.3.0</title><link>https://caps.pgsty.com/blog/release/0.3.0/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/release/0.3.0/</guid><description>&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Internal build&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;0.3.0 was a development build and was not distributed publicly.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Safer keyboard recovery.&lt;/strong&gt; Reconnecting a keyboard checks for remapper&#10;conflicts again. Differing per-device mappings are preserved instead of&#10;merged, and an explicit Pause cancels pending wake-up retries.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Stronger configuration handling.&lt;/strong&gt; Malformed numbers, duplicate document&#10;sections, and invalid fallback actions are rejected safely. An empty profile&#10;can be exported and restored, and a failed statistics write is retried.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;More reliable pointer controls.&lt;/strong&gt; Continuous movement follows the real&#10;cursor position, and releasing a chord cancels pending movement and&#10;scrolling.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Editor and diagnostics.&lt;/strong&gt; Menus follow language changes, and a diagnostics&#10;export can replace an existing archive.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Compatibility.&lt;/strong&gt; Mappings that reference a retired built-in action still&#10;load, and preview mode cannot change permissions or login items.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Capslock 0.2.0</title><link>https://caps.pgsty.com/blog/release/0.2.0/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/release/0.2.0/</guid><description>&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Internal build&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;0.2.0 was a development build and was not distributed publicly.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;The complete Classic layout is the default.&lt;/strong&gt; A fresh start loads every&#10;binding of the Capslock Classic profile instead of a minimal starter map.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;A keyboard-first editor.&lt;/strong&gt; The default view shows the sixteen named planes,&#10;the full main keyboard, and the numeric keypad together, with each mapped&#10;action written on its key.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Explicit Caps semantics.&lt;/strong&gt; Tapping Caps sends Escape. Hyper+Space sends the&#10;real Control-Space input-source shortcut. Hyper+Escape toggles the real Caps&#10;Lock.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;English and Chinese.&lt;/strong&gt; The app follows the system language, ships complete&#10;English and Simplified Chinese text, and falls back to English for other&#10;languages.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Auditable safety.&lt;/strong&gt; Imported executable actions lose their trust until you&#10;review them, and diagnostics and recovery never change Karabiner-Elements.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Capslock 0.1.0</title><link>https://caps.pgsty.com/blog/release/0.1.0/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://caps.pgsty.com/blog/release/0.1.0/</guid><description>&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Internal build&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;0.1.0 was a development build and was not distributed publicly.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Capslock Classic built in.&lt;/strong&gt; Every behaviour of the Classic profile has an&#10;explicit native counterpart, resolved exactly across sixteen planes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Two Hyper modes.&lt;/strong&gt; Classic Compatibility holds the right-side modifiers for&#10;Alfred, Moom, and existing shortcuts; Native Clean keeps the control layer&#10;private to Capslock.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Native editor and app overrides.&lt;/strong&gt; Inspect, rebind, disable, restore,&#10;validate, and undo or redo a key, and scope an action to one app by its exact&#10;bundle ID, without editing JSON by hand.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Hold-to-Reveal and Playground.&lt;/strong&gt; See the current named plane while you&#10;hold Caps, learn tap, hold, Hyper+Escape and H/J/K/L, then explore in Free&#10;Play.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Safe Practice and recovery.&lt;/strong&gt; Lessons block dangerous effects, and losing&#10;focus returns to live mode. Diagnostics can release synthetic input, restore&#10;Caps Lock, and export a redacted report.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Coexistence by default.&lt;/strong&gt; Existing non-Caps &lt;code&gt;hidutil&lt;/code&gt; mappings are kept,&#10;a Caps or F18 conflict stops activation, and Karabiner-Elements is never&#10;installed or reconfigured.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>