<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
    >
<channel>
    <title>Project Planet</title>
    <atom:link href="https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/rss.xml" rel="self" type="application/rss+xml" />
    <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/</link>
    <description><![CDATA[
    
    ]]></description>
    
    
    <item>
        <title>Better RSS Fulltext Content Support</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/DF3756DE-C9EA-45FB-BBF9-3BD06EE7B56A/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/DF3756DE-C9EA-45FB-BBF9-3BD06EE7B56A/</guid>
        <pubDate>Sun, 05 Apr 2026 22:55:51 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Telegram Integration?</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/2D051307-890F-4339-9186-49123F3D8417/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/2D051307-890F-4339-9186-49123F3D8417/</guid>
        <pubDate>Sun, 05 Apr 2026 22:53:52 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Flexible Spaces for AI Chat Toolbar</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/47198B46-8AFA-4DA9-9A07-2EE9D53E7F1D/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/47198B46-8AFA-4DA9-9A07-2EE9D53E7F1D/</guid>
        <pubDate>Sun, 05 Apr 2026 22:52:11 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Save to Planet from Codex</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/02DDE827-94AC-4D5F-B88C-FE610A667527/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/02DDE827-94AC-4D5F-B88C-FE610A667527/</guid>
        <pubDate>Sun, 05 Apr 2026 22:51:06 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Link between Articles</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/70F8E5D9-E632-43B7-B88F-17B9C7FAB602/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/70F8E5D9-E632-43B7-B88F-17B9C7FAB602/</guid>
        <pubDate>Sun, 05 Apr 2026 22:50:40 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>2026-04-05 Session: Add Planet AI Chat with sessions and sparkles button</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/C65E4E26-BF30-470D-8704-E25E9FBD91E4/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/C65E4E26-BF30-470D-8704-E25E9FBD91E4/</guid>
        <pubDate>Sun, 05 Apr 2026 22:47:25 -0700</pubDate>
        
        
        <description><![CDATA[
            <h2>What was done</h2> 
<ul> 
 <li>Added a sparkles button to the main sidebar toolbar that opens a global Planet AI Chat window</li> 
 <li>Parameterized <code>ArticleAIChatView</code> to support both per-article and planet-wide modes</li> 
 <li>Created <code>PlanetAIChatWindowController</code> with <code>NSSplitViewController</code> for session sidebar</li> 
 <li>Refactored <code>ArticleAIChatWindowManager</code> to use <code>NSWindowController</code> + <code>NSToolbar</code></li> 
 <li>Added <code>AIChatToolbarState</code> for AppKit/SwiftUI toolbar state synchronization</li> 
 <li>Implemented session management with persistence, migration from legacy chat file, and session title auto-naming</li> 
 <li>Fixed chat windows staying open when clicking article links (previously closed unexpectedly)</li> 
 <li>Iterated on window chrome: transparent titlebar, fullSizeContentView, unified compact toolbar style</li> 
</ul> 
<h2>Key decisions</h2> 
<ul> 
 <li>Parameterized existing <code>ArticleAIChatView</code> instead of duplicating 5000+ lines — all tools (search_articles, list_planet_articles, read_article) already work cross-planet</li> 
 <li>Used <code>NSSplitViewController</code> for sessions sidebar rather than SwiftUI tabs — matches the app's existing window controller patterns</li> 
 <li>Planet-wide system prompt emphasizes using search_articles and list_planet_articles to discover content across all planets</li> 
 <li>Session titles auto-generate from first user message (truncated to 40 chars)</li> 
</ul> 
<h2>Files changed</h2> 
<ul> 
 <li><code>Planet/Views/Articles/ArticleAIChatView.swift</code> — replaced <code>@ObservedObject article</code> with optional <code>articleRef</code>, added planet-wide mode, session ID, toolbar state sync, planet summary context, sending animation</li> 
 <li><code>Planet/Views/Articles/PlanetAIChatWindowController.swift</code> — new: NSWindowController with NSSplitViewController, NSToolbar, AIChatToolbarState, AIChatProviderToolbarItem</li> 
 <li><code>Planet/Views/Articles/PlanetAIChatSessionsView.swift</code> — new: session model, PlanetAIChatSessionStore, sidebar/content views, environment key</li> 
 <li><code>Planet/Views/Articles/ArticleAIChatWindowManager.swift</code> — refactored to use NSWindowController + NSToolbar pattern</li> 
 <li><code>Planet/Views/Articles/ArticleAIOnDeviceTools.swift</code> — made articleID optional in OnDeviceToolContext and factory</li> 
 <li><code>Planet/Views/Articles/ChatInputField.swift</code> — added configurable placeholder parameter</li> 
 <li><code>Planet/Views/Sidebar/PlanetSidebarView.swift</code> — added sparkles toolbar button with AI readiness checks</li> 
 <li><code>Planet/PlanetAppDelegate.swift</code> — added openPlanetAIChatWindow() and planetAIChatWindowController</li> 
 <li><code>Planet/Helper/Extensions.swift</code> — added settingsAILastChatSessionID key</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>2026-04-05 Session: Detect Ollama and improve AI settings UX</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/1628B348-2EC3-4042-BBB5-C4A8F58008E0/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/1628B348-2EC3-4042-BBB5-C4A8F58008E0/</guid>
        <pubDate>Sun, 05 Apr 2026 18:09:32 -0700</pubDate>
        
        
        <description><![CDATA[
            <h2>What was done</h2> 
<ul> 
 <li>Added Ollama auto-detection in AI settings — pings <code>localhost:11434/api/tags</code> on view appear</li> 
 <li>Added "Use Ollama" button when Ollama is detected but not yet configured</li> 
 <li>Shows "Using Ollama" status when API base already points to Ollama (localhost, 127.x, LAN IPs on port 11434)</li> 
 <li>Changed HTTP security warning to only display when the URL actually violates the policy (was previously always visible), styled in red</li> 
</ul> 
<h2>Key decisions</h2> 
<ul> 
 <li>Ollama detection covers localhost, 127.x, 0.0.0.0, and LAN IPs (10.x, 100.x, 192.168.x) on port 11434</li> 
 <li>Detection uses a 2-second timeout to avoid blocking the UI</li> 
 <li>HTTP warning changed from always-on informational to conditional error styling</li> 
</ul> 
<h2>Files changed</h2> 
<ul> 
 <li><code>Planet/Settings/PlanetSettingsAIView.swift</code> — Added <code>ollamaDetected</code> state, <code>checkOllama()</code> function, <code>isUsingOllama</code> and <code>hasInsecureHTTPError</code> computed properties, and conditional UI for Ollama row and HTTP warning</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>2026-04-05 Session: Convert AI chat from sheet to dedicated window per article</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/E52C411D-5644-461C-967B-83AE663FF4E4/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/E52C411D-5644-461C-967B-83AE663FF4E4/</guid>
        <pubDate>Sun, 05 Apr 2026 17:56:37 -0700</pubDate>
        
        
        <description><![CDATA[
            <h2>What was done</h2> 
<ul> 
 <li>Converted AI chat from a modal sheet to a dedicated macOS window per article, allowing multiple chats open simultaneously and free repositioning</li> 
 <li>Created <code>ArticleAIChatWindowManager</code> following the existing <code>AppLogWindowManager</code> pattern, tracking one window per article UUID</li> 
 <li>Added 20px bottom padding to chat messages for visual comfort</li> 
 <li>Auto-focus the input field when the chat window opens, using <code>@FocusState</code> on macOS 13+ with graceful fallback</li> 
 <li>Updated CLAUDE.md with guideline to use <code>#available</code>/<code>@available</code> for newer APIs while maintaining macOS 12 compatibility</li> 
</ul> 
<h2>Key decisions</h2> 
<ul> 
 <li>Used the direct <code>NSWindow</code> + <code>NSHostingView</code> pattern (like <code>AppLogWindowManager</code>) rather than the heavier WindowManager/WindowController/Window/ViewController hierarchy — simplest approach that supports multiple instances</li> 
 <li>Replaced <code>@Environment(\.dismiss)</code> with <code>NSApp.keyWindow?.close()</code> since dismiss doesn't work outside sheet context</li> 
 <li>For auto-focus, extracted a <code>FocusableChatInput</code> struct gated behind <code>@available(macOS 13.0, *)</code> rather than using fragile NSView hierarchy traversal</li> 
</ul> 
<h2>Files changed</h2> 
<ul> 
 <li><code>Planet/Views/Articles/ArticleAIChatWindowManager.swift</code> — New file: window manager tracking one NSWindow per article UUID</li> 
 <li><code>Planet/Views/Articles/ArticleView.swift</code> — Removed sheet presentation, toolbar button now opens dedicated window</li> 
 <li><code>Planet/Views/Articles/ArticleAIChatView.swift</code> — Removed dismiss environment, replaced with window close, flexible frame, bottom padding, focusOnAppear</li> 
 <li><code>Planet/Views/Articles/ChatInputField.swift</code> — Added focusOnAppear support with @FocusState on macOS 13+</li> 
 <li><code>Planet.xcodeproj/project.pbxproj</code> — Added new file to Planet target</li> 
 <li><code>CLAUDE.md</code> — Added #available API adoption guideline</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>Global Chat or Planet-level Chat</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/7AC27082-A7E0-4340-A753-E5C5FDF11D48/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/7AC27082-A7E0-4340-A753-E5C5FDF11D48/</guid>
        <pubDate>Sun, 05 Apr 2026 17:35:44 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>2026-04-05 Session: Fix 6 Xcode warnings and remove legacy CoreData</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/55CAA960-A982-4874-873C-7282367AC9B3/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/55CAA960-A982-4874-873C-7282367AC9B3/</guid>
        <pubDate>Sun, 05 Apr 2026 17:10:12 -0700</pubDate>
        
        
        <description><![CDATA[
            <h2>What was done</h2> 
<ul> 
 <li>Fixed 6 Xcode compiler warnings identified in the build</li> 
 <li>Removed the entire legacy CoreData migration subsystem after confirming it was dead code</li> 
</ul> 
<h2>Warning fixes</h2> 
<ul> 
 <li><strong>FollowingPlanetModel</strong> — suppressed unused result from <code>MainActor.run</code> returning a <code>Task</code> value</li> 
 <li><strong>Template</strong> (2 warnings) — removed redundant <code>?? nil</code> on <code>getNextPage</code>/<code>getPreviousPage</code> which already return <code>String?</code></li> 
 <li><strong>VideoInfoRow</strong> — added <code>nonisolated</code> to <code>makeCompressionBackup(for:)</code> since it only does file I/O but was MainActor-isolated and called from a detached task</li> 
 <li><strong>Planet+CoreDataProperties / PlanetArticle+CoreDataProperties</strong> — initially fixed by switching codegen to Manual/None, then removed entirely with the CoreData cleanup</li> 
</ul> 
<h2>CoreData removal</h2> 
<ul> 
 <li>Confirmed CoreData was only used by <code>Saver.swift</code> for a one-time migration from old CoreData persistence to current JSON format</li> 
 <li>The migration path: <code>PlanetAppDelegate.applicationDidFinishLaunching</code> → <code>Saver.isMigrationNeeded()</code> → <code>savePlanets()</code> / <code>migratePublic()</code></li> 
 <li>No other code paths referenced CoreData classes</li> 
</ul> 
<h2>Files changed</h2> 
<ul> 
 <li><code>Planet/Entities/FollowingPlanetModel.swift</code> — <code>_ = Task {</code> to suppress unused result</li> 
 <li><code>Planet/TemplateBrowser/Template.swift</code> — removed <code>?? nil</code> wrapping</li> 
 <li><code>Planet/Writer/VideoInfoRow.swift</code> — added <code>nonisolated</code> to static method</li> 
 <li><code>Planet/PlanetAppDelegate.swift</code> — removed migration block</li> 
 <li><code>Planet/Entities/PlanetStore.swift</code> — removed <code>isMigrating</code> property</li> 
 <li><code>Planet/Views/PlanetMainView.swift</code> — removed migration progress sheet</li> 
 <li><code>Planet.xcodeproj/project.pbxproj</code> — removed all CoreData file references</li> 
 <li><del><code>Planet/LegacyCoreData/</code></del> — deleted (Planet.swift, PlanetArticle.swift, CoreDataPersistence.swift)</li> 
 <li><del><code>Planet/Planet.xcdatamodeld/</code></del> — deleted (7 model versions)</li> 
 <li><del><code>Planet/Helper/Saver.swift</code></del> — deleted</li> 
 <li><del><code>Planet/Views/Saver/MigrationProgressView.swift</code></del> — deleted</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>AI Setting: Detect Ollama</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/71C9A332-5A6E-468B-BBD2-9FBA14C0F15A/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/71C9A332-5A6E-468B-BBD2-9FBA14C0F15A/</guid>
        <pubDate>Sun, 05 Apr 2026 16:49:17 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Guide to Use Ollama + Gemma4 + Planet</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/EF8BB47A-FC56-44B3-AC0C-37456B677630/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/EF8BB47A-FC56-44B3-AC0C-37456B677630/</guid>
        <pubDate>Sun, 05 Apr 2026 16:49:02 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>Pull Remote Template via Git or Download</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/187E15EE-F0F3-4F70-B496-5DE91059434B/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/187E15EE-F0F3-4F70-B496-5DE91059434B/</guid>
        <pubDate>Sun, 05 Apr 2026 16:48:11 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
    <item>
        <title>AI Chat Window per Article</title>
        <link>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/E9146935-CA07-4BAD-B3D8-FD9F929D3776/</link>
        <guid>https://eth.sucks/ipns/k51qzi5uqu5djz1394561aq40dekszqop2rin7v7rc5225sayw51j9tngf8f2c/E9146935-CA07-4BAD-B3D8-FD9F929D3776/</guid>
        <pubDate>Sun, 05 Apr 2026 16:47:57 -0700</pubDate>
        
        
        <description><![CDATA[
            
        ]]></description>
    </item>
    
</channel>
</rss>
