Tbh I had no idea this was even a thing until recently. I've been working with Rails for a while now and somehow never came across it. So let me explain it the way I understood it. You know how we normally do associations in Rails, User has many Posts, Post belongs to User. Two different models, two different tables. Simple. But what if a model needs to reference itself? Like same table, same mode
I have a confession: I'm a productivity app addict. Notion, Todoist, Things, TickTick, Bear, Obsidian — I've tried them all. And every single one failed me in the same way. Not because they were bad apps. But because they let me add unlimited tasks. So I'd wake up Monday morning, open my to-do app, and see 47 items staring back at me. By 9am I was already paralyzed. Decision fatigue is real. When
Comments
In the gold rush of Artificial Intelligence, developers often obsess over model parameters, token limits, and inference speeds. But in the Apple ecosystem, a groundbreaking AI model is only as good as the interface that houses it. If your app delivers world-changing insights but hides them behind a keyboard or makes them invisible to VoiceOver users, it isn't a "smart" app—it’s a broken one. Build
Why I built another Ruby test runner inspired by Playwright Test Ruby already has great testing tools. If you are building Rails applications today, you probably use one of these combinations: RSpec + Capybara Minitest + Capybara Rails system tests Maybe Selenium, Cuprite, Ferrum, or Playwright through Ruby bindings These tools are mature, battle-tested, and widely used. So the natural question
The previous three posts covered how events flow from the SDK to the UI, how the timeline renders, and how tool cards visualize. This final post looks at SwiftWork's infrastructure — how data is stored, how state is restored, how Markdown is rendered, how code is highlighted, and how API keys are managed. These components are independent, but all essential to making the app usable. SwiftWork uses
The previous two posts covered how events flow from the SDK to the UI. This post focuses on visualizing one specific type of event: tool calls. Tool invocations are the most frequent operations in an Agent application. A typical task might call tools twenty or thirty times—reading files, writing files, executing commands, searching code. If every tool call renders as the same gray block, it's hard
Post 1 covered how AgentBridge converts the SDK's AsyncStream<SDKMessage> into [AgentEvent]. This post looks at what [AgentEvent] becomes — how TimelineView renders 18 event types, handles scroll behavior, and stays smooth when the event count gets large. TimelineView is the main body of the workspace, filling all the space between the sidebar and the input box. Its view hierarchy is shallow: Time