Blog
Blog
A list of articles with technical notes and development insights.
Blog Tags- Basic policy when implementing an API server with Golang
I have organized my own basic policies when writing an API server in Go, including single binary + cobra, operation focus, HTTP/CLI separation, secure error handling, and graceful shutdown.
- A Design Guide to Building an iOS Self-Control App with the Screen Time API
From the NEDNSProxyProvider dead end to a FamilyControls + ManagedSettings design, the two Shield Extensions, App Group unlock handoff, and Personal Team limitations. This article summarizes the full picture of building an iOS blocking app with the Screen Time API.
- K-POP Songs IT Engineers Should Listen To
5 recommended K-POP tracks featuring IT terms and cyber concepts. Picks include aespa's metaverse, NCT DREAM's glitch, and STAYC's "GPT" — music where you can feel technology through visuals and sound.
- TypeScript Monorepo Best Practices for 2026
A practical TypeScript monorepo guide for 2026. Compare pnpm + Turborepo vs pnpm + Biome, when to use Project References, and when each setup makes sense.
- Implement Unlock Handoff from Shield Extension to the Main App via App Group
You cannot launch the main app directly from ShieldActionDelegate. This explains a handoff pattern where the extension writes an unlock request into App Group shared storage and the app reads it later.
- Design self-limiting blocks for iOS with FamilyControls + ManagedSettings
How the three elements of AuthorizationCenter, FamilyActivityPicker, and ManagedSettings are combined. We have organized the reasons why a token-based design should be used instead of free text domain input and the framework of its implementation.
- Do not select NEDNSProxyProvider when creating a site block on iOS
We recorded an investigation into the technical and policy problems of using NEDNSProxyProvider in self-control iOS apps distributed on the App Store, leading up to the decision to migrate to the Screen Time API.
- You Cannot Run Family Controls on a Real Device with a Personal Team
A free Personal Team account cannot obtain the Family Controls Development entitlement. This explains why joining the Apple Developer Program becomes a prerequisite for real-device testing and what else is affected.
- An iOS Shield UI Needs Two Extensions, Not One
The shield UI shown by ManagedSettings is made up of two separate targets: an Action Extension and a Configuration Extension. This article organizes the correct NSExtensionPointIdentifier values and principal classes.
- Published SolidJS Best Practices as a Skill on skills.sh
A record of publishing SolidJS best practices on skills.sh using Claude Code's skill feature. Covers how description precision determines trigger accuracy, and the process of verifying differences through with/without testing.
- M4 Mac mini Setup
I found an M4 Mac mini heavily discounted in a strange Amazon sale, used up some saved points, and bought it. This is a record of the setup work I did while keeping future NixOS-based management in mind.
- Everything That Went Wrong Publishing @hsblabs/web-stream-extras to npm
A chronological account of failures when moving from manual publish to GitHub Actions + npm Trusted Publisher. Covers the provenance 422, tag and version ordering, and pre-publish validation.
- Releasing @hsblabs/web-stream-extras
A small TypeScript utility library for working with ReadableStream<Uint8Array> in browsers and Node.js — covering byte conversion helpers, transform streams, and stream encryption via the Web Crypto API.
- Encrypting a Byte Stream in the Browser with Web Crypto
Web Crypto gives you strong primitives but no stream interface. This post shows how to encrypt ReadableStream<Uint8Array> using the encryption subpath of @hsblabs/web-stream-extras — covering file encryption, per-stream key management, and pipeline composition.
- I Got Tired of Rewriting the Same Web Streams Boilerplate
Why I packaged my recurring ReadableStream<Uint8Array> utilities into @hsblabs/web-stream-extras — covering the three patterns I kept rewriting, the ByteTransformStream base, and stream encryption via Web Crypto.
- AWS Cross-Region VPC Peering Failure Log
Got stuck setting up VPC peering between Osaka and Tokyo. Forgot --peer-region, ended up in failed state, couldn't delete it.
- My Notes on `Cache-Control: max-age=3, must-revalidate`
A breakdown of the behavior behind a micro-caching Cache-Control setting. This article covers what `max-age=3` plus `must-revalidate` actually does, a timeline of how it behaves, and concrete use cases.
- Implementing a Development-Only Live Editor in Astro Projects
How to implement a browser-based editor limited to development mode in Astro. Using Vite middleware and React to make development content management comfortable without affecting production builds at all.
- Mobile App Configuration from a Web Engineer's Perspective: Startup-Time Metadata Retrieval Approach
Organizing challenges in mobile app domain management and versioning from the perspective of web frontend and infrastructure experience. Proposing a startup-time metadata retrieval approach using CloudFront and S3, with comparisons to existing solutions like Firebase Remote Config.
- Why /blog Returns 404 in Astro + bun dev and How to Fix It
A practical troubleshooting flow for /blog 404 under Astro + bun dev, from link checks to route output and delivery path inspection. Includes the directory-name collision fix.
- How to Fix mise Version Pinning Not Working on Codex Cloud
mise install bun succeeds but bun returns command not found on Codex Cloud. Root cause and fix using setup.sh with mise use -g and mise activate.
- Lefthook Setup Procedure: Run Biome Automatically in pre-commit and pre-push
A practical Lefthook setup procedure to run Biome formatting and linting automatically at commit and push time. Covers the full flow from ADR documentation to configuration, installation, and verification.
- Analyze Dependencies Included in Build Artifacts
Binaries built with Go embed metadata about dependencies and build settings.
- I Built personality-analyzer, a Personality Analysis Skill for Claude
A development note on a skill that outputs HEXACO and MBTI scores in YAML format from conversations with Claude. An attempt to quantify personality traits from AI chat logs.
- Automating Encrypted Directory Backups with age and tar
A shell script that combines age and tar to create encrypted archives for each subdirectory. It keeps CLI-friendly file names even when directory names contain Japanese characters.
- UUID v7 implementation guide: Create with JavaScript, Go, and Shell
The bit structure of UUID v7, bit settings of version/variant, minimum implementation in JavaScript, Go, and Shell, check items during implementation, and RFC references are organized on one page. A practical guide that summarizes the points to check in the generation logic for developers who want to safely introduce IDs that are easy to sort in time series. It can be used for confirmation before implementation.
- Understanding the Difference Between a Glossary and a Dictionary
A comparison of Glossary and Dictionary from the viewpoints of scope, purpose, included terms, and authorship.
- Remove License Comments from Bundled JS with esbuild/Vite
How to shrink bundle size slightly by removing license comments from output files when building with esbuild or Vite.
- How to Enable React Compiler in WXT
Configuration steps for enabling React Compiler in the WXT framework. Covers installing babel-plugin-react-compiler and wiring it into the config.
- How to configure subdirectory routing with Cloudflare Workers
Configuration steps for deploying an Astro project under a subdirectory with Cloudflare Workers. Organized how to adjust wrangler.json and astro.config.
- Behavior of sh -c and rules for reading zsh configuration files
Organized the behavior of the sh -c command, the inheritance rules of environment variables, the validity of shebang, and how zsh configuration files (.zshrc, .zshenv, etc.) are read when scripts are executed.
- Implementing CRC32 hashing in TypeScript
Steps to implement the CRC32 hashing algorithm in TypeScript. Organizes speed-up techniques using lookup tables and actual usage examples.
- Disable Biome Unused Variable Warnings in Astro/Vue/Svelte Files
How to disable Biome warnings for unused imports and variables in Astro, Vue, and Svelte files by using overrides.
- Go Setup Notes: Web Framework and Dev Tools
Notes on the web framework and development tools I looked at while setting up a Go environment. A quick summary of Echo and Air for live reload.
- Converting Images to AVIF Format with libavif
How to install libavif via Homebrew and convert JPEG/PNG to AVIF format. Supports single conversion and batch processing.
- Running Periodic Scripts with macOS Launchd
How to build Cron-like periodic execution scripts using macOS Launchd. Avoiding environment variable issues with setup including log management.
- Getting Started with zabrze Shell Abbreviation Expansion: A Simpler Alternative to zsh-abbr
How to install and use the shell abbreviation tool zabrze. A simpler alternative to zsh-abbr for faster command entry with less setup.
- Line-Oriented Text Splitting with TransformStream: LineSplitTransform
A TransformStream implementation that splits binary stream data into lines. Useful for incremental processing of log files and text streams.
- Implementing Image Processing with OffscreenCanvas and Web Workers
How to process images with Web Workers and OffscreenCanvas without blocking the main thread. This article organizes a concrete WebP conversion example.
- A TypeScript Utility Function to Convert Values into ReadableStream
A utility function that converts strings, objects, and more into ReadableStream. A way to handle streams as arbitrary types without going through Blob.
- Implementing CIDR range IP address determination with TypeScript
For environments where external modules such as CloudFront Function cannot be used, we have implemented our own IP address determination within the CIDR range. Organized the implementation of class syntax using bitwise operations.
- How to run an API server built with Bun+Hono on AWS Lambda
Steps to run Hono API server on AWS Lambda with Bun runtime. Explains the configuration to compile as Single File Executable and run it with Lambda Web Adapter.
- Reimplementing generate-project-summary.py with Bun + TypeScript
A Bun + TypeScript rewrite of a Python project-summary script. Covers the path to a portable executable for feeding whole repositories into an LLM.
- TypeScript Implementation for Sorting Media Files by Resolution
A concise TypeScript implementation for sorting videos or images by resolution (width × height). Useful for ordering Twitter media variants.
- A Deployment Script for Serving an SPA with CloudFront + S3
A practical deployment script for serving an SPA from S3 behind CloudFront. This article organizes cache-control settings, a blue-green style deployment layout, and rollback steps.
- How to Delete a Non-Empty Database in AWS Athena
What to do when deleting a non-empty database in AWS Athena fails. A quick note on using DROP DATABASE CASCADE.
- Generate Lotto 6 and Lotto 7 Numbers in TypeScript
A TypeScript implementation that generates Lotto 6 and Lotto 7 numbers with the Mersenne Twister. A practical example of a pseudorandom number generator.
- Requesting an IAM-Protected API Gateway from TypeScript
How to send a TypeScript request from local development to an API Gateway protected by IAM authentication using SigV4 from the AWS SDK for JavaScript.
- Using markdown-confluence CLI to Sync Markdown into Confluence
How to introduce and operate `@markdown-confluence/cli` to sync Markdown documents in a Git repository into Confluence. This article organizes a workflow for sharing ADRs and other docs through Confluence.
- Vue Composable to manage global state without Pinia
A lightweight implementation method to achieve global state management using Vue's reactive and toRefs without using Pinia.
- Consider strategy patterns when v-if branches increase in Vue
When there are three or more patterns of conditional branching using v-if, consider implementing a strategy pattern to dynamically switch components. Improved readability and maintainability.
- TypeScript implementation to generate images from HTMLVideoElement
A TypeScript implementation that uses Canvas and VideoElement to extract the current frame of a video as an image. Organized the method of generating blobs based on promises.
- Create Cron Jobs with PM2: As an Alternative to launchd
How to create cron-style jobs with PM2 on macOS instead of launchd. A quick summary of the config file and a scheduled task example using Bun.
- My First Vite Plugin Implementation: Automatically Generate Build Metadata
How to plug custom logic into the Vite build lifecycle with the Vite Plugin API. Learn through a plugin that generates time-based semantic version metadata.
- Change Vault copy destination to root with starlight-obsidian plugin
How to change the default behavior of starlight-obsidian plugin and copy Obsidian Vault directly under src/content/docs. Organized implementation to resolve differences in sidebar hierarchy structure.
- TypeScript implementation of steganography using variant selectors
A TypeScript implementation of a steganography method that leverages Unicode's variant selector to embed hidden, invisible strings into text.
- TypeScript Implementation to Extract Size Information from Twitter Video URLs
A TypeScript implementation that extracts resolution information from Twitter (X) video URLs with a regular expression. A quick summary of the URL pattern and how to read the size.
- Notes on failed attempts to retrieve WOFF files from Google Fonts in browser
A record of trial and error trying to obtain ttf/otf/woff files from Google Fonts on the client side and use them with @vercel/satori. Sorted out User-Agent header limitations and woff2 non-compatibility issues.
- Settings to Run Yarn v4 (PnP Mode) in Bitbucket Pipelines
How to build a project that uses Yarn v4 in PnP mode on Bitbucket Pipelines. A quick summary of cache settings and how to enable corepack.
- Why Pagefind Search Broke on Cloudflare Pages: Rocket Loader Was the Cause
Root cause and fix for a search UI that worked locally with Astro + Pagefind but failed after deployment to Cloudflare Pages.
- What I felt after purchasing the image management app Eagle
Reasons for purchasing Eagle, a one-time image management app, and reviews. Introducing Mac/Win compatibility, library management, and usability of browser extensions.
- Building a Full-Featured Google Apps Script Web App with Svelte
How to combine Google Apps Script web app publishing with Svelte to build a feature-rich SPA that uses a spreadsheet as its database.
hsb.horse