<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 侯惠阳</title>
    <description>The latest articles on DEV Community by 侯惠阳 (@_b6417cbb54ddfef4c4fd0).</description>
    <link>https://dev.to/_b6417cbb54ddfef4c4fd0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4081081%2F7983cfcd-eb29-49e0-9ea3-bae6ad7c797a.png</url>
      <title>DEV Community: 侯惠阳</title>
      <link>https://dev.to/_b6417cbb54ddfef4c4fd0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_b6417cbb54ddfef4c4fd0"/>
    <language>en</language>
    <item>
      <title>A Packaging Bug I Found in Homebrew Redis 8.10.0</title>
      <dc:creator>侯惠阳</dc:creator>
      <pubDate>Mon, 17 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/_b6417cbb54ddfef4c4fd0/a-packaging-bug-i-found-in-homebrew-redis-8100-411n</link>
      <guid>https://dev.to/_b6417cbb54ddfef4c4fd0/a-packaging-bug-i-found-in-homebrew-redis-8100-411n</guid>
      <description>&lt;p&gt;I recently installed Redis 8.10.0 with Homebrew for local development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;redis
brew services start redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installation completed normally, and Homebrew reported that the service had started. Its actual state in &lt;code&gt;brew services list&lt;/code&gt;, however, was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis  error  1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem was not that Redis itself could not run. The default configuration shipped in the bottle did not match the files included in that bottle. I reported the bug as &lt;a href="https://github.com/Homebrew/homebrew-core/issues/296698" rel="noopener noreferrer"&gt;Homebrew/homebrew-core#296698&lt;/a&gt;. As of August 11, 2026, the issue remains open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mismatch
&lt;/h2&gt;

&lt;p&gt;The bottle-provided &lt;code&gt;redis.conf&lt;/code&gt; enabled four modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;loadmodule ./modules/redisbloom/redisbloom.so
loadmodule ./modules/redisearch/redisearch.so
loadmodule ./modules/redisjson/rejson.so
loadmodule ./modules/redistimeseries/redistimeseries.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installed bottle contained none of the referenced &lt;code&gt;.so&lt;/code&gt; or &lt;code&gt;.dylib&lt;/code&gt; files. Redis read the directives, failed to load the missing modules, and exited.&lt;/p&gt;

&lt;p&gt;This is an easy failure to misread. “Successfully started” means the service command was submitted; it does not prove that the Redis process remained healthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the cause
&lt;/h2&gt;

&lt;p&gt;I compared the configuration with the installed artifacts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"loadmodule.*modules"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /opt/homebrew/Cellar/redis/8.10.0/.bottle/etc/redis.conf

find /opt/homebrew/Cellar/redis/8.10.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="se"&gt;\(&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.so"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.dylib"&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first command returned four active &lt;code&gt;loadmodule&lt;/code&gt; directives. The second found no corresponding module libraries. That configuration–artifact mismatch was the direct cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temporary workaround
&lt;/h2&gt;

&lt;p&gt;For local development that does not need these modules, the directives can be commented out before restarting Redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'s|^loadmodule ./modules/|#loadmodule ./modules/|'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /opt/homebrew/etc/redis.conf

brew services restart redis
redis-cli ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the change, &lt;code&gt;redis-cli ping&lt;/code&gt; returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PONG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a workaround, not an upstream fix. If an application depends on RedisBloom, RediSearch, RedisJSON, or RedisTimeSeries, disabling them is not an acceptable solution. In that case, use a distribution that explicitly includes the required modules or wait for the Homebrew bottle to be corrected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical lesson
&lt;/h2&gt;

&lt;p&gt;When a service fails to start, repeatedly reinstalling or restarting it rarely produces new information. A better sequence is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the real service state and exit code.&lt;/li&gt;
&lt;li&gt;Run the process in the foreground and read the direct error.&lt;/li&gt;
&lt;li&gt;Compare configuration declarations with installed artifacts.&lt;/li&gt;
&lt;li&gt;Make the smallest possible change to verify causality.&lt;/li&gt;
&lt;li&gt;Publish a reproducible report for the upstream maintainers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open-source contribution does not always begin with a code patch. A focused bug report with clear evidence and reliable reproduction steps can be just as useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Homebrew/homebrew-core/issues/296698" rel="noopener noreferrer"&gt;Homebrew Issue #296698&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io/docs/latest/develop/reference/modules/" rel="noopener noreferrer"&gt;Redis modules documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>debugging</category>
      <category>redis</category>
      <category>database</category>
      <category>devops</category>
    </item>
    <item>
      <title>Building CoreX: A Native Real-Time macOS Monitor in Swift</title>
      <dc:creator>侯惠阳</dc:creator>
      <pubDate>Mon, 17 Aug 2026 07:31:41 +0000</pubDate>
      <link>https://dev.to/_b6417cbb54ddfef4c4fd0/building-corex-a-native-real-time-macos-monitor-in-swift-1137</link>
      <guid>https://dev.to/_b6417cbb54ddfef4c4fd0/building-corex-a-native-real-time-macos-monitor-in-swift-1137</guid>
      <description>&lt;p&gt;I built &lt;strong&gt;CoreX&lt;/strong&gt; to answer a practical question: why does a Mac feel slow right now, why did its fans become audible, is memory pressure affecting the workload, and can those answers remain entirely on the device?&lt;/p&gt;

&lt;p&gt;CoreX is a native, local-first macOS system monitor. Its interface is built with &lt;strong&gt;Swift 6, SwiftUI, and AppKit&lt;/strong&gt;. Its sampler uses &lt;strong&gt;Mach, IOKit, Metal, Foundation, and Darwin&lt;/strong&gt; to observe aggregate and per-core CPU load, GPU activity, memory, storage, network throughput, uptime, and system thermal pressure. The main window supports diagnosis, the menu bar supports quick awareness, and settings determine how the tool fits into everyday work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Download CoreX 1.0 (macOS 14+, Apple Silicon)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://houhuiyang.com/downloads/CoreX-1.0-macOS-arm64.zip" rel="noopener noreferrer"&gt;Download CoreX-1.0-macOS-arm64.zip&lt;/a&gt; · approximately 2 MB&lt;br&gt;&lt;br&gt;
SHA-256: &lt;code&gt;ae116fe638e81e3b2acfa34dd531ebbe4251bfa2b3cae7074a223136a7ea321a&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkk0xwg31xgrmsabp4a1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkk0xwg31xgrmsabp4a1c.png" alt="CoreX system overview" width="799" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Product boundaries: more data is not automatically better
&lt;/h2&gt;

&lt;p&gt;System monitors tend to fall into two extremes. Some display a few percentages without enough context to explain a problem. Others expose every low-level counter and force the user to find the anomaly. CoreX uses three information layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Overview:&lt;/strong&gt; CPU, GPU, memory, storage, network, and thermal state for a fast health check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnosis:&lt;/strong&gt; per-core activity, P-core/E-core grouping, live histories, and device details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambient awareness:&lt;/strong&gt; a small menu-bar surface for the metrics that matter most.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sampling is separated from presentation. &lt;code&gt;SystemMonitor&lt;/code&gt; produces a normalized snapshot; SwiftUI consumes state. Historical series are bounded rather than allowed to grow forever. Pausing monitoring stops sampling, not merely animation. This keeps collection, presentation, and preferences independently testable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mach / IOKit / Metal / Darwin / Foundation
                    │
                    ▼
             SystemMonitor sampler
       deltas, normalization, and clamping
                    │
          ┌─────────┴─────────┐
          ▼                   ▼
    current Snapshot      bounded histories
          │                   │
          └─────────┬─────────┘
                    ▼
       SwiftUI Dashboard + MenuBarExtra
                    │
                    ▼
      AppStorage / alerts / launch policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reading real macOS state from Swift
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CPU: utilization is a delta between samples
&lt;/h3&gt;

&lt;p&gt;CPU times are cumulative counters. Treating a single read as instantaneous load is incorrect. CoreX calls Mach APIs including &lt;code&gt;host_statistics&lt;/code&gt; and &lt;code&gt;host_processor_info&lt;/code&gt; for user, system, nice, and idle ticks, retains the previous sample, and calculates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage = Δ(user + system + nice) / Δ(user + system + nice + idle)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same rule applies to aggregate and per-core load. On Apple Silicon, cores are grouped into performance and efficiency groups for presentation. A production implementation must handle the first sample, counter anomalies, allocated processor arrays, and value clamping to avoid misleading startup spikes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory: pressure matters more than a scary percentage
&lt;/h3&gt;

&lt;p&gt;CoreX uses &lt;code&gt;host_statistics64&lt;/code&gt; to read active, inactive, wired, compressed, and free pages. macOS deliberately uses spare memory for caching, so high usage alone is not proof of a problem. The interface combines the current value with history instead of turning one percentage red without context.&lt;/p&gt;

&lt;h3&gt;
  
  
  GPU: Metal identifies devices; IOKit attempts load sampling
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;MTLCopyAllDevices()&lt;/code&gt; supplies GPU identity and capabilities. Live utilization is read from &lt;code&gt;IOAccelerator&lt;/code&gt; performance statistics through IOKit. This is not a uniformly documented, stable metric across every macOS and hardware combination. If a driver does not expose the necessary field, CoreX reports the metric as unavailable instead of inventing zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage, network, and thermal state
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Storage uses &lt;code&gt;URLResourceValues.volumeTotalCapacity&lt;/code&gt; and &lt;code&gt;volumeAvailableCapacityForImportantUsage&lt;/code&gt;, which better reflects capacity available to important work.&lt;/li&gt;
&lt;li&gt;Network sampling aggregates active interfaces through &lt;code&gt;getifaddrs&lt;/code&gt;, excludes loopback, and derives upload and download rates from byte deltas. Interface switches and counter resets must be handled.&lt;/li&gt;
&lt;li&gt;Thermal pressure comes from &lt;code&gt;ProcessInfo.thermalState&lt;/code&gt;. It is an operating-system pressure signal—not a sensor temperature—so CoreX labels it nominal, fair, serious, or critical rather than fabricating degrees Celsius.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All readings are collected and rendered locally. CoreX requires no account and does not upload monitoring data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SwiftUI still needs AppKit
&lt;/h2&gt;

&lt;p&gt;SwiftUI is effective for dashboard cards, state-driven presentation, themes, and settings forms. A polished Mac utility also needs precise behavior for window activation, the Dock, application reopening, and the About panel. CoreX deliberately combines both frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WindowGroup&lt;/code&gt; owns the primary window and its sizing constraints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MenuBarExtra(.window)&lt;/code&gt; creates an interactive status surface.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NSApplicationDelegateAdaptor&lt;/code&gt; controls termination after the last window closes and restores a hidden window when the Dock icon is clicked.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NSApplication.setActivationPolicy&lt;/code&gt; switches between a regular app and a menu-bar-only utility.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SMAppService&lt;/code&gt; manages launch at login.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SwiftUI describes the interface; AppKit closes the lifecycle gaps. That is more robust than forcing a real macOS utility into a single-framework ideology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Settings are behavior, not decoration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famugdszkr82dcq5vscnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Famugdszkr82dcq5vscnh.png" alt="CoreX settings" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CoreX organizes preferences into Appearance, General, Monitoring, Notifications, Shortcuts, and About. Each setting is intended to connect to runtime behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system, light, or dark appearance; accent, density, corner radius, glass, and motion;&lt;/li&gt;
&lt;li&gt;launch at login, open-window or menu-bar startup, background operation, and Dock visibility;&lt;/li&gt;
&lt;li&gt;1/2/5-second intervals, enabled categories, and 60-second/5-minute/15-minute histories;&lt;/li&gt;
&lt;li&gt;icon-only, CPU, or CPU-and-GPU menu-bar content;&lt;/li&gt;
&lt;li&gt;CPU, memory, storage, and thermal-pressure notifications;&lt;/li&gt;
&lt;li&gt;shortcuts for opening the overview and pausing monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;@AppStorage&lt;/code&gt; persists preferences, but persistence is not implementation. A Dock setting must change the activation policy. A refresh interval must alter the sampling cadence. Closing behavior must reach the application delegate. I tested each preference as an end-to-end path from UI control to operating-system behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  The menu bar is the high-frequency surface
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fly98elzyjh7hifn7ksuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fly98elzyjh7hifn7ksuy.png" alt="CoreX menu-bar status" width="800" height="891"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The menu-bar panel deliberately limits itself to CPU, GPU, memory, current status, settings, update checks, and quit. It works well while compiling, running local models, processing video, or switching among heavy applications. The dashboard explains; the menu bar informs without interruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development and packaging environment
&lt;/h2&gt;

&lt;p&gt;CoreX uses Swift Package Manager, targets &lt;code&gt;macOS 14&lt;/code&gt;, and links IOKit and Metal. The development machine should use a matched Xcode or Command Line Tools installation. Mixing a Swift compiler and macOS SDK from different toolchain releases can produce an “SDK compiled by a different version of Swift” failure. A dependable release pipeline pins Xcode and builds in a clean environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;MacPulse
./scripts/build-app.sh
open dist/CoreX.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build script performs a release build, assembles the &lt;code&gt;.app&lt;/code&gt; bundle, generates icons, and signs the result. The current download is an &lt;strong&gt;arm64&lt;/strong&gt;, ad-hoc-signed build intended for evaluation and internal distribution. A broad public release should use a Developer ID Application certificate, Apple notarization, and a stapled notarization ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Macs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Current download&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Operating system&lt;/td&gt;
&lt;td&gt;macOS 14 Sonoma or newer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;Apple Silicon: M1, M2, M3, M4, and M5 families&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intel Macs&lt;/td&gt;
&lt;td&gt;Not supported by the current arm64 archive; the source can be extended to a universal build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;Not required during operation, except for update checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data handling&lt;/td&gt;
&lt;td&gt;Monitoring data remains on the device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU metric&lt;/td&gt;
&lt;td&gt;Availability depends on IOKit fields exposed by the system driver&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CoreX is particularly useful for developers, local-LLM users, designers, video professionals, and anyone who wants ongoing visibility into a Mac. It is not a data-center monitoring system, a remote alerting service, or a substitute for Apple Diagnostics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download, installation, and security
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://houhuiyang.com/downloads/CoreX-1.0-macOS-arm64.zip" rel="noopener noreferrer"&gt;Download CoreX 1.0&lt;/a&gt; and unzip it.&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;CoreX.app&lt;/code&gt; to Applications.&lt;/li&gt;
&lt;li&gt;On first launch, right-click the app and choose Open. If Gatekeeper blocks it, confirm Open Anyway under System Settings → Privacy &amp;amp; Security.&lt;/li&gt;
&lt;li&gt;Verify the archive if desired:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256 CoreX-1.0-macOS-arm64.zip
&lt;span class="c"&gt;# ae116fe638e81e3b2acfa34dd531ebbe4251bfa2b3cae7074a223136a7ea321a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test build is not Apple-notarized. That limitation must be explicit; users should not have to discover the release model from an unexplained Gatekeeper dialog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering lessons
&lt;/h2&gt;

&lt;p&gt;First, system monitoring is primarily a semantics problem, not a charting problem. Cumulative counters require deltas, missing metrics must remain missing, and thermal pressure must not masquerade as temperature.&lt;/p&gt;

&lt;p&gt;Second, native quality comes from behavioral closure. Windows, Dock policy, the menu bar, login launch, and preferences become features only when they are wired into the application lifecycle.&lt;/p&gt;

&lt;p&gt;Third, distribution is part of the product. Pinned toolchains, architecture labels, signing, notarization, hashes, and installation guidance belong in the design—not as release-day cleanup.&lt;/p&gt;

&lt;p&gt;Next steps for CoreX include more resilient GPU compatibility, stronger memory-pressure diagnosis, process-level attribution, a universal binary, and full Developer ID signing and notarization. For a local system utility, trust, accuracy, and low interruption matter more than adding another dashboard.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>swift</category>
      <category>programming</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
