<?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: M S</title>
    <description>The latest articles on DEV Community by M S (@unixwzrd).</description>
    <link>https://dev.to/unixwzrd</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%2F1121490%2F87c2fcd8-3da6-4a52-969f-8661a80e0a25.jpeg</url>
      <title>DEV Community: M S</title>
      <link>https://dev.to/unixwzrd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/unixwzrd"/>
    <language>en</language>
    <item>
      <title>UnicodeFix: The Day Invisible Characters Broke Everything</title>
      <dc:creator>M S</dc:creator>
      <pubDate>Fri, 25 Apr 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/unixwzrd/unicodefix-the-day-invisible-characters-broke-everything-2kbd</link>
      <guid>https://dev.to/unixwzrd/unicodefix-the-day-invisible-characters-broke-everything-2kbd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxd5qydqrpqsjvzsgahq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxd5qydqrpqsjvzsgahq.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Frustration to Fix
&lt;/h2&gt;

&lt;p&gt;This all started maybe five days ago with a Python script that just wouldn’t run.&lt;/p&gt;

&lt;p&gt;Not because of logic errors. Not bad syntax.&lt;br&gt;&lt;br&gt;
No, this was something worse — something invisible.&lt;/p&gt;

&lt;p&gt;I had copied some code straight out of Cursor’s chat panel into a file. Looked fine. Ran it.&lt;br&gt;&lt;br&gt;
Boom: &lt;code&gt;IndentationError: unexpected indent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I stared at it for a while, pulled my hair a bit. I &lt;em&gt;knew&lt;/em&gt; the indentation was fine.&lt;br&gt;&lt;br&gt;
It was flat code — no nesting, no tabs. I even did a global find-and-replace on the leading spaces.&lt;br&gt;&lt;br&gt;
Same result.&lt;/p&gt;

&lt;p&gt;The idea that it could be Unicode? Didn’t even occur to me.&lt;/p&gt;

&lt;p&gt;Eventually, Cursor’s own assistant piped up and said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Oh, you’ve got hidden Unicode spaces at the beginning of each line. Strip those out and it’ll run.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And sure enough — it did.&lt;/p&gt;

&lt;p&gt;That one invisible character wasted hours.&lt;br&gt;&lt;br&gt;
It looked like whitespace. It &lt;em&gt;acted&lt;/em&gt; like whitespace. But it broke the interpreter.&lt;/p&gt;

&lt;p&gt;And that’s when I started looking around.&lt;br&gt;&lt;br&gt;
Turns out, I wasn’t the only one.&lt;/p&gt;

&lt;p&gt;I hit Reddit and started seeing post after post:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cursor broke my code with invisible stuff.”&lt;br&gt;&lt;br&gt;
“VS Code is inserting Unicode garbage and my linter can’t catch it.”&lt;br&gt;&lt;br&gt;
“Why does AI code have these weird characters no human would ever type?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One comment hit a nerve:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI code has a Unicode accent now. Professors can tell.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that’s when it clicked. This isn’t just annoying. It’s serious.&lt;/p&gt;

&lt;p&gt;These invisible Unicode characters — zero-width spaces, left and right smart quotes, BOMs, and friends — can break everything from Python scripts to YAML configs to HTML layouts.&lt;/p&gt;

&lt;p&gt;In some cases, they even flag work as AI-generated.&lt;br&gt;&lt;br&gt;
Imagine working hard on something, refining it, shaping it — only for it to be dismissed because the quotes aren’t “ASCII enough.”&lt;/p&gt;

&lt;p&gt;It brought back flashbacks from Japan, too — the dreaded &lt;strong&gt;mojibake&lt;/strong&gt; , when UTF-8 and UTF-16 would collide and your characters would turn into incomprehensible glyph soup. Rendering issues. Encoding mismatches. Terminal output that looked like alien language.&lt;/p&gt;

&lt;p&gt;These weren’t just technical nuisances. They were trust-breakers.&lt;/p&gt;

&lt;p&gt;I realized: we needed a fix. A proper tool. Something &lt;strong&gt;immediate&lt;/strong&gt; , &lt;strong&gt;local&lt;/strong&gt; , and &lt;strong&gt;clean&lt;/strong&gt; — to give people back control over their text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dictation = Velocity
&lt;/h2&gt;

&lt;p&gt;One thing made this project move faster than anything else: I wasn’t typing.&lt;/p&gt;

&lt;p&gt;I’d just wrapped up my Willow Voice trial on macOS and was on the fence. I figured I’d give it one more go.&lt;br&gt;&lt;br&gt;
And it was like flipping a switch.&lt;/p&gt;

&lt;p&gt;Suddenly, instead of chasing ideas with my keyboard, I could speak them aloud as fast as they came to me.&lt;br&gt;&lt;br&gt;
Function names. Log messages. TODOs. Architecture decisions. Even this blog post — much of it dictated, not typed.&lt;/p&gt;

&lt;p&gt;Willow handled the flow like a pro: no filler, no “uhhh”, no lag between thought and code.&lt;/p&gt;

&lt;p&gt;In a way, it made collaboration with my AI assistant more fluid too — like having a real-time partner in a shared headspace. I wasn’t juggling syntax; I was thinking &lt;em&gt;about&lt;/em&gt; what I wanted to build. The layers, the UX flow, the traps to avoid — and the fixes.&lt;/p&gt;

&lt;p&gt;Honestly? That single shift cut development time by at least 30%. Maybe more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting It to Click
&lt;/h2&gt;

&lt;p&gt;Once the core functionality was solid — stripping quotes, normalizing dashes, vaporizing zero-width ghosts — the question was: how do we &lt;strong&gt;make this easy for anyone to use&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;I didn’t want this to live only in the CLI. Sure, it could work in pipelines, inside Vim via &lt;code&gt;%!&lt;/code&gt;, or piped from &lt;code&gt;pbpaste&lt;/code&gt;. But not everyone lives in a terminal.&lt;/p&gt;

&lt;p&gt;That’s when I turned to macOS Shortcuts — and that’s where things got weird.&lt;/p&gt;

&lt;p&gt;Shortcuts seemed simple at first. Just a shell command, right?&lt;br&gt;&lt;br&gt;
But it quickly became clear: to pass file arguments into a proper Python environment with a &lt;code&gt;conda&lt;/code&gt;-managed virtualenv, I needed a full login shell, &lt;code&gt;.bashrc&lt;/code&gt; execution, and some clever quoting tricks.&lt;/p&gt;

&lt;p&gt;One misstep and the shortcut would fail silently, or worse — run without activating the environment.&lt;br&gt;&lt;br&gt;
Even getting arguments passed in cleanly required tweaking the &lt;code&gt;bash -l -c&lt;/code&gt; incantation to include both the Python script and the parameters &lt;em&gt;outside&lt;/em&gt; the quoted string. Subtle stuff, but critical.&lt;/p&gt;

&lt;p&gt;And yet, when it finally worked — right-clicking one or more files in Finder, selecting “Strip Unicode”, and instantly generating &lt;code&gt;.clean.txt&lt;/code&gt; outputs — it felt like we’d stitched together something &lt;em&gt;native&lt;/em&gt;. Something that belonged there all along.&lt;/p&gt;

&lt;p&gt;It was clean, it was fast, and it worked exactly as you’d expect.&lt;/p&gt;

&lt;p&gt;Mission complete? Not quite — but the bones were solid.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Was Bigger Than Expected
&lt;/h2&gt;

&lt;p&gt;At first, it seemed simple enough: strip out invisible Unicode junk and normalize spacing.&lt;br&gt;&lt;br&gt;
But like most rabbit holes in computing, the deeper we looked, the more twisted it got.&lt;/p&gt;

&lt;p&gt;It wasn’t just zero-width spaces or sneaky joiners that were breaking things.&lt;br&gt;&lt;br&gt;
It was &lt;strong&gt;smart quotes&lt;/strong&gt; , &lt;strong&gt;em-dashes&lt;/strong&gt; , &lt;strong&gt;weird hyphens&lt;/strong&gt; , and other typographically “fancy” Unicode that had no business being inside a code block. Stuff that wouldn’t break your editor, but &lt;em&gt;would&lt;/em&gt; break your parser.&lt;/p&gt;

&lt;p&gt;Quotes that looked like this — “ ” — instead of this — “ “.&lt;br&gt;&lt;br&gt;
Characters that rendered fine on macOS or a web page, but blew up inside Python, YAML, or Markdown.&lt;br&gt;&lt;br&gt;
And the real kicker? They were almost impossible to spot unless you were &lt;em&gt;really&lt;/em&gt; looking — or digging with a hex editor.&lt;/p&gt;

&lt;p&gt;I realized it wasn’t just an inconvenience. It could affect &lt;em&gt;everything&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code execution&lt;/li&gt;
&lt;li&gt;Web rendering&lt;/li&gt;
&lt;li&gt;AI detection&lt;/li&gt;
&lt;li&gt;Text indexing&lt;/li&gt;
&lt;li&gt;Compatibility between systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You name it.&lt;/p&gt;

&lt;p&gt;Redditors were screaming about it.&lt;br&gt;&lt;br&gt;
I was quietly screaming too — holding open a hex editor and shaking my head.&lt;/p&gt;

&lt;p&gt;The more we dug, the deeper it got.&lt;/p&gt;

&lt;p&gt;I had my assistant generate a whole suite of test files: filled to the brim with Unicode landmines.&lt;br&gt;&lt;br&gt;
Some were invisible. Some were misleading. All of them were traps — not academic samples, but real-world mimics of AI-generated content copied from ChatGPT windows, web pages, and embedded chat panels.&lt;/p&gt;

&lt;p&gt;We weren’t just “cleaning up whitespace” anymore.&lt;br&gt;&lt;br&gt;
We were building a &lt;strong&gt;normalization engine&lt;/strong&gt; — one that could take in all that appearance-driven noise and distill it down into clean, predictable, ASCII-safe content &lt;em&gt;without breaking intent&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A left or right smart quote? Normalized into &lt;code&gt;"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An en-dash or em-dash? Flattened into a &lt;code&gt;-&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No semantic loss. Just clarity, restored.&lt;/p&gt;

&lt;p&gt;This wasn’t a one-off patch anymore — it was shaping up to be a reliable bridge between messy, over-encoded text and what a compiler, parser, or linter actually expects.&lt;/p&gt;

&lt;p&gt;That’s when we knew: we weren’t just solving &lt;em&gt;our&lt;/em&gt; problem.&lt;br&gt;&lt;br&gt;
We were solving a growing, urgent problem for &lt;em&gt;everyone&lt;/em&gt; — and doing it fast. —&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Smarter, Tougher Tool
&lt;/h2&gt;

&lt;p&gt;The first phase was to make a basic pipe: read in a file or a stream, scrub out the bad Unicode, normalize smart punctuation, and write a clean file.&lt;/p&gt;

&lt;p&gt;At one point, we considered doing it with pure &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, or some bash wizardry. But once you start needing context-aware replacements — like turning a left quote &lt;em&gt;and&lt;/em&gt; a right quote into a single plain ASCII quote — those tools hit a wall fast.&lt;/p&gt;

&lt;p&gt;Python was the right hammer for this nail.&lt;/p&gt;

&lt;p&gt;We kept the script lightweight.&lt;br&gt;&lt;br&gt;
No crazy dependencies. Just the standard &lt;code&gt;argparse&lt;/code&gt;, &lt;code&gt;re&lt;/code&gt;, a tiny bit of filesystem handling, and the excellent &lt;code&gt;unidecode&lt;/code&gt; library to fill in the heavy lifting.&lt;/p&gt;

&lt;p&gt;After a few iterations — and a lot of piping weird Unicode test blobs through it — the core script was done. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Normalized all smart quotes and dashes&lt;/li&gt;
&lt;li&gt;Stripped hidden Unicode like zero-width spaces and BOMs&lt;/li&gt;
&lt;li&gt;Worked on any file or STDIN&lt;/li&gt;
&lt;li&gt;Wrote clean &lt;code&gt;.clean.txt&lt;/code&gt; versions of files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple. Fast. Solid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shortcutting Into the Future
&lt;/h2&gt;

&lt;p&gt;Now, getting the command-line tool working was great —&lt;br&gt;&lt;br&gt;
&lt;strong&gt;but how do you make it truly frictionless for users?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enter macOS &lt;strong&gt;Shortcuts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This was an unexpected turn. I hadn’t seriously touched Shortcuts before — not since the old Automator days.&lt;br&gt;&lt;br&gt;
But digging into it, I realized Shortcuts could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger from the Finder right-click menu&lt;/li&gt;
&lt;li&gt;Pass selected files as arguments&lt;/li&gt;
&lt;li&gt;Run shell scripts in the background without opening a terminal window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It sounded perfect… and it almost was.&lt;br&gt;&lt;br&gt;
Shortcuts is powerful, but getting it to correctly invoke a bash login shell, preserve the environment, and pass file arguments properly took some serious trial and error.&lt;/p&gt;

&lt;p&gt;We had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Force Shortcuts to launch &lt;code&gt;bash -l -c&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Source the &lt;code&gt;.bashrc&lt;/code&gt; to set up the Conda Python environment&lt;/li&gt;
&lt;li&gt;Handle quoting and argument expansion carefully so multiple files could be passed cleanly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no real documentation on this.&lt;br&gt;&lt;br&gt;
You either figure it out or you don’t.&lt;/p&gt;

&lt;p&gt;But when it finally worked — being able to select a bunch of files in Finder, right-click, and instantly strip all Unicode quirks without even touching the Terminal — &lt;strong&gt;that was magic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It felt like something that belonged in macOS all along.&lt;/p&gt;

</description>
      <category>unicodefix</category>
      <category>unicode</category>
      <category>python</category>
      <category>devstory</category>
    </item>
    <item>
      <title>Remote Debugger With VSCode and Its Derivatives</title>
      <dc:creator>M S</dc:creator>
      <pubDate>Tue, 08 Apr 2025 22:30:00 +0000</pubDate>
      <link>https://dev.to/unixwzrd/remote-debugger-with-vscode-and-its-derivatives-2fg1</link>
      <guid>https://dev.to/unixwzrd/remote-debugger-with-vscode-and-its-derivatives-2fg1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0ziws4es7dz5zt87rzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0ziws4es7dz5zt87rzi.png" alt="Vibing on the Remote – Debugging Python Remotely" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Debug Remotely with VSCode
&lt;/h2&gt;

&lt;p&gt;Recently, someone asked how to connect to a remote process and debug it. If you’re using VSCode—or any of its forks such as Cursor or Windsurf—the following method can save you hours of troubleshooting compared to relying on log files or print statements. A proper debugger lets you inspect variables, step through code, and quickly identify issues. Here’s how I set up remote debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Setting up remote debugging with VSCode is surprisingly simple and can often be done in just a few minutes. I encapsulated the necessary code into a small Python module that you can import into your projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Launch Configuration
&lt;/h3&gt;

&lt;p&gt;First, configure your &lt;code&gt;launch.json&lt;/code&gt; in VSCode with the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    {
        "name": "Python: Attach to Process",
        "type": "debugpy",
        "request": "attach",
        "connect": {
            "host": "localhost",
            "port": 5678
        },
        "pathMappings": [
            {
                "localRoot": "${workspaceFolder}",
                "remoteRoot": "."
            }
        ]
    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells VSCode to attach to a debug server running on port 5678. The pathMappings field ensures that file paths on your remote system map correctly to your local workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Debug Module
&lt;/h3&gt;

&lt;p&gt;Next, create a module (for example, debug_my.py) with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    import debugpy
    from modules.logging_colors import logger

    def remote_debugger_activate():
        """
        Starts the debugpy server. In a real application, ensure this is secured properly.
        """
        # Listen on all interfaces (0.0.0.0); in production, restrict this if possible.
        debugpy.listen(('0.0.0.0', 5678))
        logger.critical("Debugging enabled. Waiting for debugger to attach...")
        debugpy.wait_for_client() # The process will block here until a debugger attaches.
    logger.critical("Debugger attached.")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup your code to start the debugger
&lt;/h3&gt;

&lt;p&gt;Then, in your main Python application, import and call the function where you need to start remote debugging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from debug_my import remote_debugger_activate

# ... your code ...

if args.remote_debug:
    remote_debugger_activate()

# ... rest of your code ...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running the Debugger
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Start your Python application on the remote host (or locally under a different user).&lt;/li&gt;
&lt;li&gt;In VSCode, go to the “Run and Debug” view and select your “Python: Attach to Process” configuration.&lt;/li&gt;
&lt;li&gt;Press the run button in VSCode.&lt;/li&gt;
&lt;li&gt;The remote process will block at debugpy.wait_for_client() until VSCode attaches.&lt;/li&gt;
&lt;li&gt;Once attached, your code continues execution, and you can begin interactive debugging.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;Keep in mind that exposing a debug server can be a significant security risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restrict Network Access: In a secure environment, bind the debug server only to localhost or use SSH tunneling.&lt;/li&gt;
&lt;li&gt;Disable Debugging When Not Needed: Always disable remote debugging when it’s not actively required for troubleshooting.&lt;/li&gt;
&lt;li&gt;Use a Non-Default Port: If necessary, choose a port that is not commonly targeted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Troubleshooting Tips&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Port Conflicts: Verify that port 5678 is available or change it if necessary.&lt;/li&gt;
&lt;li&gt;Connectivity Issues: Ensure your remote machine allows incoming connections on the chosen port.&lt;/li&gt;
&lt;li&gt;Log Verbosity: Increase your debugger or application log level for more detailed diagnostics if debugging fails to attach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Remote Debugging?
&lt;/h2&gt;

&lt;p&gt;Remote debugging provides an interactive, real-time view into your application’s state. Rather than sifting through log files or inserting temporary print statements, a debugger lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step through your code.&lt;/li&gt;
&lt;li&gt;Inspect variables.&lt;/li&gt;
&lt;li&gt;Evaluate expressions on the fly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This capability can significantly speed up bug resolution and reduce downtime.&lt;/p&gt;

&lt;p&gt;Further Resources&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/debugpy" rel="noopener noreferrer"&gt;Debugpy Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/remote/remote-overview" rel="noopener noreferrer"&gt;VSCode Remote Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this guide helps you set up a more efficient and effective remote debugging workflow using VSCode or its variants. Happy debugging!&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Information
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Security Considerations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remote debugging can be a security risk if left enabled in production. You might add a short section on securing the debug server, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restrict Network Access: Mention that in a production setting you should bind the debug server to a specific interface or use firewall rules so that only trusted hosts can connect.&lt;/li&gt;
&lt;li&gt;Use Authentication (if available): Debugpy and similar tools may provide options for authentication or you can tunnel the debug connection over SSH. Explain briefly how to do that, for example, by creating an SSH tunnel:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ssh -L 5678:localhost:5678 user@remote_host

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Disable Debugging When Not Needed: Emphasize that remote debugging should only be enabled when needed for troubleshooting and then promptly disabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;More Detailed Explanation of pathMappings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Many users might not be familiar with pathMappings in the launch.json. You could explain how localRoot and remoteRoot work—i.e. that they help map the file system structure between the remote host and your local development environment, ensuring breakpoints are placed in the correct files.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Troubleshooting Tips&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add a brief section that covers common pitfalls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Port Conflicts: If the specified port (5678 in your example) is in use by another process, mention that users should either free that port or choose a different one.&lt;/li&gt;
&lt;li&gt;Connection Timeouts: If the debugger fails to attach, advise readers to verify that the remote machine can reach the debug server (e.g. by checking connectivity or firewall settings).&lt;/li&gt;
&lt;li&gt;Log Verbosity: Explain that increasing the debug level (using your -d option) might provide helpful logs if something goes wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Benefits of Remote Debugging&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You might add a paragraph or two about why remote debugging is so valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced Downtime: Instead of relying on print statements, remote debugging allows interactive inspection of variables and flow control, saving significant time.&lt;/li&gt;
&lt;li&gt;Enhanced Productivity: Developers can step through code in real time, even on remote servers, which can be crucial when dealing with production issues or complex distributed systems.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>coding</category>
      <category>ai</category>
      <category>blog</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Submitted (Again) to the Apple App Store</title>
      <dc:creator>M S</dc:creator>
      <pubDate>Thu, 20 Mar 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/unixwzrd/submitted-again-to-the-apple-app-store-kl</link>
      <guid>https://dev.to/unixwzrd/submitted-again-to-the-apple-app-store-kl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnu0nrbb61a8kq0w4hkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnu0nrbb61a8kq0w4hkx.png" alt="App Logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UPDATE: &lt;a href="https://apps.apple.com/us/app/loggpt/id6743342693" rel="noopener noreferrer"&gt;LogGPT Available Now on the Apple App Store Now!&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I’ve finally got LogGPT approved by Apple and it is now available on the App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Long Road to Resubmission&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After what feels like an eternity, I’ve &lt;strong&gt;finally&lt;/strong&gt; resubmitted the Safari extension to the Apple App Store. If you’ve ever dealt with Apple’s review process, you know the frustration that comes with seemingly arbitrary rejections. And yes, that happened to me.&lt;/p&gt;

&lt;p&gt;Initially, my app was rejected because the screenshot &lt;strong&gt;looked too much like ChatGPT&lt;/strong&gt;. Well… yeah, because it’s a Safari extension for ChatGPT! The extension simply lets you &lt;strong&gt;download your ChatGPT conversation history&lt;/strong&gt; as a JSON file. Nothing more, nothing less.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Fixing the Issues &amp;amp; Jumping Through Hoops&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Getting this app back into Apple’s review queue was not straightforward. Here’s a &lt;strong&gt;quick summary&lt;/strong&gt; of the madness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name Change&lt;/strong&gt; : The original name was identical to an existing &lt;strong&gt;open-source MIT-licensed project&lt;/strong&gt; that provides a similar extension for Firefox and Chrome. Even though there was no Safari version, I decided to change the name to avoid confusion and conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Icon Issue&lt;/strong&gt; : Apple rejected my submission because the icon &lt;strong&gt;looked too much like ChatGPT’s branding&lt;/strong&gt; and was used by other apps. I had to create a new icon to meet their guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Policy &amp;amp; Website Updates&lt;/strong&gt; : Since I changed the app’s name, I also had to &lt;strong&gt;update my privacy policy and make website changes&lt;/strong&gt; to reflect the new branding. More work I wasn’t expecting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Apple Submission Hurdles&lt;/strong&gt; : Apple, true to its Steve Jobs-era philosophy of always having &lt;strong&gt;“one more thing”&lt;/strong&gt; , kept introducing additional steps I had to complete. Just when I thought I was done, they added another requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New &lt;code&gt;Info.plist&lt;/code&gt; Property for Encryption&lt;/strong&gt; : Apple now requires a new &lt;strong&gt;data encryption property&lt;/strong&gt; in &lt;code&gt;Info.plist&lt;/code&gt;. I had to manually add it to comply with their updated security policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chinese App Store Removal&lt;/strong&gt; : Since &lt;strong&gt;ChatGPT is not allowed in China&lt;/strong&gt; , I had to &lt;strong&gt;remove the app from the Chinese App Store&lt;/strong&gt; entirely. While users there could still purchase it, it wouldn’t work anyway due to ChatGPT restrictions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regions Affected&lt;/strong&gt; : I assume that &lt;strong&gt;Hong Kong and Shanghai&lt;/strong&gt; are also included in this restriction since they are part of China, though I wouldn’t be surprised if an alternative ChatGPT-like service exists that the extension could work with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Submission &amp;amp; Price&lt;/strong&gt; : After fixing these issues, I resubmitted the app with a price of &lt;strong&gt;$1.99&lt;/strong&gt; —mostly to help offset the annual &lt;strong&gt;Apple Developer Tax&lt;/strong&gt; ($99/year).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What This Extension Does&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To reiterate, this is a &lt;strong&gt;simple, no-nonsense Safari extension&lt;/strong&gt; that lets you &lt;strong&gt;export your ChatGPT conversations to JSON&lt;/strong&gt;. No ads, no tracking—just a clean way to download your chat logs for archival or content reuse. The file is saved in your &lt;strong&gt;Downloads folder&lt;/strong&gt; using the conversation’s title from OpenAI.&lt;/p&gt;

&lt;p&gt;I personally use this extension for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Printing chat logs for reference.&lt;/li&gt;
&lt;li&gt;Extracting useful responses and formatting them into Markdown.&lt;/li&gt;
&lt;li&gt;Archiving conversations for future use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Splitting&lt;/strong&gt; exported files and uploading them into a new ChatGPT session to &lt;strong&gt;continue conversations seamlessly&lt;/strong&gt; (I’ll be writing more about that technique soon).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim3u54g4dfpqh852xvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim3u54g4dfpqh852xvw.png" alt="App Screenshot" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Used Just Today for AI Context Transfer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An unexpected but incredibly useful scenario happened just this morning: we hit the &lt;strong&gt;maximum conversation length&lt;/strong&gt; in ChatGPT. Instead of losing our discussion, we used this extension to &lt;strong&gt;export the conversation to JSON&lt;/strong&gt; , split it into Markdown, and reload it into a fresh session— &lt;strong&gt;seamlessly continuing&lt;/strong&gt; without missing a beat. This proves how useful it is for those working with AI over long discussions, ensuring no context is lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Extra Tools for Command Line Users&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re comfortable with the command line, check out my &lt;a href="https://github.com/unixwzrd/venvutil" rel="noopener noreferrer"&gt;VenvUtil&lt;/a&gt; project. It includes tools to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert exported JSON files into &lt;strong&gt;HTML or Markdown&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Format and clean up conversations for &lt;strong&gt;printing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Make archiving and retrieval &lt;strong&gt;easier&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feeling Adventurous?
&lt;/h2&gt;

&lt;p&gt;If you want to build it yourself, you may download the source code as well as a pre-compiled binary of the app on my &lt;a href="https://github.com/unixwzrd/LogGPT" rel="noopener noreferrer"&gt;GitHub Repository page&lt;/a&gt;. There is a release there as well you may download and install it on your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Support My Work&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This extension is priced at &lt;strong&gt;$1.99&lt;/strong&gt; , but if you’d like to support me further, you can do so here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://patreon.com/unixwzrd" rel="noopener noreferrer"&gt;Patreon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ko-fi.com/unixwzrd" rel="noopener noreferrer"&gt;Ko-Fi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has been an exhausting process, and I’m just glad to finally have it back in Apple’s queue. Fingers crossed for a smooth approval this time!&lt;/p&gt;

&lt;p&gt;If you are looking fro someone to help you with a project, I am available for hire. I have a wide range of skills and can be a great asset to your team. My specialties are Unix/Linux/macOS system and database administration, automation, and application development and am rather adept with Python, Bash, and a variety of other tools.&lt;/p&gt;

</description>
      <category>loggpt</category>
      <category>update</category>
      <category>appleappstore</category>
      <category>resubmission</category>
    </item>
    <item>
      <title>RE: Submitted (Again) to the Apple App Store</title>
      <dc:creator>M S</dc:creator>
      <pubDate>Thu, 20 Mar 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/unixwzrd/re-submitted-again-to-the-apple-app-store-54c0</link>
      <guid>https://dev.to/unixwzrd/re-submitted-again-to-the-apple-app-store-54c0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnu0nrbb61a8kq0w4hkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnu0nrbb61a8kq0w4hkx.png" alt="App Logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now available in the &lt;a href="https://apps.apple.com/us/app/loggpt/id6743342693?mt=12" rel="noopener noreferrer"&gt;Apple AppStore - LogGPT&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Long Road to Resubmission&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After what feels like an eternity, I’ve &lt;strong&gt;finally&lt;/strong&gt; resubmitted the Safari extension to the Apple App Store. If you’ve ever dealt with Apple’s review process, you know the frustration that comes with seemingly arbitrary rejections. And yes, that happened to me.&lt;/p&gt;

&lt;p&gt;Initially, my app was rejected because the screenshot &lt;strong&gt;looked too much like ChatGPT&lt;/strong&gt;. Well… yeah, because it’s a Safari extension for ChatGPT! The extension simply lets you &lt;strong&gt;download your ChatGPT conversation history&lt;/strong&gt; as a JSON file. Nothing more, nothing less.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Fixing the Issues &amp;amp; Jumping Through Hoops&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Getting this app back into Apple’s review queue was not straightforward. Here’s a &lt;strong&gt;quick summary&lt;/strong&gt; of the madness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name Change&lt;/strong&gt; : The original name was identical to an existing &lt;strong&gt;open-source MIT-licensed project&lt;/strong&gt; that provides a similar extension for Firefox and Chrome. Even though there was no Safari version, I decided to change the name to avoid confusion and conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Icon Issue&lt;/strong&gt; : Apple rejected my submission because the icon &lt;strong&gt;looked too much like ChatGPT’s branding&lt;/strong&gt; and was used by other apps. I had to create a new icon to meet their guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Policy &amp;amp; Website Updates&lt;/strong&gt; : Since I changed the app’s name, I also had to &lt;strong&gt;update my privacy policy and make website changes&lt;/strong&gt; to reflect the new branding. More work I wasn’t expecting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Apple Submission Hurdles&lt;/strong&gt; : Apple, true to its Steve Jobs-era philosophy of always having &lt;strong&gt;“one more thing”&lt;/strong&gt; , kept introducing additional steps I had to complete. Just when I thought I was done, they added another requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New &lt;code&gt;Info.plist&lt;/code&gt; Property for Encryption&lt;/strong&gt; : Apple now requires a new &lt;strong&gt;data encryption property&lt;/strong&gt; in &lt;code&gt;Info.plist&lt;/code&gt;. I had to manually add it to comply with their updated security policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chinese App Store Removal&lt;/strong&gt; : Since &lt;strong&gt;ChatGPT is not allowed in China&lt;/strong&gt; , I had to &lt;strong&gt;remove the app from the Chinese App Store&lt;/strong&gt; entirely. While users there could still purchase it, it wouldn’t work anyway due to ChatGPT restrictions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regions Affected&lt;/strong&gt; : I assume that &lt;strong&gt;Hong Kong and Shanghai&lt;/strong&gt; are also included in this restriction since they are part of China, though I wouldn’t be surprised if an alternative ChatGPT-like service exists that the extension could work with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Submission &amp;amp; Price&lt;/strong&gt; : After fixing these issues, I resubmitted the app with a price of &lt;strong&gt;$1.99&lt;/strong&gt; —mostly to help offset the annual &lt;strong&gt;Apple Developer Tax&lt;/strong&gt; ($99/year).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What This Extension Does&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To reiterate, this is a &lt;strong&gt;simple, no-nonsense Safari extension&lt;/strong&gt; that lets you &lt;strong&gt;export your ChatGPT conversations to JSON&lt;/strong&gt;. No ads, no tracking—just a clean way to download your chat logs for archival or content reuse. The file is saved in your &lt;strong&gt;Downloads folder&lt;/strong&gt; using the conversation’s title from OpenAI.&lt;/p&gt;

&lt;p&gt;I personally use this extension for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Printing chat logs for reference.&lt;/li&gt;
&lt;li&gt;Extracting useful responses and formatting them into Markdown.&lt;/li&gt;
&lt;li&gt;Archiving conversations for future use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Splitting&lt;/strong&gt; exported files and uploading them into a new ChatGPT session to &lt;strong&gt;continue conversations seamlessly&lt;/strong&gt; (I’ll be writing more about that technique soon).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim3u54g4dfpqh852xvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faim3u54g4dfpqh852xvw.png" alt="App Screenshot" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Used Just Today for AI Context Transfer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An unexpected but incredibly useful scenario happened just this morning: we hit the &lt;strong&gt;maximum conversation length&lt;/strong&gt; in ChatGPT. Instead of losing our discussion, we used this extension to &lt;strong&gt;export the conversation to JSON&lt;/strong&gt; , split it into Markdown, and reload it into a fresh session— &lt;strong&gt;seamlessly continuing&lt;/strong&gt; without missing a beat. This proves how useful it is for those working with AI over long discussions, ensuring no context is lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Extra Tools for Command Line Users&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re comfortable with the command line, check out my &lt;a href="https://github.com/unixwzrd/venvutil" rel="noopener noreferrer"&gt;VenvUtil&lt;/a&gt; project. It includes tools to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert exported JSON files into &lt;strong&gt;HTML or Markdown&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Format and clean up conversations for &lt;strong&gt;printing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Make archiving and retrieval &lt;strong&gt;easier&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feeling Adventurous?
&lt;/h2&gt;

&lt;p&gt;If you want to build it yourself, you may download the source code as well as a pre-compiled binary of the app on my &lt;a href="https://github.com/unixwzrd/chatgpt-chatlog-export" rel="noopener noreferrer"&gt;GitHub Repository page&lt;/a&gt;. There is a release there as well you may download and install it on your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Support My Work&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This extension is priced at &lt;strong&gt;$1.99&lt;/strong&gt; , but if you’d like to support me further, you can do so here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://patreon.com/unixwzrd" rel="noopener noreferrer"&gt;Patreon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ko-fi.com/unixwzrd" rel="noopener noreferrer"&gt;Ko-Fi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has been an exhausting process, and I’m just glad to finally have it back in Apple’s queue. Fingers crossed for a smooth approval this time!&lt;/p&gt;

&lt;p&gt;If you are looking fro someone to help you with a project, I am available for hire. I have a wide range of skills and can be a great asset to your team. My specialties are Unix/Linux/macOS system and database administration, automation, and application development and am rather adept with Python, Bash, and a variety of other tools.&lt;/p&gt;

</description>
      <category>chatgptchatlogexport</category>
      <category>update</category>
      <category>appleappstore</category>
      <category>resubmission</category>
    </item>
    <item>
      <title>Announcing TorchDevice 0.0.5 Beta – Transparent Hardware Redirection for PyTorch</title>
      <dc:creator>M S</dc:creator>
      <pubDate>Wed, 05 Mar 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/unixwzrd/announcing-torchdevice-005-beta-transparent-hardware-redirection-for-pytorch-1m6f</link>
      <guid>https://dev.to/unixwzrd/announcing-torchdevice-005-beta-transparent-hardware-redirection-for-pytorch-1m6f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6m3mo2nhvuz0al295nf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6m3mo2nhvuz0al295nf.png" alt="TorchDevice" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Version soon to be released&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the older version in main, bug there will soon be a refactored and well tested version of this soon.&lt;/p&gt;

&lt;p&gt;We’re pleased to announce the release of &lt;strong&gt;TorchDevice 0.0.5 Beta&lt;/strong&gt; , a significant milestone in simplifying hardware compatibility for PyTorch applications. This release introduces robust enhancements, thorough testing, and a powerful new &lt;strong&gt;CPU override feature&lt;/strong&gt; to ensure seamless integration across CUDA and Apple Silicon (Metal) hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TorchDevice?
&lt;/h2&gt;

&lt;p&gt;PyTorch is extensively optimized for CUDA hardware. However, developers using Apple Silicon devices face compatibility challenges due to PyTorch’s CUDA-centric assumptions. &lt;strong&gt;TorchDevice&lt;/strong&gt; bridges this gap by transparently redirecting PyTorch device calls to the correct backend (CUDA, Metal, or CPU) without needing any manual intervention or code modifications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s New in 0.0.5?
&lt;/h2&gt;

&lt;p&gt;Apart from improving testing, more functionality is now working in this version. Compatibility with Streams, Events, and Context management.&lt;/p&gt;

&lt;h3&gt;
  
  
  CPU Override Feature
&lt;/h3&gt;

&lt;p&gt;The highlight of this release is the new &lt;strong&gt;CPU override functionality&lt;/strong&gt; , enabling developers to explicitly force CPU usage, invaluable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debugging and testing&lt;/strong&gt; GPU-dependent code on a CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ensuring consistent behavior&lt;/strong&gt; across various testing environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource management&lt;/strong&gt; by reserving GPU resources for specific tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Activation is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import torch
import TorchDevice

# Forces CPU usage universally
device = torch.device('cpu:-1')

# Operations below explicitly use CPU despite CUDA or MPS availability
tensor = torch.randn(5, 5) # CPU-based tensor
model = torch.nn.Linear(10, 5).to('cuda') # Redirected to CPU automatically

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expanded and Improved Testing&lt;/p&gt;

&lt;p&gt;TorchDevice 0.0.5 is extensively tested using HuggingFace Transformers, successfully passing most test scenarios and ensuring robust compatibility with widely-used models. Further testing and refinements continue, enhancing stability and coverage.&lt;/p&gt;

&lt;p&gt;Comprehensive Documentation &amp;amp; Examples&lt;/p&gt;

&lt;p&gt;We’ve expanded the documentation to clearly guide developers through installation, configuration, and troubleshooting, making adoption effortless.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detailed README&lt;/li&gt;
&lt;li&gt;Practical usage examples and tutorials&lt;/li&gt;
&lt;li&gt;Open community support and contributions via GitHub issues and pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s Next?&lt;/p&gt;

&lt;p&gt;Our future plans include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced runtime flexibility for CPU overrides&lt;/li&gt;
&lt;li&gt;Granular control over device selection per operation&lt;/li&gt;
&lt;li&gt;Performance optimizations for mixed-device workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Community and Support&lt;/p&gt;

&lt;p&gt;TorchDevice is actively developed and maintained, and your support helps us accelerate improvements and features. If you or your organization finds value in TorchDevice, consider supporting development through sponsorship or donations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help Support Our Projects
&lt;/h2&gt;

&lt;p&gt;Checkout my other projects at my site&lt;br&gt;
&lt;a href="https://unnixwzrd.ai" rel="noopener noreferrer"&gt;Distributed Thinking Systems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find this useful help support my work;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://patreon.com/unixwzrd" rel="noopener noreferrer"&gt;Patreon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ko-fi.com/unixwzrd" rel="noopener noreferrer"&gt;Ko-Fi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your feedback drives our roadmap. Let’s make PyTorch more accessible and efficient for everyone.&lt;/p&gt;

</description>
      <category>torchdevice</category>
      <category>introduction</category>
      <category>overview</category>
    </item>
  </channel>
</rss>
