<?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: ImADev</title>
    <description>The latest articles on DEV Community by ImADev (@imadev22).</description>
    <link>https://dev.to/imadev22</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3845165%2F5d549010-a4a2-44f2-9ac7-e87b8830c98e.png</url>
      <title>DEV Community: ImADev</title>
      <link>https://dev.to/imadev22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imadev22"/>
    <language>en</language>
    <item>
      <title>Skill Forge: turn scattered notes into complete, reusable skills for AI agents</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Sat, 07 Nov 2026 10:09:37 +0000</pubDate>
      <link>https://dev.to/imadev22/skill-forge-turn-scattered-notes-into-complete-reusable-skills-for-ai-agents-401j</link>
      <guid>https://dev.to/imadev22/skill-forge-turn-scattered-notes-into-complete-reusable-skills-for-ai-agents-401j</guid>
      <description>&lt;h2&gt;
  
  
  The problem: your notes are not a skill yet
&lt;/h2&gt;

&lt;p&gt;If you build with AI agents, you have probably hit this wall. You know &lt;em&gt;how&lt;/em&gt; to do a task - the edge cases, the order of operations, the mistakes to avoid - but it lives in a pile of half-finished notes, exported PDFs and chat transcripts. An agent cannot use any of that.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;skill&lt;/strong&gt; is different: it is an operational document. It says when to use it, what to do first, what to do next, which mistakes are common, and how to verify the result. Writing that by hand is slow and repetitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Skill Forge does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skill-forge.ciao22king.workers.dev" rel="noopener noreferrer"&gt;Skill Forge&lt;/a&gt; takes whatever you have and produces that document for you.&lt;/p&gt;

&lt;p&gt;You can start in two ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. You already have material.&lt;/strong&gt; Upload up to twenty files - transcripts, notes, exported PDFs, a rough draft of the skill. The model merges everything into one document, fills the gaps, and keeps every technical detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. You start from an idea.&lt;/strong&gt; Answer six questions about name, domain, goal, tone and constraints. The model writes the full procedure from scratch, with realistic examples and common mistakes.&lt;/p&gt;

&lt;p&gt;Either way, the output has a fixed structure: when to use it, prerequisites, a numbered procedure, examples, common mistakes, and a verification checklist. You then download it, or publish it to the public marketplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The marketplace
&lt;/h2&gt;

&lt;p&gt;Every published skill gets a page on the marketplace, so the good ones stop being throwaway prompts and become reusable building blocks. Skills are signed with your GitHub identity, so authorship is visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech
&lt;/h2&gt;

&lt;p&gt;The front end and API run as a single &lt;strong&gt;Next.js&lt;/strong&gt; app deployed to &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; with &lt;strong&gt;OpenNext&lt;/strong&gt;. Data lives in &lt;strong&gt;Cloudflare D1&lt;/strong&gt; (SQLite at the edge) and rate limiting in &lt;strong&gt;KV&lt;/strong&gt;. Sign-in is one click with GitHub - used only to read your profile and sign the skills you publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy note
&lt;/h2&gt;

&lt;p&gt;The material you upload stays only in the request. It is not archived on the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It is free: &lt;strong&gt;&lt;a href="https://skill-forge.ciao22king.workers.dev" rel="noopener noreferrer"&gt;skill-forge.ciao22king.workers.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you build agents, give it a shot and tell me what you think. What would you turn into a skill first?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A messenger with no server: how ShutChat gets a message from one phone to another</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Tue, 27 Oct 2026 19:10:07 +0000</pubDate>
      <link>https://dev.to/imadev22/a-messenger-with-no-server-how-shutchat-gets-a-message-from-one-phone-to-another-282k</link>
      <guid>https://dev.to/imadev22/a-messenger-with-no-server-how-shutchat-gets-a-message-from-one-phone-to-another-282k</guid>
      <description>&lt;p&gt;Most messengers have a server in the middle. It is where your messages live, and it is also the single place where they can be read, subpoenaed, or quietly deleted when the company loses interest.&lt;/p&gt;

&lt;p&gt;I wanted to see how far you can get without one. &lt;strong&gt;ShutChat&lt;/strong&gt; is the result: an Android messenger where messages travel directly between devices. No server, no account, no sign-up screen.&lt;/p&gt;

&lt;p&gt;This is a write-up of the parts that were interesting to build, and the parts that were genuinely hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole access model is one code
&lt;/h2&gt;

&lt;p&gt;There is no address book, no user ID, no registration. A conversation starts with a 24-character invite code, and that code is the entire access model.&lt;/p&gt;

&lt;p&gt;It is 15 bytes, rendered in Base32 with the Crockford alphabet, so &lt;code&gt;1&lt;/code&gt;/&lt;code&gt;l&lt;/code&gt;/&lt;code&gt;I&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt;/&lt;code&gt;O&lt;/code&gt; cannot be confused when you read it off someone else's screen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bytes&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;version and chat kind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1..2&lt;/td&gt;
&lt;td&gt;expiry day, big endian, &lt;code&gt;0xFFFF&lt;/code&gt; = never&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3..4&lt;/td&gt;
&lt;td&gt;CRC-16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5..14&lt;/td&gt;
&lt;td&gt;80-bit rendezvous secret&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details I would keep in any rewrite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expiry is stored as a day, not a timestamp.&lt;/strong&gt; Every device in the room enforces the same UTC deadline, whatever its timezone. A timestamp would drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CRC is computed with its own bytes zeroed.&lt;/strong&gt; Obvious once it works, maddening before: a checksum cannot cover itself. This was a real bug in an early version, and it shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three transports, picked at runtime
&lt;/h2&gt;

&lt;p&gt;The interesting constraint: two phones on different mobile networks have no addressable path to each other. Something has to be reachable. So there are three paths, chosen at runtime.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LAN&lt;/strong&gt; — UDP multicast to find peers on the same network, TCP for the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nearby Connections&lt;/strong&gt; — Bluetooth and Wi-Fi Direct, for devices that are close but not on a shared network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MQTT over TLS&lt;/strong&gt; — for devices on different networks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The room id is derived from the secret with HKDF and travels &lt;strong&gt;in the clear&lt;/strong&gt; in every frame header. That looks wrong at first. It is deliberate: it lets a device forward a frame it cannot decrypt, which is what makes relaying possible. The message key and the file-transfer key are separate derivations, so a file chunk cannot be replayed as a message.&lt;/p&gt;

&lt;p&gt;The relay is the only third party, and it sees neither the message nor who is talking. Frames are sealed, and the topic is derived from the invite secret, never from the room id. That last part matters: the room id travels in clear on every frame, so a topic derived from it would let a broker watcher correlate rooms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part: a message for someone who is offline
&lt;/h2&gt;

&lt;p&gt;This is where a serverless design bites. With no server, a message can only arrive if something is awake to receive it.&lt;/p&gt;

&lt;p&gt;The first version had a real bug. A message written for an offline peer went into the queue and was &lt;strong&gt;never retried&lt;/strong&gt;. It sat in the chat with a clock icon, forever. Worse, "delivered" was inferred from "the bytes reached a socket", and the delivery receipt envelope was defined but never actually sent.&lt;/p&gt;

&lt;p&gt;The fix was a retry queue with per-message backoff. It uses the message table as the queue, so a crash loses nothing the database had already saved. A message is retried until the recipient acknowledges it, and after 30 days, or when the room code expires, it is marked failed instead of pretending forever.&lt;/p&gt;

&lt;p&gt;Two subtleties cost me real time.&lt;/p&gt;

&lt;p&gt;The mesh &lt;strong&gt;deduplicates before the handler runs&lt;/strong&gt;, so a re-sent message arrived and was silently dropped. The sender was retrying precisely because it never got the first receipt, so staying quiet kept it retrying for the whole window. A re-send now re-acknowledges.&lt;/p&gt;

&lt;p&gt;Backoff must be &lt;strong&gt;per message&lt;/strong&gt;, not a global counter: a message stays in the undelivered set after being handed to a transport, so a single counter would re-send every queued message on the same schedule.&lt;/p&gt;

&lt;p&gt;A foreground service keeps the mesh listening when the app is closed, because with no push server, something must be awake to receive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Direct and group chats from a single code; photos, audio and files transferred in chunks; replies, edits, deletes, reactions; read receipts and typing indicators; presence; search, pin, mute, archive, drafts; QR code sharing; automatic expiry and rotation of invite codes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The relay is on by default, because a messenger that only works on one network is not much of one. It can be switched off from settings.&lt;/li&gt;
&lt;li&gt;Nearby Connections is Android-only. There is no iOS version, and a desktop version would be LAN plus relay, without the Bluetooth mesh.&lt;/li&gt;
&lt;li&gt;I could not test the network paths end to end in my build environment: no KVM, so no emulator. The retry logic is covered by unit tests, but real two-phone behaviour is the thing to try first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is Apache-2.0, and the APK is on the releases page: &lt;a href="https://github.com/ciao22king/ShutChat" rel="noopener noreferrer"&gt;https://github.com/ciao22king/ShutChat&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>opensource</category>
      <category>privacy</category>
    </item>
    <item>
      <title>EdgePassport</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Thu, 22 Oct 2026 17:22:51 +0000</pubDate>
      <link>https://dev.to/imadev22/edgepassport-3nbf</link>
      <guid>https://dev.to/imadev22/edgepassport-3nbf</guid>
      <description>&lt;p&gt;Every time you open a website, you touch a physical city.&lt;/p&gt;

&lt;p&gt;Not "the cloud" — a real building, somewhere on Earth.&lt;/p&gt;

&lt;p&gt;Edge Passport shows you the one closest to you, as a passport card you can share.&lt;/p&gt;

&lt;p&gt;Which city did you touch today&lt;br&gt;
&lt;a href="https://edge-passport.ciao22king.workers.dev" rel="noopener noreferrer"&gt;https://edge-passport.ciao22king.workers.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>EdgePassport</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Tue, 20 Oct 2026 20:11:12 +0000</pubDate>
      <link>https://dev.to/imadev22/edgepassport-4m78</link>
      <guid>https://dev.to/imadev22/edgepassport-4m78</guid>
      <description>&lt;p&gt;Edgepassport Remember were you were &lt;br&gt;
with edgepassport you can see where you've been and where others have been, fun fuct on where you are and questions &lt;a href="https://edge-passport.ciao22king.workers.dev" rel="noopener noreferrer"&gt;https://edge-passport.ciao22king.workers.dev&lt;/a&gt; I'm waiting for &lt;a href="https://nic.eu.org" rel="noopener noreferrer"&gt;https://nic.eu.org&lt;/a&gt; as an extension (It Will be &lt;a href="https://edgepassport.eu.org" rel="noopener noreferrer"&gt;https://edgepassport.eu.org&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>webapp</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>GoFetch</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:27:50 +0000</pubDate>
      <link>https://dev.to/imadev22/gofetch-272l</link>
      <guid>https://dev.to/imadev22/gofetch-272l</guid>
      <description>&lt;p&gt;use a simple cli for clone GitHub and gitlab repos &lt;a href="https://github.com/ciao22king/GoFetch" rel="noopener noreferrer"&gt;https://github.com/ciao22king/GoFetch&lt;/a&gt; Built for Windows macOs and Linux in beta stage may not work the code was built by me with bug fix of the ai&lt;/p&gt;

</description>
      <category>developer</category>
      <category>github</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>OwnCode: Build Something</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Thu, 23 Jul 2026 20:17:32 +0000</pubDate>
      <link>https://dev.to/imadev22/owncode-build-something-1n91</link>
      <guid>https://dev.to/imadev22/owncode-build-something-1n91</guid>
      <description>&lt;p&gt;Today I released my web app to the public and I'll explain what it does.&lt;/p&gt;

&lt;p&gt;1° It is a project where privacy comes first. Your chats are sent to the Firebase Firestore server but no one will ever read them The API Keys will not be saved in the cloud but in local storage.&lt;/p&gt;

&lt;p&gt;2° With this BYOK (Bring Your Own Key) project you will use your own gemini api but who knows maybe one day I will add more providers anyway we forced gemini to write real code🤣&lt;/p&gt;

&lt;p&gt;3° This is an unfunded project, and I'm looking for testers, even if they don't get paid. I'd be very happy. Here is the link &lt;a href="https://owncode.ai.studio/" rel="noopener noreferrer"&gt;https://owncode.ai.studio/&lt;/a&gt; and write In the comments if you want to be a tester or bug or feedback &lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>OwnCode: Create amazing apps</title>
      <dc:creator>ImADev</dc:creator>
      <pubDate>Wed, 22 Jul 2026 20:24:09 +0000</pubDate>
      <link>https://dev.to/imadev22/owncode-create-amazing-apps-42ik</link>
      <guid>https://dev.to/imadev22/owncode-create-amazing-apps-42ik</guid>
      <description>&lt;p&gt;Today I finally uploaded OwnCode to the web and now I'll explain what it does.&lt;br&gt;
It's a BYOK (bring your own api) project in this case by gemini. With our site you can force gemini to work 🤣!Anyway you give him a prompt and like any other AI he writes code in a built-in editor.&lt;br&gt;
I need testers obviously this is an unfunded project so they won't be paid but I'd be very happy if someone would try it. Here is the link &lt;a href="https://owncode.ai.studio/" rel="noopener noreferrer"&gt;https://owncode.ai.studio/&lt;/a&gt; and write in the comments if there is any bug etc.Your password will not be sent to any server.&lt;/p&gt;

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