What I Refuse To Write About
The fastest way to read what a writer believes is the list of things they could write about and choose not to. Posting volume tells you what got published. The refusal list tells you the position. A blog with a defined refusal list reads like a person; a blog without one reads like a feed.
The Apple Ecosystem cluster has a voice. The voice is not principally constructed by the posts that ship. It’s constructed by the posts that don’t, and by the recurring shapes of writing that are nominally on-topic but get cut anyway. The posts you’ve read across the cluster are downstream of the cuts. The rest of the essay names the cuts.
There are two kinds of refusal worth distinguishing. Categorical refusals are topics outside the cluster’s territory. Pattern refusals are voice and structure choices that disqualify a draft regardless of topic. The first is taste; the second is craft. Both shape what you read.
TL;DR
- Categorical refusals: anything not in the Apple-stack-with-agents intersection. Generic web dev, cloud LLM tutorials, hiring tech, anything that would dilute the cluster’s identity.
- Pattern refusals: recycled-setup framing (“what I learned from 120 hooks”), private telemetry as proof, editorial scaffolding (planning labels, PRD numbers), tutorials without architecture, hot takes without grounding.
- Interesting refusals: topics inside the cluster’s nominal territory that still get cut because they don’t compound the position (visionOS productivity apps, server-side Swift, AppKit-only Mac UI).
- Refusal is not absence. Refusal is the shape of what remains.
Categorical Refusals
The cluster covers Apple development at the intersection with AI agents. Everything outside that intersection is out of scope, not because it’s uninteresting but because it doesn’t compound.
Generic web development. Blakecrosley.com itself runs on FastAPI and HTMX. There are dozens of posts that could be written about that stack: HTMX swap patterns, FastAPI dependency injection, async SQLAlchemy gotchas. None of them belong in this cluster. The cluster’s reader is an iOS developer thinking about agents; web dev posts dilute the signal even if they’d attract their own audience. There is a place for those posts; this cluster is not it.
Cloud LLM API tutorials. Anthropic’s API. OpenAI’s API. The Python SDKs. The differences between Claude Sonnet and Opus latency. Tutorial-shape content for someone learning to call cloud LLMs from a backend service. The cluster’s position is that agentic Apple is the scarce thing; cloud LLM tutorials are a commodity the rest of the internet covers thoroughly. Writing one would be reading-aloud-the-docs work that adds nothing to the cluster’s authority.
ResumeGeni and 941 hiring tech. Separate company, separate brand, separate site. Cross-pollination between the two would weaken both. The hiring stack has its own technical decisions worth writing about (ATS parsers, embedding pipelines, candidate-matching algorithms); they belong on a different blog under a different identity, not here.
Anything that would dilute the cluster’s identity. A genuinely good post about Postgres connection pooling, or a Hacker News rant about JavaScript framework churn, or a thoughtful piece on Rust async runtimes, all defensible writing, all outside the cluster’s territory. The bar for inclusion is not “is the post good.” The bar is “does it compound what’s already here.”
The categorical refusals are decided by the cluster’s identity. Once the identity is named, the refusals follow.
Pattern Refusals
Pattern refusals cut across topic. A draft can be on-topic for the cluster and still get rejected because of how it’s written.
Recycled-setup framing. “What I learned from 120 hooks and 49 commands in 6 months.” “After 500 sessions, three things stuck.” “My 95-hook configuration.” The recycled-setup pattern recycles the writer’s authoring environment as proof of expertise. The cluster’s apps are a small set; the same hook count, skill count, command count, session count will appear across post after post if the writer leans on them. Reads as throat-clearing rather than argument. The rule the cluster has settled into: volume tilts to framework-explainer and frontier-essay; shipped-code posts point at real public projects, not at the writer’s tool taxonomy.
Private telemetry as proof. “The hook fired 52 times across 34 days.” “Phantom verification dropped from 12% of sessions to under 2%.” Private numbers are unverifiable from outside; they read as boasting; they cannot be checked against any public artifact. The right form of evidence is public sources (Apple Developer docs, Anthropic specs, shipped open-source code, papers) plus reasoning. Private metrics work in commit messages and post-mortems, not in published prose.
Editorial scaffolding. Bold labels that classify the post by the writer’s internal taxonomy. PRD numbers in the body. “Per the cave plan ladder.” The reader does not need to know which bucket the post belongs to in the writer’s planning document. The genre is obvious from the first sentence. The plan is a workflow tool, not reader-facing copy. The artifact is the artifact; the workflow stays in the workflow.
Tutorials without architecture. A post that says “here’s how to install XcodeBuildMCP” without naming what changes architecturally when the agent has structured tool access is a tutorial. Tutorials are valuable but they’re not the cluster’s contribution. The cluster’s contribution is the architecture pattern that compounds with the rest of the cluster. A tutorial that doesn’t reach that level either gets rewritten until it does, or it gets cut.
Hot takes without grounding. “Codex is better than Claude Code.” “MCP is overhyped.” “App Intents are a dead-end.” The hot-take genre attracts traffic but doesn’t survive scrutiny. A take that’s true is grounded in specific behavior the writer has seen and can defend; a take that’s untrue collapses on the second-best contemporary developer reading it. The cluster’s strong-opinion posts (Trust, Tool RL, App Intents vs MCP) are positions, not takes; positions get the receipts.
Anything that requires reciting the obvious. “Install Xcode first.” “Run npm install.” “Apple’s documentation is at developer.apple.com.” Filler. A reader who needs to be told how to install Xcode is not the cluster’s reader. The cluster assumes the reader is already the kind of person who would be reading it; meeting that reader where they are is a different post on a different site.
The Interesting Refusals
The categorical refusals are easy. The pattern refusals follow rules. The interesting refusals are the topics inside the cluster’s nominal territory that still get cut because they don’t compound the position.
visionOS for productivity apps. A long post about “use visionOS for your second screen” or “shipping a journaling app on Vision Pro.” Apple-stack, on-topic. Cut because the cluster’s visionOS position is that RealityKit + spatial mental model is the architectural lever; “use visionOS as a flat productivity surface” is a different framework’s territory and doesn’t extend the cluster. A post about ornaments, immersive spaces, or hand tracking would compound; a post about “make your iPad app run on visionOS” would not.
Server-side Swift. Vapor, Hummingbird, server-side Swift in a Linux container. Real, growing, technically interesting. Outside the cluster. The cluster’s server position is “iCloud Drive plus a JSON file plus an MCP server”, a deliberately small server-side commitment because the larger one (a Swift backend service) is a different architectural conversation that doesn’t intersect with the agentic-Apple frontier. The day a Swift backend becomes load-bearing for an iOS-with-agents architecture, the post earns its place. Today it doesn’t.
AppKit-only Mac UI. Mac apps still ship with deep AppKit work, the cluster’s multi-platform shipping post handles SwiftUI on Mac, but AppKit-specific topics (NSToolbar customization, NSResponder chain quirks, AppKit-to-SwiftUI bridging gotchas) sit just outside the cluster’s voice. They’d compound a different cluster’s position (Mac development specifically) better than they’d compound this one.
Comparison posts beyond what already exists. App Intents vs MCP earns its slot because the comparison reveals an architecture rule. A comparison of Cursor vs Zed vs JetBrains for iOS development would attract traffic but wouldn’t reveal anything beyond “different IDEs work differently.” The bar for adding a comparison post: does the comparison itself produce a frontier-essay-grade insight, or just a benchmark?
Anything that requires me to fake authority. A post about Core ML quantization at the technical depth that would impress a Core ML team member. A post about visionOS Metal shaders at the depth that would impress a graphics engineer. The cluster’s authority is in the agentic-Apple architecture intersection; reaching outside that intersection produces posts that are correct enough not to be wrong but shallow enough not to compound. The honest move is to cite the deeper voice (a Core ML researcher’s blog, a graphics engineer’s writeup) rather than impersonate one.
Refusal As Product
The refusal list is not a confession of limitations. The refusal list is a positioning act. Apple’s Mac ad campaign in 1984 was famously not the campaign for IBM. Apple’s product line at the time of Steve Jobs’s 2x2 grid in 1998 (consumer/pro × desktop/portable, four boxes for the entire Mac line) was famous for what got cut, not for what survived. The choice to refuse a category is a stronger product signal than the choice to ship in it.
In writing, refusal does the same work. The cluster’s voice (direct, opinionated, evidence-based, with brutal-honesty footers) exists because the recycled-setup framing was cut, the private telemetry was cut, the editorial scaffolding was cut, the cloud LLM tutorials were cut. Each cut is the negative space that defines the positive space.
The pattern echoes The Repo Shouldn’t Get to Vote on Its Own Trust: the trust dialog’s value comes from what it refuses to interpret before the user has approved. A trust gate that reads workspace bytes is no gate at all. A blog cluster that says yes to every on-topic post is no cluster at all. Refusal at the boundary is what makes the artifact mean something.
The corollary: a writer with no refusal list is also fine, but they’re producing a feed, not a position. Both are real artifacts. Only one accumulates authority over time.
What This Means For Writers At The Apple Stack Frontier
Three takeaways.
-
Name the categorical refusals first. What’s outside the cluster’s territory? Write the list. The cluster gains identity from the answer; the answer gains durability from being explicit.
-
Name the pattern refusals next. What voice and structure shapes are off-limits regardless of topic? Recycled-setup framing, private telemetry, editorial scaffolding, hot takes without grounding. Each pattern that survives in the corpus dilutes the voice.
-
Notice the interesting refusals. Topics inside the territory that still get cut. Those are the load-bearing taste decisions. Other writers would ship them; you don’t. The reason you don’t is the cluster’s position.
The full Apple Ecosystem cluster: typed App Intents for the Apple Intelligence surface; MCP servers for the agent surface; the routing question between them; Foundation Models for in-app on-device LLM features; the runtime vs tooling LLM distinction; the three surfaces synthesis; the single source of truth pattern; Two MCP Servers for the Xcode integration; hooks for Apple development; Live Activities; the watchOS runtime contract; SwiftUI internals; RealityKit’s spatial mental model; SwiftData schema discipline; Liquid Glass patterns; multi-platform shipping. The hub is at the Apple Ecosystem Series. For broader iOS-with-AI-agents context, see the iOS Agent Development guide.
FAQ
What does “refusal as product” mean?
Refusal as product means the choice to leave something out of an artifact is a positioning decision, not a missing-content decision. A blog cluster that refuses certain topics or certain structural patterns produces a more identifiable voice than one that publishes everything on-topic. The pattern shows up in physical products too: Steve Jobs’s 1998 Apple product grid was famous for what it cut, not for what survived. The same logic applies to writing.
Are these refusals permanent?
Some are; some aren’t. Categorical refusals (cloud LLM tutorials, hiring tech) are tied to the cluster’s identity and unlikely to change. Pattern refusals (recycled-setup framing, editorial scaffolding) are voice rules with real teeth and apply going forward. Interesting refusals (server-side Swift, AppKit-only) get re-evaluated when the underlying architecture shifts: the day a Swift backend becomes load-bearing for an agentic-Apple workflow, server-side Swift earns a slot. The list isn’t dogma; it’s the current taste.
Why publish a refusal list at all?
Publishing the list serves three audiences. Readers learn the cluster’s territory faster than they would by sampling posts. Future-self gets a checkpoint to compare against: has the cluster drifted into territory it claimed to refuse? Other writers see what taste-shaped writing looks like in this corner of the internet, which lowers the activation energy for them to do the same. The cost is small (one post); the lift is durable.
Doesn’t refusing topics shrink the audience?
Yes, deliberately. The cluster is designed to compound with a specific reader (an iOS developer thinking about agents) rather than maximize raw audience. Posts outside the cluster’s territory might pull in different readers, but those readers wouldn’t return for the next post anyway because they came for a different topic. The compounding move is to write for the same reader twenty times in a row, not to write for twenty different readers once each.
How do you handle a topic that’s borderline?
Apply the bar from the Interesting Refusals section: does the topic compound the cluster’s position, or just sit alongside it? A borderline topic that compounds gets written. A borderline topic that doesn’t compound gets cut, even if it would attract traffic. The decision is not about volume; the decision is about the cluster’s coherence over time. Compounding is the bar that holds.
References
The cluster’s voice rules (no recycled-setup framing, no editorial scaffolding, no private telemetry as proof) are visible in the corpus itself. Read any cluster post, then read another, and the recurring shapes that fail to appear are the rules in operation. The published cluster is the canonical source.