<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-section-style.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Thought Eddies - Projects</title><description>Project showcases</description><link>https://www.danielcorin.com/</link><item><title>Tarn (2025)</title><link>https://www.danielcorin.com/projects/tarn/</link><guid isPermaLink="true">https://www.danielcorin.com/projects/tarn/</guid><description>Tarn (2025)</description><pubDate>Sat, 27 Dec 2025 22:13:02 GMT</pubDate><content:encoded>&lt;p&gt;I was recently taken with this article on &lt;a href=&quot;https://outofdesk.netlify.app/blog/perfect-software?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Perfect Software&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perfect software isn’t the best software. It’s perfect simply because it does exactly what you want, how you want it, when you want it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Over time my process for writing and building things has evolved, but the step function changes have usually occurred with changes in my process.&lt;/p&gt;
&lt;p&gt;I started writing more consistently because I made it easier for myself to write.&lt;/p&gt;
&lt;p&gt;This lack of success, of course, makes sense if you appreciate that one’s process is unique.
I’ve long wanted to find a better tool ideas and writing for my process but never found the right thing.
With that recognition, I’ve embarked upon a journey to create my own tool to write and work on this blog and explore ideas. My plan is to mold it into whatever I need it to be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Extended Mind Theory argues that our tools are not just accessories, but literal extensions of our cognitive process. Viewed this way, a generic tool like a one-size-fits-all app, feels like a prosthetic that doesn’t quite fit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tarn is heavily influenced and inspired by VS Code, but is built and Swift and designed for specifically my processes.
It has configuration or settings pane.
It is hardcoded to behave the way I want it to
If I want it’s behavior to change, I change the software itself.
I do this with agent coding tools like Claude Code.&lt;/p&gt;
&lt;p&gt;The main UI&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/tarn-ui.xODsn_aw_ZKbcVu.webp&quot; alt=&quot;Tarn UI&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3248&quot; height=&quot;2122&quot;&gt;&lt;/p&gt;
&lt;p&gt;Zen Mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/_astro/zen-mode.DfhzLEZE_Z2eG5Nm.webp&quot; alt=&quot;Zen Mode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3160&quot; height=&quot;2034&quot;&gt;&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Tomo (2025)</title><link>https://www.danielcorin.com/projects/tomo/</link><guid isPermaLink="true">https://www.danielcorin.com/projects/tomo/</guid><description>An ambient LLM chat app</description><pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.wvlen.llc/apps/tomo?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tomo&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; is an ambient LLM chat compatible with an &lt;a href=&quot;https://platform.openai.com/docs/api-reference/chat?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenAI-compatible chat completion API&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display:inline-block;vertical-align:baseline;position:relative;top:0.125em;margin-left:0.25rem&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;.
It focuses on providing a great LLM chat experience for power users who use several different LLMs (including local models) and are comfortable using hotkeys to manage bringing text and image context into the chat and managing the lifecycle of conversations and switching models.&lt;/p&gt;
&lt;p&gt;Tomo aims to be as unobtrusive and out of your way as possible.
It can be called and hidden with a hotkey (like Spotlight), can be configured to hover above your windows or nest behind them, and can be stripped down to just a text box and your messages.
It also supports hiding both the app icon and the menu bar icon.&lt;/p&gt;
&lt;p&gt;It presently stores no conversation history and does not support multiple conversations at once.
While this is a limitation, it is also a feature that can keep you focused when you find yourself getting pulled into doing something else.&lt;/p&gt;
&lt;p&gt;Tech: Swift&lt;/p&gt;
&lt;div style=&quot;display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;&quot;&gt;&lt;img src=&quot;/_astro/start.BlZ1f0iC.png&quot; alt=&quot;Tomo&apos;s start screen&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/chat.CLUTn7WX.png&quot; alt=&quot;Tomo&apos;s chat screen with a single message pair&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/model_selector.5CB9p6Tj.png&quot; alt=&quot;Tomo&apos;s model selector&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/light_mode.B8fVJSRt.png&quot; alt=&quot;Tomo&apos;s light mode&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/markdown.BzwtKr8A.png&quot; alt=&quot;Tomo displaying a markdown table&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/find.DBpp9lJe.png&quot; alt=&quot;Tomo chatting with an Ollama model&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/code.Dm5kP5Ts.png&quot; alt=&quot;Tomo rendering a code block&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/prefs.CgFkCXSD.png&quot; alt=&quot;Tomo&apos;s preferences&quot; width=&quot;100%&quot;/&gt;&lt;img src=&quot;/_astro/custom_provider.Pmnr87jc.png&quot; alt=&quot;Tomo&apos;s custom provider add screen&quot; width=&quot;100%&quot;/&gt;&lt;/div&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item><item><title>Delta (2024)</title><link>https://www.danielcorin.com/projects/delta/</link><guid isPermaLink="true">https://www.danielcorin.com/projects/delta/</guid><description>Conversation branching with language models</description><pubDate>Sun, 08 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Delta is an &lt;a href=&quot;https://github.com/danielcorin/delta?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;open source Electron app&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt; (initially started as a Next.js app) that enables a straightforward UX for conversation branching with language models.
Conversation branch means rewinding a conversation to a previous response then continuing in another direction by sending a different message to the model.
While this UX is supported by most LLM chat providers via an edit mechanism, what is different about Delta is that it provides a visual representation of conversation branches and makes it easy to navigate between them.&lt;/p&gt;
&lt;p&gt;The interface is composed primarily of a chat and canvas.
There is also a tracked list of past conversations.&lt;/p&gt;
&lt;p&gt;The tool supports multiple model providers, image inputs (for models that support them) and models served by an &lt;code&gt;ollama&lt;/code&gt; server.&lt;/p&gt;
&lt;p&gt;I also wrote more about conversation branching and why I think this approach is useful &lt;a href=&quot;/posts/conversation-branching&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of Delta app showing the canvas view with multiple conversation branches and nodes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3248&quot; height=&quot;2112&quot; src=&quot;/_astro/delta-canvas.BhP7Tqqp_2hYKb1.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of Delta app showing the chat interface with model responses and user inputs&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3248&quot; height=&quot;2112&quot; src=&quot;/_astro/delta-chat.BZ_re9nS_p6qHW.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;Tech: &lt;a href=&quot;https://www.electronjs.org/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Electron&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;, &lt;a href=&quot;https://www.electronforge.io/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Electron Forge&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;, &lt;a href=&quot;https://sdk.vercel.ai/docs/getting-started/nodejs?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Vercel AI SDK&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;, &lt;a href=&quot;https://ollama.com/?ref=danielcorin.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ollama&lt;/a&gt;&lt;span class=&quot;external-link-icon&quot; aria-hidden=&quot;true&quot; style=&quot;display: inline-block; vertical-align: baseline; position: relative; top: 0.125em; margin-left: 0.25rem;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 256 256&quot;&gt;&lt;path d=&quot;M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;margin-top: 2em; margin-bottom: 1em; border: none; border-top: 1px solid #ccc;&quot; /&gt;
&lt;p style=&quot;font-style: italic; color: #666;&quot;&gt;Thanks for reading via RSS!&lt;/p&gt;
</content:encoded></item></channel></rss>