<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
  <title>Sarah's Forge .Dev Blog</title>
  <link>https://sarahsforge.dev</link>
  <description>The latest thoughts, tutorials, and project updates on development and technology from Sarah's Forge.</description>
  <language>en-us</language>
  <lastBuildDate>Tue, 18 Aug 2026 13:58:48 +0000</lastBuildDate>
  <item>
    <title>Someone Tried to Hack Sarah&#039;s Forge. Here&#039;s What Happened.</title>
    <link>https://sarahsforge.dev/blog/someone-tried-to-hack-sarah-s-forge-here-s-what-happened-</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/someone-tried-to-hack-sarah-s-forge-here-s-what-happened-</guid>
    <pubDate>Wed, 29 Jul 2026 23:21:30 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>Last night, someone pointed an automated vulnerability scanner at Sarah's Forge. Eighty-four support tickets. Hundreds of replies. Over 400,000 HTTP requests. All in the span of a few hours.</p>
<p>They threw everything at it. SQL injection. Cross-site scripting. Path traversal. Template injection. Server-side request forgery. Command execution. Even tried a bit of directory brute-forcing on the side.</p>
<p>Nothing got through.</p>
<hr />
<h2>Why It Did Nothing</h2>
<p>This site is built on a simple PHP stack with no framework. Every database query uses PDO prepared statements. User input isn't concatenated into SQL queries. Period.</p>
<p>That's it. That's the entire defense. One architectural decision made a year ago rendered every SQL injection payload completely inert.</p>
<p>For the XSS attempts, every piece of user-submitted content goes through <code>htmlspecialchars()</code> before it touches a page. No script tags fire. No event handlers execute. No beacons phone home.</p>
<p>No data was accessed. No database queries were manipulated. No JavaScript ran. The scanner essentially yelled into a void and got silence back.</p>
<hr />
<h2>What I Did</h2>
<p>IP banned via iptables and .htaccess. All tickets deleted. User account wiped. Took about three minutes.</p>
<p>The DirBuster traffic was actually more annoying than the injection attempts — 400,000 HEAD requests cluttering up the access logs. The injection payloads were dramatic but harmless. Stored as plain text in the database, never executed, never parsed.</p>
<hr />
<h2>What I Learned</h2>
<p>If you're building a web application in 2026, prepared statements and output escaping are not optional. They're the floor. And the floor held.</p>
<p>I also realized I should probably add rate limiting to the support ticket form. Eighty-four tickets from one IP in a few hours is absurd. That'll be the next improvement.</p>
<hr />
<h2>The Takeaway</h2>
<p>Automated scanners crawl the web constantly. If you're running any public-facing service, you'll get hit. Probably already have been. The question is whether your stack catches it or not.</p>
<p>Mine did. Pretty satisfying, honestly.</p>
<p>Sarah</p>]]></description>
  </item>
  <item>
    <title>Sniffing Cable Networks</title>
    <link>https://sarahsforge.dev/blog/sniffing-cable-networks</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/sniffing-cable-networks</guid>
    <pubDate>Sat, 11 Jul 2026 05:31:19 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<h1>Decoding the Hidden Data on Your Cable Line</h1>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1783747355_398c2082.JPG" alt="docsis 2" /></p>
<p>A few years ago I made a video about visualizing the signals on my local cable network. However just staring at a bunch of QAM signals is boring. I wanted to do something more interesting.</p>
<p>That's when I found out about OOB or out of band signaling in the cable networks, often used for the EPG data and provisioning.</p>
<p>I set out to decode it and integrate that decoder into SignalScope (update soon).</p>
<p>What started as staring at mystery radio waves turned into a massive reverse-engineering project. I ended up building a toolchain called <code>oobscte55</code> to decode these hidden signals from documentation. If you've ever wondered how your cable box knows what channel CNN is on, or how it gets firmware updates without the internet, here is a breakdown of the journey from raw radio waves to readable text.</p>
<hr />
<h2>Step 1: Capturing the Invisible Waves</h2>
<p>Before we can decode anything, we need to capture the signal. Using a standard Software Defined Radio (SDR), I recorded a raw audio-like file of the OOB carrier directly from the cable line.</p>
<p>Instead of sound, we're recording the raw electromagnetic spectrum. In this case, the signal is a <strong>1.544 Mb/s</strong> data stream sitting slightly offset from the main TV channels. To the naked eye, it just looks like static.</p>
<h2>Step 2: From Waves to Bits (Demodulation)</h2>
<p>To make sense of that static, we have to "demodulate" it. This specific network uses a transmission method called <strong>QPSK</strong> (Quadrature Phase Shift Keying).</p>
<p>In simple terms, the transmitter rapidly changes the <em>phase</em> (the starting angle) of the radio wave to one of four specific positions. Each position represents two bits of digital data (00, 01, 10, or 11). By mathematically tracking these phase shifts, my software turns the raw radio wave recording into a massive, continuous stream of 1s and 0s.</p>
<h2>Step 3: Finding the Rhythm (Framing)</h2>
<p>Now we have a mountain of bits, but no idea where a sentence starts or ends.</p>
<p>The protocol organizes the data into structured chunks called <strong>superframes</strong>. To help receivers (like a set-top box or my script) find their place, the transmitter inserts a "Frame Alignment Signal"—a highly predictable pattern of bits (<code>0, 0, 1, 0, 1, 1</code>) at exact intervals. Once the software locks onto this repetitive pattern, it can sync up and reliably read the actual payload.</p>
<h2>Step 4: Fixing the Static (Error Correction)</h2>
<p>Cable lines aren't perfect; physical interference easily causes bits to flip in transit (a 1 accidentally becomes a 0).</p>
<p>To fix this, the system uses <strong>Reed-Solomon error correction</strong>. It's a clever mathematical trick where the transmitter adds a little bit of extra padding to the data. If a few bits get scrambled along the way, our decoder can use that padding to perfectly reconstruct the missing information. On a clean capture, this step easily fixes over 90% of the transmission errors!</p>
<h2>Step 5: Tiny Digital Envelopes (ATM Layer)</h2>
<p>Once the data is clean, we find out it's packaged into <strong>ATM cells</strong>. ATM (Asynchronous Transfer Mode) is a classic networking standard that chops data up into tiny, 53-byte digital envelopes.</p>
<p>Each envelope has a 5-byte header (the address) and a 48-byte payload (the letter inside). By reading the addresses on the envelopes, we can sort the traffic into different buckets. For example:</p>
<ul>
<li><strong>Address <code>0xFF/0xFFFF</code>:</strong> The Electronic Program Guide (EPG).</li>
<li><strong>Address <code>0x00/0x0021</code>:</strong> Network control and provisioning instructions.</li>
</ul>
<h2>Step 6: The Data Carousel</h2>
<p>So, how does a cable box download a large file, like a multi-day channel guide, if it can't directly ask the head-end server to send it?</p>
<p>It uses a <strong>Data Carousel</strong>. The cable provider simply broadcasts the files over and over again in a continuous loop, exactly like luggage on an airport carousel. The receiver waits until the file it needs comes around, grabs the pieces out of the ATM envelopes, and stitches them back together using standard internet protocols like IP and UDP.</p>
<h2>The Payoff: What We Actually Get</h2>
<p>After running this whole gauntlet—from radio waves to ATM cells to reassembled files—we finally hit the jackpot. So, what is actually hiding in the signal?</p>
<ul>
<li><strong>The Channel Lineup:</strong> A clean text map linking call signs to channel numbers (e.g., <em>WKYC is Channel 4, AMC is Channel 278</em>).</li>
<li><strong>System Configuration:</strong> The hidden instructions that tell your cable box exactly what frequencies to tune to for its main data and upstream service channels.</li>
<li><strong>Firmware Details:</strong> Plain-text server URLs for software updates and background Java apps.</li>
<li><strong>The Program Grid:</strong> The actual TV schedule with show titles and times. <em>(Note: The schedule bodies themselves use a proprietary Cisco compression, so reading them requires reversing a custom codec, but the binary records are completely visible!)</em></li>
</ul>
<hr />
<p>It is incredibly satisfying to pull a mystery signal out of a copper wire and peel back the protocol layers until you find human-readable text. It's a great reminder of just how much engineering goes into simply turning on the TV.</p>
<p>Keep an eye out for the SignalScope integration coming soon!</p>]]></description>
  </item>
  <item>
    <title>The LibreSDR aka B210 Mini</title>
    <link>https://sarahsforge.dev/blog/the-libresdr-aka-b210-mini</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/the-libresdr-aka-b210-mini</guid>
    <pubDate>Wed, 08 Jul 2026 06:54:52 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>With the advent of InmarScope I finally had a nice UI for SDR play.
So I decoded to finally try adding the LibreSDR again.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1783493558_ebd27dfc.png" alt="libreconsole" /></p>
<p>This SDR doesn't have a bias-tee but it has a massive 56msps rate that I've been using to look around.
It appears I can see multiple LTE cells at the same time and I wonder if I should see about using it with CellScope to allow for the ability the decode multiple cells at once.</p>
<p>What do you think?</p>]]></description>
  </item>
  <item>
    <title>InmarScope Linux Builds</title>
    <link>https://sarahsforge.dev/blog/inmarscope-linux-builds</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/inmarscope-linux-builds</guid>
    <pubDate>Wed, 08 Jul 2026 03:10:57 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>InmarScope now officially compiles on linux!</p>
<p>If you've been wanting to run InmarScope on linux, now's your chance!
The only thing is we don't have our map anymore for ICAO calls.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1783480256_81242504.png" alt="image" /></p>]]></description>
  </item>
  <item>
    <title>Iridium - The Next Frontier?</title>
    <link>https://sarahsforge.dev/blog/iridium---the-next-frontier-</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/iridium---the-next-frontier-</guid>
    <pubDate>Tue, 30 Jun 2026 07:59:35 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>Iridium is not like other satellite networks. It is low Earth orbit, close to the ground, moving fast, and talking constantly through a mesh of cross links. The signals are structured but not simple. There are bursts, frames, logical channels, and a protocol stack that lives somewhere between a cellular network and a deep space probe.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1782806221_83a726d9.JPG" alt="iridiscope" /></p>
<p>I already have the hardest piece working. Burst frames are the atomic unit of an Iridium transmission. Without clean burst detection, nothing else matters. And I have that. I also have IMSI decoding, which means I can identify individual subscribers and devices. That is a specific, valuable piece of information.</p>
<p>But the rest is still opaque. The call setup, the text messages, the location updates, the higher layer data. The signal is full of information, but my decoder only sees the skeleton.</p>
<p>That gap is what pulls me forward. This is not a simple reverse engineering project. It is a puzzle where the manuals are outdated, the waveforms are complex, and the system was designed to be resilient, not transparent. Every piece I add unlocks more. Every decoded message tells me where to look next.</p>
<p>Iridium has been in orbit for over two decades. The satellites are old, the hardware is fixed, and the protocol is documented in fragments. That makes it a perfect target for someone who likes to dig deep into signal processing and bitstream analysis.</p>
<p>So yes, this is my next development target. Not because it is easy, but because it is almost within reach. The burst frames work. The IMSI decoding works. The rest is just waiting to be cracked open.</p>]]></description>
  </item>
  <item>
    <title>A Week of Inmarsat</title>
    <link>https://sarahsforge.dev/blog/a-week-of-inmarsat</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/a-week-of-inmarsat</guid>
    <pubDate>Sun, 21 Jun 2026 08:24:36 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>I've been working on porting JAERO to Android and with PocketAERO I believe I did just that.
Since then I've decided that JAERO is outdated and we really needed an SDR-First GUI application for decoding data from the Inmarsat Satellites.</p>
<p>Welcome in, InmarScope.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1782029991_11e5c7a5.png" alt="image" /></p>
<p>I started with a waterfall and fft on a dear im gui interface and added on a wav/IQ playback functionality.
With this I could take what I learned with PocketAERO and bring that over to InmsarScope.</p>
<p>It supports common AERO modes including 8400 baud AERO Voice calls and STD-C EGC messages!
Futher we have full voice call following by listening to P-Channels for C Channel Assignments.</p>
<p>From there I added support for remote servers and the RTL SDR and HackRF.
Data output modes like JAERO had and more!</p>
<p>Tonight, I felt that the listen and hop method of listening to AERO calls works but you'll miss calls due to the fact that we have to stop monitoring P-Channels in order to listen to voice Channels within the bandwidth of an RTL-SDR.</p>
<p>So I added a split-view for dual RTL SDR mode, allowing users to use two RTL-SDRs to listen into P-Channel for messages and at the same time decode and record 8400 baud AERO Voice channels.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1782030273_defc0e57.png" alt="image2" /></p>
<p>Stay tuned for more!</p>]]></description>
  </item>
  <item>
    <title>Three Days to Inmarsat</title>
    <link>https://sarahsforge.dev/blog/three-days-to-inmarsat</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/three-days-to-inmarsat</guid>
    <pubDate>Sat, 13 Jun 2026 01:12:32 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>So I've had this idea for a while, what if you could listen to AERO calls and ACARS messages on Android?</p>
<p>Crazy idea right? Seriously though, I love porting things to android and wiring them up with FFI bindings.
I've had fun porting multimon-ng, DSD-Neo, RTLAMR, RTL-433 and others to android and so, why not JAERO?</p>
<p>I recently had a few days off and went no-sleep for the first 60 or so hours knocking my head against this problem. You see there's something very different about AERO decoding from say decoding AMR, 433 or even digital voice.</p>
<p>The signals are never in the same place, you have to visually tune AERO signals. Thus that meant getting a working FFT/Waterfall before I could even start decoding. I already had this working previously in a private project of mine that my Patrons have been testing out and so I figured I'd re-use that tooling.</p>
<p>See it's a flutter project like most all my Android projects but I used C for the FFT/Waterfall and DSP so ensure optimal functionality and because well, flutter can only do so much on it's own.</p>
<p>The first night was tireless, I was amped up and ready to tackle the issue, I managed to port a working C variant of JAERO's 10500 bps ACARS decoder and was successfully decoding an IQ file on linux, the next step was taking that to Android.</p>
<p>Except, I accidentally deleted the native decoder early in the wee hours of the morning and lost many hours of work in the process. Though I thankfully found another port already finished online that was working for everything but voice.</p>
<p>Bringing that JAERO derived library into Android was fairly simple with FFI bindings in flutter and I was able to get the same file sample to decode on Android.</p>
<p>That was it! I had AERO ACARS decoding on Android! Now I just had to get it working over the air.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1781313024_d3bd187c.jpg" alt="Screenshot_20260611_195804" /></p>
<p>The issue I've spent the last who knows how many hours on has been filtering and DSP work trying to get over the air decoding to work.</p>
<p>That's where this project currently stands and why you've not seen it available anywhere on the Forge.
I typically don't like to talk about what I'm building until I know what I'm trying to do is feasible.</p>
<p>I've made good progress but now it's time to sleep on it for a while and get some rest.
I've gotta work tomorrow and I'll need some time to recover before I can dive head first back into ACARS land.</p>]]></description>
  </item>
  <item>
    <title>DeDECTive - The Update You&#039;ll Never See</title>
    <link>https://sarahsforge.dev/blog/dedective---the-update-you-ll-never-see</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/dedective---the-update-you-ll-never-see</guid>
    <pubDate>Tue, 09 Jun 2026 23:51:50 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>There's a reason that DeDECTive is available on Github and not on Sarah's Forge.
There's a reason that I built it cross platform and further.</p>
<p>There's a reason that I didn't add part tagging, recording features or things of the sort.</p>
<p>The legal codes in the United States where I reside and in most other areas around the world do not look very kindly at the interception of private communications. Further, to record such conversations is generally a no-no.</p>
<p>I would love to implement these features, many of you have asked for them.
The simple nature of it is that there isn't really a need for those features unless you're using the application to monitor private communications.</p>
<p>So while the software will follow calls and joins PP and RFP together it's still limited specifically to keep things sane.</p>
<p>I do not wish to be liable for how someone uses the software, it's why I've simply made it available instead of hosting it on the Forge.</p>]]></description>
  </item>
  <item>
    <title>Social Share, Image/Video Embeds, Download Counts, Reviews and More!</title>
    <link>https://sarahsforge.dev/blog/social-share-image-video-embeds-download-counts-reviews-and-more-</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/social-share-image-video-embeds-download-counts-reviews-and-more-</guid>
    <pubDate>Fri, 05 Jun 2026 07:17:38 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>I’ve recently added the ability to leave testimonials and ratings on Sarah’s Forge. This is something I’ve wanted to do for a while, because feedback from customers and visitors is incredibly valuable. It helps me understand what people really enjoy and what could be improved. If you’ve downloaded or purchased anything from the store, I encourage you to come back and leave a rating or a short testimonial. Your thoughts will guide future projects and help others decide what might work well for them. Even a quick star rating makes a difference.</p>
<p>I’ve also added download counts for every item in the store. Now you can see how many times each file has been downloaded, which gives a clearer picture of what’s popular. This is useful for both me and for you, because it highlights the designs that resonate most with the community. The download count adds a layer of transparency and helps you spot trending items at a glance.</p>
<p>Social sharing is now available on blog posts and store items as well. You can easily share your favorite finds on platforms like Facebook, or BlueSky. This makes it simple to spread the word about something you love, whether it’s a tutorial, a new product, or a behind-the-scenes story. I’ve also added embedding to blog posts, so I can include images and videos directly in the posts. This means richer, more engaging content without needing to click away to other sites. Photos of finished projects, step-by-step video guides, and close-up details can all be part of the reading experience now. It makes the blog feel more alive and connected to the crafting process.</p>]]></description>
  </item>
  <item>
    <title>50% OFF for Pride Month</title>
    <link>https://sarahsforge.dev/blog/50-off-for-pride-month</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/50-off-for-pride-month</guid>
    <pubDate>Thu, 04 Jun 2026 23:55:41 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>This month only, get 50% off everything in the store when you use the code PRIDEMONTH at checkout. It is a limited time offer, so do not wait. Celebrate with us and grab what you love while the sale lasts.</p>]]></description>
  </item>
  <item>
    <title>PocketProgrammer</title>
    <link>https://sarahsforge.dev/blog/pocketprogrammer</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/pocketprogrammer</guid>
    <pubDate>Thu, 04 Jun 2026 08:03:13 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>This is very much a work in progress, but I wanted to share a quick sneak peek at PocketProgrammer. It is an Android application I have been building. The core idea is simple. PocketProgrammer will let you read and configure serial radios right from your phone or tablet.</p>
<p><img src="https://sarahsforge.dev/uploads/blog/blog_1780560037_ff6c54fa.gif" alt="VID_20260604_022721" /></p>
<p>Right now, the focus is on serial connections. That is the primary way these radios talk, so that comes first. I am also looking at adding Bluetooth support down the line. That would cover a lot of newer radios and make the tool even more useful in the field.</p>
<p>The goal is to offer a proper alternative to carrying around a laptop just to change a frequency or update a setting. With PocketProgrammer, you can connect directly to the radio, read its current configuration, and write new settings. It is designed to be straightforward and practical.</p>
<p>The app is still rough around the edges. There are features to add, bugs to fix, and a lot of testing to do. But the foundation is there. If you work with serial radios and have wanted a more portable way to manage them, this is something to keep an eye on.</p>
<p>I will share more as development continues. Feedback from people who actually use these radios will be very valuable, so feel free to reach out when the time comes. For now, this is the start of something promising.</p>]]></description>
  </item>
  <item>
    <title>Texas Age ID Checks Updates</title>
    <link>https://sarahsforge.dev/blog/texas-age-id-checks-updates</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/texas-age-id-checks-updates</guid>
    <pubDate>Wed, 03 Jun 2026 06:14:34 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>I got this email from Google Play today. It says Texas has a new law, SB 2420, that forces app stores to verify user ages and get parental consent. Google is rolling out their Age Signals API to help developers follow the rules. I have no interest in participating in any of this. I will not add age checks or ID verification to my apps. I will evade this as long as I can.</p>
<p>I am still figuring out my next move. One option is to stop distributing Pocket25 in Texas through the Google Play Store. I could keep offering it for side loading from pocket25.com instead. That way, users in Texas can still get the app directly from me without any store enforced age gates. I am not sure yet. I need to weigh the hassle against the risk.</p>
<p>For now, I will not update my apps to use the Play Age Signals API. I will not collect or pass along any age data to Google. If Texas wants to track users, they can do it without my help. I built Pocket25 for a specific audience, and age checks are not part of that vision. I will find a workaround or simply pull the app from the Texas storefront. Side loading is simple and keeps the control where it belongs. With the user. Not with the state or the store.</p>]]></description>
  </item>
  <item>
    <title>The Return of Android Apps!</title>
    <link>https://sarahsforge.dev/blog/the-return-of-android-apps-</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/the-return-of-android-apps-</guid>
    <pubDate>Mon, 01 Jun 2026 02:47:56 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>After I deleted apps on the forge, I realized I had acted on impulse. Google had announced upcoming changes to its policy on side loading apps, and I felt a sudden pressure to clear everything out. It was a rash move, and I did not need to make it. The decision came from a place of caution, but it was not well thought out. I removed tools and utilities that people relied on, and I left a gap that I now have to fill.</p>
<p>I am slowly replacing those apps now. Each one requires careful attention. I need to get them signed properly, which is a step I should have taken from the start instead of panicking. The signing process ensures that the apps are trusted and secure, and it aligns with the new policy requirements. It is tedious work, but it is necessary.</p>
<p>At the same time, I am updating them with our new versioning API. This is a feature I have been meaning to implement for a while. The API allows the apps to tell you if there is an update waiting for it. Instead of you having to check manually or rely on outside sources, the app itself will notify you. It is a small improvement, but it makes a big difference in keeping everyone on the latest and safest version.</p>
<p>Rebuilding takes time, and I have to remind myself that progress is still progress even if it is slow. The apps are coming back one by one, each better than before. The rash move cost me some convenience and trust, but it also taught me a lesson about acting on fear. Now I am focused on doing it right, with proper signing and better update management. The forge will be fully stocked again, and this time it will be built to last.</p>]]></description>
  </item>
  <item>
    <title>DeepWP: How AI Takes Full Control of Your WordPress Site</title>
    <link>https://sarahsforge.dev/blog/deepwp-how-ai-takes-full-control-of-your-wordpress-site</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/deepwp-how-ai-takes-full-control-of-your-wordpress-site</guid>
    <pubDate>Sat, 30 May 2026 07:05:44 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>DeepWP is a WordPress plugin that brings a chat bot directly into your wp-admin dashboard. It connects you to DeepSeek AI, and you use your own API key. This setup gives the AI full control over your website through 41 built in tools.</p>
<p>Imagine having an AI assistant that lives inside your WordPress admin. You can talk to it just like you would with any chat bot. But instead of just answering questions, this AI can actually take action on your site. It can create posts, update pages, manage users, adjust settings, and much more. The 41 tools cover almost every aspect of site management.</p>
<p>Getting started is simple. You install the DeepWP plugin like any other. Then you add your DeepSeek API key from your account. Once that is done, the chat bot appears in your admin panel. You type a command or ask a question, and the AI responds. If you ask it to do something, it will use the appropriate tool to make it happen.</p>
<p>The power here is in the tool set. The AI can write and edit content. It can change themes and plugins. It can handle media uploads and user roles. It can even run database queries if you need that. Each tool gives the AI a specific ability, and together they cover the full range of what you can do in WordPress.</p>
<p>This is useful for busy site owners. You can delegate routine tasks to the AI. You can ask it to schedule posts or optimize images. You can have it check for broken links or update your site’s SEO settings. The AI works fast and follows your instructions precisely.</p>
<p>DeepWP turns your WordPress admin into a command center. Instead of clicking through menus and forms, you just tell the AI what you need. It handles the rest. For anyone who manages a WordPress site regularly, this plugin saves time and effort. The 41 tools give DeepSeek AI complete control, and that control is exactly what you need to run your site efficiently.</p>]]></description>
  </item>
  <item>
    <title>Version Tracking, Changelogs &amp; an Update API</title>
    <link>https://sarahsforge.dev/blog/version-tracking-changelogs-an-update-api</link>
    <guid isPermaLink="true">https://sarahsforge.dev/blog/version-tracking-changelogs-an-update-api</guid>
    <pubDate>Sat, 30 May 2026 05:58:18 +0000</pubDate>
    <dc:creator>SarahRose</dc:creator>
    <description><![CDATA[<p>Every piece of software I ship through the Forge just got a whole lot smarter.</p>
<p>Starting today, every product page now shows a <strong>version number</strong> right next to the title, so you know exactly what you're getting. Below the screenshots, you'll find a full <strong>changelog</strong>  a running timeline of every update, what changed, and when it dropped.</p>
<p>No more guessing whether you have the latest build.
And to tie it all together, each product now exposes a lightweight <strong>API endpoint</strong> your apps can call to check for updates automatically. Give it your current version and it'll tell you if there's something newer waiting. </p>
<p>Dead simple.</p>
<p>Here's what that looks like in practice:</p>
<ul>
<li>Buy a product once, never wonder if you're out of date</li>
<li>Apps can ping the API and alert you when an update is available</li>
<li>Full changelog history lives right on the product page
This is the kind of polish I want baked into everything that leaves the Forge. More to come.
— Sarah</li>
</ul>]]></description>
  </item>
</channel>
</rss>
