<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Levine</title>
    <description>The latest articles on DEV Community by Levine (@enivel).</description>
    <link>https://dev.to/enivel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3944112%2F2549a4c1-3134-477a-9c26-7014c4929891.jpeg</url>
      <title>DEV Community: Levine</title>
      <link>https://dev.to/enivel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/enivel"/>
    <language>en</language>
    <item>
      <title>I built a Mac app that turns web pages into live widgets</title>
      <dc:creator>Levine</dc:creator>
      <pubDate>Thu, 21 May 2026 12:55:13 +0000</pubDate>
      <link>https://dev.to/enivel/i-built-a-mac-app-that-turns-web-pages-into-live-widgets-fd4</link>
      <guid>https://dev.to/enivel/i-built-a-mac-app-that-turns-web-pages-into-live-widgets-fd4</guid>
      <description>&lt;p&gt;I'm the developer of &lt;a href="https://kepo.ai" rel="noopener noreferrer"&gt;Kepo&lt;/a&gt;, a Mac app I started building because I kept checking the same web pages over and over again.&lt;/p&gt;

&lt;p&gt;Product Hunt launches. Reddit threads. GitHub releases. YouTube channels. Docs. Small dashboards. Status pages.&lt;/p&gt;

&lt;p&gt;Each check only takes a few seconds, but the workflow is surprisingly expensive:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;switch back to the browser&lt;/li&gt;
&lt;li&gt;find the right tab&lt;/li&gt;
&lt;li&gt;refresh or scroll&lt;/li&gt;
&lt;li&gt;read one small piece of information&lt;/li&gt;
&lt;li&gt;switch back to what I was doing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After repeating this enough times, I started wondering if some web pages should not be tabs at all. Some of them feel more like small pieces of state that should sit closer to the desktop.&lt;/p&gt;

&lt;p&gt;That was the starting point for Kepo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product idea
&lt;/h2&gt;

&lt;p&gt;Kepo turns web pages into live Mac desktop widgets.&lt;/p&gt;

&lt;p&gt;The goal is not to recreate a whole browser inside a widget. The goal is to take the part of a page that you repeatedly care about and make it available in a small, glanceable interface.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;today's Product Hunt launches&lt;/li&gt;
&lt;li&gt;a Reddit thread you are following&lt;/li&gt;
&lt;li&gt;GitHub releases or issues&lt;/li&gt;
&lt;li&gt;a YouTube channel update&lt;/li&gt;
&lt;li&gt;a docs page section&lt;/li&gt;
&lt;li&gt;a small internal dashboard&lt;/li&gt;
&lt;li&gt;a checklist, timer, formatter, or monitor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kepo lives in a floating desktop panel that can be opened with a shortcut, closer to the way Raycast fits into a developer workflow. You bring it up, check or use a widget, then go back to your work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tricky part: web pages are not APIs
&lt;/h2&gt;

&lt;p&gt;At first, this sounded simple: take part of a page and render it as a widget.&lt;/p&gt;

&lt;p&gt;In practice, web pages are messy.&lt;/p&gt;

&lt;p&gt;A page can depend on login state. It can lazy-load content. The DOM can change. Some sites expose a feed or API, while others only expose rendered HTML. Some pages are stable enough to parse directly, while others need a browser context to understand what the user actually sees.&lt;/p&gt;

&lt;p&gt;So the hard part is not only "extract data from a page".&lt;/p&gt;

&lt;p&gt;The harder questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is the smallest useful version of this page?&lt;/li&gt;
&lt;li&gt;what should happen when the page fails to load?&lt;/li&gt;
&lt;li&gt;how often should it refresh?&lt;/li&gt;
&lt;li&gt;what information should be hidden in a small widget?&lt;/li&gt;
&lt;li&gt;when should the widget open the original page instead of trying to replicate it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where I started thinking of widgets less as small UIs and more as small contracts.&lt;/p&gt;

&lt;p&gt;A good widget has a clear promise: "I will show you this specific piece of information in this specific shape, without forcing you to open the full page every time."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI fits
&lt;/h2&gt;

&lt;p&gt;Kepo includes an AI creation flow. You can point it at a page and ask it to build a widget from it.&lt;/p&gt;

&lt;p&gt;AI is useful here because the first version of a widget is often structural work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect the page&lt;/li&gt;
&lt;li&gt;decide which data matters&lt;/li&gt;
&lt;li&gt;sketch the UI&lt;/li&gt;
&lt;li&gt;generate the widget code&lt;/li&gt;
&lt;li&gt;adjust the layout for small sizes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I do not think AI removes the design problem.&lt;/p&gt;

&lt;p&gt;The human part is still deciding what the widget should mean. For a Product Hunt page, do you want the full feed, the top launches, vote counts, comments, or just a launch checklist? For a GitHub page, do you want releases, issues, pull requests, or a status monitor?&lt;/p&gt;

&lt;p&gt;AI can help build the first version faster. It cannot automatically know what deserves to stay on your desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it useful for developers
&lt;/h2&gt;

&lt;p&gt;I also did not want custom widget creation to be locked entirely behind the built-in AI flow.&lt;/p&gt;

&lt;p&gt;So Kepo has a free Skills-based development path for developers who already use local coding agents like Claude Code or Codex.&lt;/p&gt;

&lt;p&gt;You can install the Skill with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add Enivel/kepo-plugin-dev-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That lets developers build and run custom widgets locally. The built-in AI creation flow is paid, but the Skills path is free to use.&lt;/p&gt;

&lt;p&gt;This makes the product feel closer to a small desktop platform than a fixed widget gallery. There are ready-to-use widgets, but developers can also build their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am still trying to figure out
&lt;/h2&gt;

&lt;p&gt;The biggest open question is not whether the technology works. It is where this belongs in a developer's daily workflow.&lt;/p&gt;

&lt;p&gt;Some widgets clearly make sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI status&lt;/li&gt;
&lt;li&gt;server health&lt;/li&gt;
&lt;li&gt;GitHub releases&lt;/li&gt;
&lt;li&gt;launch pages&lt;/li&gt;
&lt;li&gt;docs snippets&lt;/li&gt;
&lt;li&gt;feed monitors&lt;/li&gt;
&lt;li&gt;small local tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other cases probably still belong in the browser.&lt;/p&gt;

&lt;p&gt;That boundary is what I am trying to learn from real users.&lt;/p&gt;

&lt;p&gt;If you are a developer, what web page would you actually want to turn into a desktop widget?&lt;/p&gt;

&lt;p&gt;Not in a "this looks cool" way, but in a "I check this often enough that I would save time if it lived one shortcut away" way.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
